diff --git a/scripts/dtsBundler.mjs b/scripts/dtsBundler.mjs index ade134287fe..d915a38b56b 100644 --- a/scripts/dtsBundler.mjs +++ b/scripts/dtsBundler.mjs @@ -307,33 +307,61 @@ function symbolsConflict(s1, s2) { */ function verifyMatchingSymbols(decl, isInternal) { ts.visitEachChild(decl, /** @type {(node: ts.Node) => ts.Node} */ function visit(node) { - if (ts.isIdentifier(node) && ts.isPartOfTypeNode(node)) { - if (ts.isQualifiedName(node.parent) && node !== node.parent.left) { - return node; - } - if (ts.isParameter(node.parent) && node === node.parent.name) { - return node; - } - if (ts.isNamedTupleMember(node.parent) && node === node.parent.name) { - return node; - } - - const symbolOfNode = typeChecker.getSymbolAtLocation(node); - if (!symbolOfNode) { - fail(`No symbol for node at ${nodeToLocation(node)}`); - } - const symbolInScope = findInScope(symbolOfNode.name); - if (!symbolInScope) { - if (symbolOfNode.declarations?.every(d => isLocalDeclaration(d) && d.getSourceFile() === decl.getSourceFile()) && !isSelfReference(node, symbolOfNode)) { - // The symbol is a local that needs to be copied into the scope. - scopeStack[scopeStack.length - 1].locals.set(symbolOfNode.name, { symbol: symbolOfNode, writeTarget: isInternal ? WriteTarget.Internal : WriteTarget.Both }); + if (ts.isIdentifier(node)) { + let meaning = ts.SymbolFlags.None; + if (ts.isPartOfTypeNode(node)) { + if (ts.isQualifiedName(node.parent) && node !== node.parent.left) { + return node; } - // We didn't find the symbol in scope at all. Just allow it and we'll fail at test time. - return node; + if (ts.isParameter(node.parent) && node === node.parent.name) { + return node; + } + if (ts.isNamedTupleMember(node.parent) && node === node.parent.name) { + return node; + } + meaning = ts.SymbolFlags.Type; + } + else if (ts.isExpressionWithTypeArguments(node.parent) && + ts.isHeritageClause(node.parent.parent) && + ts.isClassLike(node.parent.parent.parent)) { + meaning = ts.SymbolFlags.Value; } - if (symbolsConflict(symbolOfNode, symbolInScope)) { - fail(`Declaration at ${nodeToLocation(decl)}\n references ${symbolOfNode.name} at ${symbolOfNode.declarations && nodeToLocation(symbolOfNode.declarations[0])},\n but containing scope contains a symbol with the same name declared at ${symbolInScope.declarations && nodeToLocation(symbolInScope.declarations[0])}`); + if (meaning) { + const symbolOfNode = typeChecker.getSymbolAtLocation(node); + if (!symbolOfNode) { + fail(`No symbol for node at ${nodeToLocation(node)}`); + } + const symbolInScope = findInScope(symbolOfNode.name); + if (!symbolInScope) { + /** @type {ts.Declaration[]} */ + const declarations = []; + if (meaning === ts.SymbolFlags.Type && symbolOfNode.declarations) { + declarations.push(...symbolOfNode.declarations); + } + else if (meaning === ts.SymbolFlags.Value && symbolOfNode.valueDeclaration) { + declarations.push(symbolOfNode.valueDeclaration); + } + if (declarations.every(d => isLocalDeclaration(d) && d.getSourceFile() === decl.getSourceFile()) && !isSelfReference(node, symbolOfNode)) { + // The symbol is a local that needs to be copied into the scope. + const locals = scopeStack[scopeStack.length - 1].locals; + if (!locals.has(symbolOfNode.name)) { + locals.set(symbolOfNode.name, { symbol: symbolOfNode, writeTarget: isInternal ? WriteTarget.Internal : WriteTarget.Both }); + if (symbolOfNode.valueDeclaration) { + const statement = getDeclarationStatement(symbolOfNode.valueDeclaration); + if (statement) { + verifyMatchingSymbols(statement, isInternal); + } + } + } + } + // We didn't find the symbol in scope at all. Just allow it and we'll fail at test time. + return node; + } + + if (symbolsConflict(symbolOfNode, symbolInScope)) { + fail(`Declaration at ${nodeToLocation(decl)}\n references ${symbolOfNode.name} at ${symbolOfNode.declarations && nodeToLocation(symbolOfNode.declarations[0])},\n but containing scope contains a symbol with the same name declared at ${symbolInScope.declarations && nodeToLocation(symbolInScope.declarations[0])}`); + } } } @@ -345,9 +373,10 @@ function verifyMatchingSymbols(decl, isInternal) { * @param {ts.Declaration} decl */ function isLocalDeclaration(decl) { - return ts.canHaveModifiers(decl) - && !ts.getModifiers(decl)?.some(m => m.kind === ts.SyntaxKind.ExportKeyword) - && !!getDeclarationStatement(decl); + const statement = getDeclarationStatement(decl); + return !!statement + && ts.canHaveModifiers(statement) + && !ts.getModifiers(statement)?.some(m => m.kind === ts.SyntaxKind.ExportKeyword); } /** @@ -456,7 +485,34 @@ function emitAsNamespace(name, parent, moduleSymbol, needExportModifier) { symbol.declarations?.forEach(decl => { // We already checked that getDeclarationStatement(decl) works for each declaration. const statement = getDeclarationStatement(decl); - writeNode(/** @type {ts.Statement} */ (statement), decl.getSourceFile(), writeTarget); + if (!statement) return; + + if (writeTarget & WriteTarget.Public) { + if (!ts.isInternalDeclaration(statement)) { + const publicStatement = ts.visitEachChild(statement, node => { + // No @internal comments in the public API. + if (ts.isInternalDeclaration(node)) { + return undefined; + } + // TODO: remove after https://github.com/microsoft/TypeScript/pull/58187 is released + if (ts.canHaveModifiers(node)) { + for (const modifier of ts.getModifiers(node) ?? []) { + if (modifier.kind === ts.SyntaxKind.PrivateKeyword) { + removeAllComments(node); + break; + } + } + } + return removeDeclareConstExport(node, /*needExportModifier*/ false); + }, /*context*/ undefined); + writeNode(/** @type {ts.Statement} */ (publicStatement), decl.getSourceFile(), WriteTarget.Public); + } + } + + if (writeTarget & WriteTarget.Internal) { + const updated = ts.visitEachChild(statement, node => removeDeclareConstExport(node, childrenNeedExportModifier), /*context*/ undefined); + writeNode(/** @type {ts.Statement} */ (updated), decl.getSourceFile(), WriteTarget.Internal); + } }); }); diff --git a/src/compiler/_namespaces/ts.ast.ts b/src/compiler/_namespaces/ts.ast.ts index 11cf59bd99d..a94e77582a5 100644 --- a/src/compiler/_namespaces/ts.ast.ts +++ b/src/compiler/_namespaces/ts.ast.ts @@ -1,3 +1,5 @@ +// /** @internal */ +// export * from "../nodes.js"; /** @internal */ export * from "../ast.js"; /** @internal */ diff --git a/src/compiler/_namespaces/ts.ts b/src/compiler/_namespaces/ts.ts index 22938bf674f..a9caabfc724 100644 --- a/src/compiler/_namespaces/ts.ts +++ b/src/compiler/_namespaces/ts.ts @@ -7,6 +7,7 @@ export * from "../semver.js"; export * from "../performanceCore.js"; export * from "../tracing.js"; export * from "../types.js"; +export * from "../ast.js"; export * from "../sys.js"; export * from "../path.js"; export * from "../diagnosticInformationMap.generated.js"; @@ -14,16 +15,20 @@ export * from "../scanner.js"; export * from "../utilitiesPublic.js"; export * from "../utilities.js"; export * from "../factory/parenthesizerRules.js"; +export * from "../factory/astParenthesizerRules.js"; export * from "../factory/nodeConverters.js"; export * from "../factory/nodeFactory.js"; +export * from "../factory/astNodeFactory.js"; export * from "../factory/emitNode.js"; +export * from "../factory/astNodeTests.js"; export * from "../factory/emitHelpers.js"; export * from "../factory/nodeTests.js"; export * from "../factory/nodeChildren.js"; export * from "../factory/utilities.js"; export * from "../factory/utilitiesPublic.js"; -export * from "../forEachChild.js"; export * from "../parser.js"; +export * from "../forEachChild.js"; +export * from "../astForEachChild.js"; export * from "../commandLineParser.js"; export * from "../moduleNameResolver.js"; export * from "../binder.js"; @@ -76,7 +81,3 @@ import * as moduleSpecifiers from "./ts.moduleSpecifiers.js"; export { moduleSpecifiers }; import * as performance from "./ts.performance.js"; export { performance }; -/** @internal */ -import * as ast from "./ts.ast.js"; -/** @internal */ -export { ast }; \ No newline at end of file diff --git a/src/compiler/ast.ts b/src/compiler/ast.ts index 235c237c44a..2352b516968 100644 --- a/src/compiler/ast.ts +++ b/src/compiler/ast.ts @@ -1,104 +1,518 @@ -import { isAstParenthesizedExpression } from "./_namespaces/ts.ast.js"; -import * as ts from "./_namespaces/ts.js"; +/* eslint-disable local/jsdoc-format -- need @internal to work around issue with dtsBundler */ import { __String, + AbstractKeyword, + AccessorDeclaration, + AccessorKeyword, AmdDependency, - AssignmentOperator, - BinaryOperator, + AmpersandAmpersandEqualsToken, + ArrayBindingElement, + ArrayBindingPattern, + ArrayLiteralExpression, + ArrayTypeNode, + ArrowFunction, + AsExpression, + AssertClause, + AssertionKey, + AssertKeyword, + AssertsKeyword, + AsteriskToken, + AsyncKeyword, + AwaitExpression, + AwaitKeyword, + BarBarEqualsToken, + BigIntLiteral, + BinaryExpression, + BinaryOperatorToken, + BindingElement, + BindingName, + BindingPattern, + Block, + BooleanLiteral, + BreakOrContinueStatement, + BreakStatement, + Bundle, + CallChain, + CallChainRoot, + CallExpression, + CallSignatureDeclaration, + CaseBlock, + CaseClause, + CaseKeyword, + CaseOrDefaultClause, + CatchClause, CheckJsDirective, + ClassDeclaration, + ClassElement, + ClassExpression, + ClassLikeDeclaration, + ClassStaticBlockDeclaration, + ColonToken, + CommaListExpression, CommentDirective, - computePositionOfLineAndCharacter, + ComputedPropertyName, + ConciseBody, + ConditionalExpression, + ConditionalTypeNode, + ConfigFileSpecs, + ConstKeyword, + ConstructorDeclaration, + ConstructorTypeNode, + ConstructSignatureDeclaration, containsObjectRestOrSpread, - createMultiMap, - createScanner, + ContinueStatement, Debug, + DebuggerStatement, + Declaration, + DeclarationName, + DeclarationWithTypeParameterChildren, + DeclareKeyword, + Decorator, + DefaultClause, + DefaultKeyword, + DeleteExpression, + DestructuringAssignment, DiagnosticWithLocation, + DoStatement, + DotDotDotToken, + DotToken, + ElementAccessChain, + ElementAccessChainRoot, + ElementAccessExpression, EmitFlags, EmitNode, - emptyArray, + EmptyStatement, + EndOfFileToken, + EntityName, + EntityNameExpression, + EnumDeclaration, + EnumMember, + EqualsGreaterThanToken, + EqualsToken, + ExclamationToken, + ExportAssignment, + ExportDeclaration, + ExportKeyword, + ExportSpecifier, + Expression, + ExpressionStatement, + ExpressionWithTypeArguments, + ExternalModuleReference, + FalseLiteral, FileReference, - find, FlowNode, - forEach, - forEachChild, - getAssignmentDeclarationKind, - getLineAndCharacterOfPosition, - getLineStarts, - getNodeChildren, - getNonAssignedNameOfDeclaration, - getSourceFileOfNode, - getTextOfIdentifierOrLiteral, - getTokenPosOfNode, + ForEachChildNodes, + ForInitializer, + ForInOrOfStatement, + ForInStatement, + ForOfStatement, + ForStatement, + FunctionBody, + FunctionDeclaration, + FunctionExpression, + FunctionOrConstructorTypeNode, + FunctionTypeNode, + GetAccessorDeclaration, + getJSDocTypeTag, getTransformFlagsSubtreeExclusions, + HasChildren, + HasDecorators, + HasJSDoc, + HasLocals, + HasModifiers, + HasName, hasProperty, - hasSyntacticModifier, - hasTabstop, - idText, - isBindingPattern, - isComputedPropertyName, - isJSDocCommentContainingNode, + HeritageClause, + Identifier, + IfStatement, + ImportAttribute, + ImportAttributeName, + ImportAttributes, + ImportClause, + ImportDeclaration, + ImportEqualsDeclaration, + ImportExpression, + ImportSpecifier, + ImportTypeAssertionContainer, + ImportTypeNode, + IndexedAccessTypeNode, + IndexSignatureDeclaration, + InferTypeNode, + InKeyword, + InterfaceDeclaration, + IntersectionTypeNode, + isAstParenthesizedExpression, + IScriptSnapshot, isLogicalOrCoalescingAssignmentOperator, - isNamedExports, - isPrivateIdentifier, - isPropertyAccessExpression, - isPropertyName, - isStringOrNumericLiteralLike, + isParseTreeNode, + IterationStatement, + JSDoc, + JSDocAllType, JSDocArray, + JSDocAugmentsTag, + JSDocAuthorTag, + JSDocCallbackTag, + JSDocClassReference, + JSDocClassTag, + JSDocComment, + JSDocDeprecatedTag, + JSDocEnumTag, + JSDocFunctionType, + JSDocImplementsTag, + JSDocImportTag, + JSDocLink, + JSDocLinkCode, + JSDocLinkPlain, + JSDocMemberName, + JSDocNamepathType, + JSDocNameReference, + JSDocNamespaceBody, + JSDocNamespaceDeclaration, + JSDocNonNullableType, + JSDocNullableType, + JSDocOptionalType, + JSDocOverloadTag, + JSDocOverrideTag, + JSDocParameterTag, + JSDocParsingMode, + JSDocPrivateTag, + JSDocPropertyLikeTag, + JSDocPropertyTag, + JSDocProtectedTag, + JSDocPublicTag, + JSDocReadonlyTag, + JSDocReturnTag, + JSDocSatisfiesTag, + JSDocSeeTag, + JSDocSignature, + JSDocTag, + JSDocTemplateTag, + JSDocText, + JSDocThisTag, + JSDocThrowsTag, + JSDocType, + JSDocTypeAssertion, + JSDocTypedefTag, + JSDocTypeExpression, + JSDocTypeLiteral, + JSDocTypeTag, + JSDocUnknownTag, + JSDocUnknownType, + JSDocVariadicType, + JsonMinusNumericLiteral, + JsonObjectExpression, + JsonObjectExpressionStatement, + JsonSourceFile, + JsxAttribute, + JsxAttributeLike, + JsxAttributeName, + JsxAttributes, + JsxAttributeValue, + JsxChild, + JsxClosingElement, + JsxClosingFragment, + JsxElement, + JsxExpression, + JsxFragment, + JsxNamespacedName, + JsxOpeningElement, + JsxOpeningFragment, + JsxOpeningLikeElement, + JsxSelfClosingElement, + JsxSpreadAttribute, + JsxTagNameExpression, + JsxTagNamePropertyAccess, + JsxText, + KeywordExpression, KeywordSyntaxKind, + KeywordToken, + KeywordTypeNode, + KeywordTypeSyntaxKind, + LabeledStatement, LanguageVariant, - lastOrUndefined, + LeftHandSideExpression, + LiteralExpression, + LiteralLikeNode, + LiteralToken, + LiteralTypeNode, + MappedTypeNode, + MemberExpression, + MemberName, + MetaProperty, + MethodDeclaration, + MethodSignature, + MinusToken, + MissingDeclaration, + Modifier, ModifierFlags, + ModifierLike, ModifierSyntaxKind, modifierToFlag, + ModifierToken, + ModuleBlock, + ModuleBody, + ModuleDeclaration, + ModuleExportName, + ModuleName, + ModuleReference, + NamedDeclaration, + NamedExportBindings, + NamedExports, + NamedImportBindings, + NamedImports, + NamedTupleMember, + NamespaceBody, + NamespaceDeclaration, + NamespaceExport, + NamespaceExportDeclaration, + NamespaceImport, + NewExpression, + Node, + NodeArray, + NodeConstructor, NodeFlags, NodeId, + NonNullChain, + NonNullExpression, + NoSubstitutionTemplateLiteral, + NotEmittedStatement, + NotEmittedTypeElement, + NullLiteral, + NumericLiteral, + ObjectBindingPattern, + ObjectLiteralElement, + ObjectLiteralElementLike, + ObjectLiteralExpression, + ObjectTypeDeclaration, + OmittedExpression, + OptionalChainRoot, + OptionalTypeNode, + OuterExpression, + OuterExpressionKinds, + OutKeyword, + OverrideKeyword, PackageJsonInfo, + ParameterDeclaration, + ParenthesizedExpression, + ParenthesizedTypeNode, + PartiallyEmittedExpression, Path, - positionIsSynthesized, + PatternAmbientModule, + PlusToken, + PostfixUnaryExpression, PostfixUnaryOperator, + PrefixUnaryExpression, PrefixUnaryOperator, + PrimaryExpression, + PrivateIdentifier, + PrivateKeyword, + PropertyAccessChain, + PropertyAccessChainRoot, + PropertyAccessEntityNameExpression, + PropertyAccessExpression, + PropertyAssignment, + PropertyDeclaration, + PropertyName, + PropertyNameLiteral, + PropertySignature, + ProtectedKeyword, + PseudoLiteralToken, + PublicKeyword, PunctuationSyntaxKind, + PunctuationToken, + QualifiedName, + QuestionDotToken, + QuestionQuestionEqualsToken, + QuestionToken, + ReadonlyKeyword, ReadonlyPragmaMap, + RedirectInfo, + RegularExpressionLiteral, ResolutionMode, - Scanner, + RestTypeNode, + ReturnStatement, + SatisfiesExpression, ScriptKind, ScriptTarget, - setNodeChildren, + SemicolonClassElement, + SetAccessorDeclaration, + ShorthandPropertyAssignment, + SignatureDeclaration, + SourceFile, + SpreadAssignment, + SpreadElement, + Statement, + StaticKeyword, + StringLiteral, + StringLiteralLike, + StringLiteralLikeNode, + SuperExpression, + SwitchStatement, Symbol, SymbolTable, SyntaxKind, + SyntaxList, + SyntheticExpression, + SyntheticReferenceExpression, + TaggedTemplateExpression, + TemplateExpression, + TemplateHead, + TemplateLiteral, + TemplateLiteralLikeNode, + TemplateLiteralToken, + TemplateLiteralTypeNode, + TemplateLiteralTypeSpan, + TemplateMiddle, + TemplateSpan, + TemplateTail, + ThisExpression, + ThisTypeNode, + ThrowStatement, + Token, TokenFlags, TokenSyntaxKind, TransformFlags, + TrueLiteral, + TryStatement, + TupleTypeNode, Type, + TypeAliasDeclaration, + TypeAssertionExpression, + TypeElement, + TypeLiteralNode, + TypeNode, TypeNodeSyntaxKind, - updateSourceFile, + TypeOfExpression, + TypeOperatorNode, + TypeParameterDeclaration, + TypePredicateNode, + TypeQueryNode, + TypeReferenceNode, + UnaryExpression, + UnionOrIntersectionTypeNode, + UnionTypeNode, + UpdateExpression, + VariableDeclaration, + VariableDeclarationList, + VariableStatement, + VoidExpression, + WhileStatement, + WithStatement, + YieldExpression } from "./_namespaces/ts.js"; -/** @internal */ -export type AstNextContainer = AstHasLocals; - -/** @internal */ -export class AstNodeId { - id: NodeId = 0; +// dprint-ignore +class AstNodeArrayExtraFields { + /** @internal */ nodes: NodeArray | undefined = undefined; + /** @internal */ hasTrailingComma: boolean = false; + /** @internal */ transformFlags: TransformFlags = (-1 as TransformFlags); // Flags for transforms + /** @internal */ __pos: number = -1; + /** @internal */ __end: number = -1; } -// TODO: This shouldn't be exported but not exporting breaks dtsBundler -/** @internal */ -export class AstNodeExtraFields { - id: AstNodeId = new AstNodeId(); - original: AstNode | undefined = undefined; - emitNode: EmitNode | undefined = undefined; - modifierFlagsCache: ts.ModifierFlags = ModifierFlags.None; - transformFlags: TransformFlags = (-1 as TransformFlags); - __pos: number = -1; - __end: number = -1; +// dprint-ignore +export class AstNodeArray { + readonly items: readonly N[] = undefined!; + + pos = -1; + end = -1; + + private _extra: AstNodeArrayExtraFields | undefined = undefined; + + constructor(items: readonly N[], hasTrailingComma = false) { + // catch any excess properties assigned to the NodeArray + Object.preventExtensions(this); + + this.items = items; + this.hasTrailingComma = hasTrailingComma; + } + + private get extra(): AstNodeArrayExtraFields { + return this._extra ??= new AstNodeArrayExtraFields(); + } + + get nodes(): NodeArray { + return this.extra.nodes ??= new NodeArray(this); + } + get hasTrailingComma(): boolean { + return this._extra?.hasTrailingComma ?? false; + } + set hasTrailingComma(value) { + if (value !== this.hasTrailingComma) { + this.extra.hasTrailingComma = value; + } + } + + /** @internal */ get transformFlags(): TransformFlags { + const extra = this.extra; + if (extra.transformFlags === (-1 as TransformFlags)) { + let transformFlags = TransformFlags.None; + for (const child of this.items) { + transformFlags |= propagateChildFlags(child); + } + extra.transformFlags = transformFlags; + } + return extra.transformFlags; + } + /** @internal */ set transformFlags(value) { + this.extra.transformFlags = value; + } + + /** @internal */ get __pos(): number | undefined { // eslint-disable-line @typescript-eslint/naming-convention + const pos = this._extra?.__pos; + return pos === -1 ? undefined : pos; + } + /** @internal */ set __pos(value) { // eslint-disable-line @typescript-eslint/naming-convention + if (value === undefined) { + if (this._extra !== undefined) { + this._extra.__pos = -1; + } + } + else { + if (value < 0) throw new RangeError(); + this.extra.__pos = value; + } + } + /** @internal */ get __end(): number | undefined { // eslint-disable-line @typescript-eslint/naming-convention + const end = this._extra?.__end; + return end === -1 ? undefined : end; + } + /** @internal */ set __end(value) { // eslint-disable-line @typescript-eslint/naming-convention + if (value === undefined) { + if (this._extra !== undefined) { + this._extra.__end = -1; + } + } + else { + if (value < 0) throw new RangeError(); + this.extra.__end = value; + } + } +} + +/** + * Holds the id for a `Node`. The id is held by another object to support + * source file redirection. + */ +class AstNodeId { + /** @internal */ id: NodeId = 0; // Unique id (used to look up NodeLinks) +} + +// dprint-ignore +class AstNodeExtraFields { + /** @internal */ id: AstNodeId = new AstNodeId(); + /** @internal */ original: AstNode | undefined = undefined; // The original node if this is an updated node. + /** @internal */ emitNode: EmitNode | undefined = undefined; // Associated EmitNode (initialized by transforms) + /** @internal */ modifierFlagsCache: ModifierFlags = ModifierFlags.None; + /** @internal */ transformFlags: TransformFlags = (-1 as TransformFlags); // Flags for transforms + /** @internal */ __pos: number = -1; + /** @internal */ __end: number = -1; } let astNodeCloneCore: (node: AstNode) => AstNode; let astNodeShadowCore: (node: AstNode) => AstNode; -/** @internal */ +// dprint-ignore export class AstNode = Node> { static { astNodeCloneCore = node => node.cloneCore(); @@ -112,12 +526,12 @@ export class AstNode = Node> | undefined = undefined; + parent: AstNode> | undefined = undefined; // Parent node (initialized by binding) flags: NodeFlags = NodeFlags.None; pos = -1; end = -1; - constructor(kind: N["kind"], data: N["data"], nodeConstructor: NodeConstructor, flags: ts.NodeFlags = NodeFlags.None) { + constructor(kind: N["kind"], data: N["data"], nodeConstructor: NodeConstructor, flags: NodeFlags = NodeFlags.None) { // catch any excess properties assigned to the Node Object.preventExtensions(this); @@ -131,45 +545,27 @@ export class AstNode = Node> | undefined { - return this._extra?.original; - } - set original(value) { - this.extra.original = value; - } - get emitNode(): ts.EmitNode | undefined { - return this._extra?.emitNode; - } - set emitNode(value) { - this.extra.emitNode = value; - } - get transformFlags(): ts.TransformFlags { + /** @internal */ get id(): number { return this._extra?.id.id ?? 0; } + /** @internal */ set id(value) { this.extra.id.id = value; } + /** @internal */ get original(): AstNode> | undefined { return this._extra?.original; } + /** @internal */ set original(value) { this.extra.original = value; } + /** @internal */ get emitNode(): EmitNode | undefined { return this._extra?.emitNode; } + /** @internal */ set emitNode(value) { this.extra.emitNode = value; } + /** @internal */ get transformFlags(): TransformFlags { const extra = this.extra; if (extra.transformFlags === (-1 as TransformFlags)) { extra.transformFlags = this.data.computeTransformFlags(this); } return extra.transformFlags; } - set transformFlags(value) { - this.extra.transformFlags = value; - } - get modifierFlagsCache(): ts.ModifierFlags { - return this._extra?.modifierFlagsCache ?? ModifierFlags.None; - } - set modifierFlagsCache(value) { - this.extra.modifierFlagsCache = value; - } - get __pos(): number | undefined { // eslint-disable-line @typescript-eslint/naming-convention + /** @internal */ set transformFlags(value) { this.extra.transformFlags = value; } + /** @internal */ get modifierFlagsCache(): ModifierFlags { return this._extra?.modifierFlagsCache ?? ModifierFlags.None; } + /** @internal */ set modifierFlagsCache(value) { this.extra.modifierFlagsCache = value; } + /** @internal */ get __pos(): number | undefined { // eslint-disable-line @typescript-eslint/naming-convention const pos = this._extra?.__pos; return pos === -1 ? undefined : pos; } - set __pos(value) { // eslint-disable-line @typescript-eslint/naming-convention + /** @internal */ set __pos(value) { // eslint-disable-line @typescript-eslint/naming-convention if (value === undefined) { if (this._extra !== undefined) { this._extra.__pos = -1; @@ -180,11 +576,11 @@ export class AstNode = Node = Node = Node = Node = Node = Node = Node = Node = Node = N extends unknown ? AstNode : never; +export type AstNodeOneOf = N extends unknown ? AstNode : never; -/** @internal */ +// dprint-ignore export class AstData { - computeTransformFlags(node: AstNode): TransformFlags { + /** @internal */ computeTransformFlags(node: AstNode): TransformFlags { void node; return TransformFlags.None; } /** * Controls cloning the provided node. + * @internal */ cloneNode(node: AstNode): AstNode { return astNodeCloneCore(node); @@ -936,6 +1337,7 @@ export class AstData { /** * Creates a shallow, member-wise clone of this data object. + * @internal */ clone(): AstData { const clone = this.createInstance(); @@ -945,6 +1347,7 @@ export class AstData { /** * Creates a new instance of a data object with the same prototype as this object. + * @internal */ protected createInstance(): AstData { return Object.create(Object.getPrototypeOf(this)); @@ -952,6 +1355,7 @@ export class AstData { /** * Copies the properties of this object to the provided object. + * @internal */ protected copyProperties(clone: AstData): void { for (const key in this) { @@ -964,6 +1368,7 @@ export class AstData { /** * Controls creation of a shadow node for the provided node. * This is primarily used for the purpose of redirecting source files. + * @internal */ shadowNode(node: AstNode): AstNode { return astNodeShadowCore(node); @@ -972,917 +1377,66 @@ export class AstData { /** * Creates a new data object using this object as the prototype. * This is primarily used for the purpose of redirecting source files. + * @internal */ shadow(): AstData { return Object.create(this); } } -/** @internal */ +// dprint-ignore export class AstTypeScriptNodeData extends AstData { - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return TransformFlags.ContainsTypeScript; } } -/** @internal */ -export class Node implements ts.Node { - readonly ast: AstNode> = undefined!; - - constructor(ast: AstNode>) { - // catch any excess properties assigned to the Node - Object.preventExtensions(this); - - this.ast = ast; - } - - get kind(): K { - return this.ast.kind; - } - get data(): T { - return this.ast.data; - } - get pos(): number { - return this.ast.pos; - } - set pos(value) { - this.ast.pos = value; - } - get end(): number { - return this.ast.end; - } - set end(value) { - this.ast.end = value; - } - get flags(): NodeFlags { - return this.ast.flags; - } - set flags(value) { - this.ast.flags = value; - } - get modifierFlagsCache(): ModifierFlags { - return this.ast.modifierFlagsCache; - } - set modifierFlagsCache(value) { - this.ast.modifierFlagsCache = value; - } - get transformFlags(): TransformFlags { - return this.ast.transformFlags; - } - set transformFlags(value) { - this.ast.transformFlags = value; - } - get parent(): Node { - return this.ast.parent?.node!; // TODO: remove `!` - } - set parent(value) { - this.ast.parent = value?.ast; - } - get id(): number { - return this.ast.id; - } - set id(value) { - this.ast.id = value; - } - get original(): Node | undefined { - return this.ast.original?.node; - } - set original(value) { - this.ast.original = value?.ast; - } - get emitNode(): EmitNode | undefined { - return this.ast.emitNode; - } - set emitNode(value) { - this.ast.emitNode = value; - } - get __pos(): number | undefined { // eslint-disable-line @typescript-eslint/naming-convention - return this.ast.__pos; - } - set __pos(value) { // eslint-disable-line @typescript-eslint/naming-convention - this.ast.__pos = value; - } - get __end(): number | undefined { // eslint-disable-line @typescript-eslint/naming-convention - return this.ast.__end; - } - set __end(value) { // eslint-disable-line @typescript-eslint/naming-convention - this.ast.__end = value; - } - - private assertHasRealPosition(message?: string) { - // eslint-disable-next-line local/debug-assert - Debug.assert(!positionIsSynthesized(this.pos) && !positionIsSynthesized(this.end), message || "Node must have a real position for this operation"); - } - - public getSourceFile(): ts.SourceFile { - return getSourceFileOfNode(this); - } - - public getStart(sourceFile?: ts.SourceFileLike, includeJsDocComment?: boolean): number { - this.assertHasRealPosition(); - return getTokenPosOfNode(this, sourceFile, includeJsDocComment); - } - - public getFullStart(): number { - this.assertHasRealPosition(); - return this.pos; - } - - public getEnd(): number { - this.assertHasRealPosition(); - return this.end; - } - - public getWidth(sourceFile?: ts.SourceFile): number { - this.assertHasRealPosition(); - return this.getEnd() - this.getStart(sourceFile); - } - - public getFullWidth(): number { - this.assertHasRealPosition(); - return this.end - this.pos; - } - - public getLeadingTriviaWidth(sourceFile?: ts.SourceFile): number { - this.assertHasRealPosition(); - return this.getStart(sourceFile) - this.pos; - } - - public getFullText(sourceFile?: ts.SourceFile): string { - this.assertHasRealPosition(); - return (sourceFile || this.getSourceFile()).text.substring(this.pos, this.end); - } - - public getText(sourceFile?: ts.SourceFile): string { - this.assertHasRealPosition(); - if (!sourceFile) { - sourceFile = this.getSourceFile(); - } - return sourceFile.text.substring(this.getStart(sourceFile), this.getEnd()); - } - - public getChildCount(sourceFile?: ts.SourceFile): number { - return this.getChildren(sourceFile).length; - } - - public getChildAt(index: number, sourceFile?: ts.SourceFile): ts.Node { - return this.getChildren(sourceFile)[index]; - } - - public getChildren(sourceFile: ts.SourceFileLike = getSourceFileOfNode(this)): readonly ts.Node[] { - this.assertHasRealPosition("Node without a real position cannot be scanned and thus has no token nodes - use forEachChild and collect the result if that's fine"); - return getNodeChildren(this, sourceFile) ?? setNodeChildren(this, sourceFile, createChildren(this, sourceFile)); - } - - public getFirstToken(sourceFile?: ts.SourceFileLike): ts.Node | undefined { - this.assertHasRealPosition(); - const children = this.getChildren(sourceFile) as readonly Node[]; - if (!children.length) { - return undefined; - } - - const child = find(children, kid => kid.kind < SyntaxKind.FirstJSDocNode || kid.kind > SyntaxKind.LastJSDocNode)!; - return child.kind < SyntaxKind.FirstNode ? - child : - child.getFirstToken(sourceFile); - } - - public getLastToken(sourceFile?: ts.SourceFileLike): ts.Node | undefined { - this.assertHasRealPosition(); - const children = this.getChildren(sourceFile) as readonly Node[]; - - const child = lastOrUndefined(children); - if (!child) { - return undefined; - } - - return child.kind < SyntaxKind.FirstNode ? child : child.getLastToken(sourceFile); - } - - public forEachChild(cbNode: (node: ts.Node) => T, cbNodeArray?: (nodes: ts.NodeArray) => T): T | undefined { - return forEachChild(this, cbNode, cbNodeArray); - } -} - -Debug.registerDebugInfo(() => { - if (!ts.hasProperty(Node.prototype, "__debugKind")) { - const weakNodeTextMap = new WeakMap(); - - Object.defineProperties(Node.prototype, { - // for use with vscode-js-debug's new customDescriptionGenerator in launch.json - __tsDebuggerDisplay: { - value(this: Node) { - const nodeHeader = ts.isGeneratedIdentifier(this) ? "GeneratedIdentifier" : - ts.isIdentifier(this) ? `Identifier '${idText(this)}'` : - ts.isPrivateIdentifier(this) ? `PrivateIdentifier '${idText(this)}'` : - ts.isStringLiteral(this) ? `StringLiteral ${JSON.stringify(this.text.length < 10 ? this.text : this.text.slice(10) + "...")}` : - ts.isNumericLiteral(this) ? `NumericLiteral ${this.text}` : - ts.isBigIntLiteral(this) ? `BigIntLiteral ${this.text}n` : - ts.isTypeParameterDeclaration(this) ? "TypeParameterDeclaration" : - ts.isParameter(this) ? "ParameterDeclaration" : - ts.isConstructorDeclaration(this) ? "ConstructorDeclaration" : - ts.isGetAccessorDeclaration(this) ? "GetAccessorDeclaration" : - ts.isSetAccessorDeclaration(this) ? "SetAccessorDeclaration" : - ts.isCallSignatureDeclaration(this) ? "CallSignatureDeclaration" : - ts.isConstructSignatureDeclaration(this) ? "ConstructSignatureDeclaration" : - ts.isIndexSignatureDeclaration(this) ? "IndexSignatureDeclaration" : - ts.isTypePredicateNode(this) ? "TypePredicateNode" : - ts.isTypeReferenceNode(this) ? "TypeReferenceNode" : - ts.isFunctionTypeNode(this) ? "FunctionTypeNode" : - ts.isConstructorTypeNode(this) ? "ConstructorTypeNode" : - ts.isTypeQueryNode(this) ? "TypeQueryNode" : - ts.isTypeLiteralNode(this) ? "TypeLiteralNode" : - ts.isArrayTypeNode(this) ? "ArrayTypeNode" : - ts.isTupleTypeNode(this) ? "TupleTypeNode" : - ts.isOptionalTypeNode(this) ? "OptionalTypeNode" : - ts.isRestTypeNode(this) ? "RestTypeNode" : - ts.isUnionTypeNode(this) ? "UnionTypeNode" : - ts.isIntersectionTypeNode(this) ? "IntersectionTypeNode" : - ts.isConditionalTypeNode(this) ? "ConditionalTypeNode" : - ts.isInferTypeNode(this) ? "InferTypeNode" : - ts.isParenthesizedTypeNode(this) ? "ParenthesizedTypeNode" : - ts.isThisTypeNode(this) ? "ThisTypeNode" : - ts.isTypeOperatorNode(this) ? "TypeOperatorNode" : - ts.isIndexedAccessTypeNode(this) ? "IndexedAccessTypeNode" : - ts.isMappedTypeNode(this) ? "MappedTypeNode" : - ts.isLiteralTypeNode(this) ? "LiteralTypeNode" : - ts.isNamedTupleMember(this) ? "NamedTupleMember" : - ts.isImportTypeNode(this) ? "ImportTypeNode" : - Debug.formatSyntaxKind(this.kind); - return `${nodeHeader}${this.flags ? ` (${Debug.formatNodeFlags(this.flags)})` : ""}`; - }, - }, - __debugKind: { - get(this: Node) { - return Debug.formatSyntaxKind(this.kind); - }, - }, - __debugNodeFlags: { - get(this: Node) { - return Debug.formatNodeFlags(this.flags); - }, - }, - __debugModifierFlags: { - get(this: Node) { - return Debug.formatModifierFlags(ts.getEffectiveModifierFlagsNoCache(this)); - }, - }, - __debugTransformFlags: { - get(this: Node) { - return Debug.formatTransformFlags(this.transformFlags); - }, - }, - __debugIsParseTreeNode: { - get(this: Node) { - return ts.isParseTreeNode(this); - }, - }, - __debugEmitFlags: { - get(this: Node) { - return Debug.formatEmitFlags(ts.getEmitFlags(this)); - }, - }, - __debugGetText: { - value(this: Node, includeTrivia?: boolean) { - if (ts.nodeIsSynthesized(this)) return ""; - // avoid recomputing - let text = weakNodeTextMap.get(this); - if (text === undefined) { - const parseNode = ts.getParseTreeNode(this); - const sourceFile = parseNode && getSourceFileOfNode(parseNode); - text = sourceFile ? ts.getSourceTextOfNodeFromSourceFile(sourceFile, parseNode, includeTrivia) : ""; - weakNodeTextMap.set(this, text); - } - return text; - }, - }, - }); - } -}); - -/** @internal */ -export type NodeConstructor = new (ast: AstNode>) => N; - -/** @internal */ -export class AstNodeArrayExtraFields { - nodes: NodeArray | undefined = undefined; - hasTrailingComma: boolean = false; - transformFlags: TransformFlags | undefined = undefined; - __pos: number | undefined = undefined; - __end: number | undefined = undefined; -} - -let astNodeArrayMaybeExtra: (nodes: AstNodeArray) => AstNodeArrayExtraFields | undefined; - -/** @internal */ -export class AstNodeArray { - static { - astNodeArrayMaybeExtra = nodes => nodes._extra; - } - - readonly items: readonly N[] = undefined!; - pos = -1; - end = -1; - - private _extra: AstNodeArrayExtraFields | undefined = undefined; - - constructor(items: readonly N[], hasTrailingComma = false) { - // catch any excess properties assigned to the NodeArray - Object.preventExtensions(this); - - this.items = items; - this.hasTrailingComma = hasTrailingComma; - } - - /** @private */ get extra(): AstNodeArrayExtraFields { - return this._extra ??= new AstNodeArrayExtraFields(); - } - - get nodes(): NodeArray { - return this.extra.nodes ??= new NodeArray(this); - } - get hasTrailingComma(): boolean { - return this._extra?.hasTrailingComma ?? false; - } - set hasTrailingComma(value) { - if (value !== this.hasTrailingComma) { - this.extra.hasTrailingComma = value; - } - } - - get transformFlags(): ts.TransformFlags { - let transformFlags = this._extra?.transformFlags; - if (transformFlags === undefined) { - transformFlags = TransformFlags.None; - for (const child of this.items) { - transformFlags |= propagateChildFlags(child); - } - this.extra.transformFlags = transformFlags; - } - return transformFlags; - } - set transformFlags(value) { - this.extra.transformFlags = value; - } -} - -/** @internal */ -export class NodeArray extends Array implements ts.NodeArray { - readonly ast: AstNodeArray; - - constructor(ast: AstNodeArray) { - super(...ast.items.map(item => item.node as N)); - this.ast = ast; - - // catch any excess properties assigned to the array - Object.preventExtensions(this); - } - - static override get [globalThis.Symbol.species](): ArrayConstructor { - return Array; - } - - get pos(): number { - return this.ast.pos; - } - set pos(value) { - this.ast.pos = value; - } - get end(): number { - return this.ast.end; - } - set end(value) { - this.ast.end = value; - } - get hasTrailingComma(): boolean { - return this.ast.hasTrailingComma; - } - set hasTrailingComma(value) { - this.ast.hasTrailingComma = value; - } - get transformFlags(): ts.TransformFlags { - return this.ast.transformFlags; - } - set transformFlags(value) { - this.ast.transformFlags = value; - } - - get __pos(): number | undefined { // eslint-disable-line @typescript-eslint/naming-convention - return astNodeArrayMaybeExtra(this.ast)?.__pos; - } - set __pos(value) { // eslint-disable-line @typescript-eslint/naming-convention - this.ast.extra.__pos = value; - } - get __end(): number | undefined { // eslint-disable-line @typescript-eslint/naming-convention - return astNodeArrayMaybeExtra(this.ast)?.__end; - } - set __end(value) { // eslint-disable-line @typescript-eslint/naming-convention - this.ast.extra.__end = value; - } -} - -Debug.registerDebugInfo(() => { - if (!("__tsDebuggerDisplay" in NodeArray.prototype)) { // eslint-disable-line local/no-in-operator - Object.defineProperties(NodeArray.prototype, { - __tsDebuggerDisplay: { - value(this: NodeArray, defaultValue: string) { - // An `Array` with extra properties is rendered as `[A, B, prop1: 1, prop2: 2]`. Most of - // these aren't immediately useful so we trim off the `prop1: ..., prop2: ...` part from the - // formatted string. - // This regex can trigger slow backtracking because of overlapping potential captures. - // We don't care, this is debug code that's only enabled with a debugger attached - - // we're just taking note of it for anyone checking regex performance in the future. - defaultValue = String(defaultValue).replace(/(?:,[\s\w]+:[^,]+)+\]$/, "]"); - return `NodeArray ${defaultValue}`; - }, - }, - }); - } -}); - -/** @internal */ -export interface JSDocContainer extends Node { - _jsdocContainerBrand: any; - - get jsDoc(): JSDocArray | undefined; - set jsDoc(value: JSDocArray | undefined); -} - -/** @internal */ -export interface FlowContainer extends Node { - _flowContainerBrand: any; - - get flowNode(): FlowNode | undefined; - set flowNode(value: FlowNode | undefined); -} - -/** @internal */ -export interface LocalsContainer extends Node { - _localsContainerBrand: any; - - get locals(): SymbolTable | undefined; - set locals(value: SymbolTable | undefined); - get nextContainer(): HasLocals | undefined; - set nextContainer(value: HasLocals | undefined); -} - -/** @internal */ -export type HasLocals = - | ArrowFunction - | Block - | CallSignatureDeclaration - | CaseBlock - | CatchClause - | ClassStaticBlockDeclaration - | ConditionalTypeNode - | ConstructorDeclaration - | ConstructorTypeNode - | ConstructSignatureDeclaration - | ForStatement - | ForInStatement - | ForOfStatement - | FunctionDeclaration - | FunctionExpression - | FunctionTypeNode - | GetAccessorDeclaration - | IndexSignatureDeclaration - | JSDocCallbackTag - | JSDocEnumTag - | JSDocFunctionType - | JSDocSignature - | JSDocTypedefTag - | MappedTypeNode - | MethodDeclaration - | MethodSignature - | ModuleDeclaration - | SetAccessorDeclaration - | SourceFile - | TypeAliasDeclaration; - /** @internal */ export type AstHasLocals = AstNodeOneOf; - -// NOTE: Changing the following list requires changes to: -// - `canHaveDecorators` in factory/utilities.ts -// - `updateModifiers` in factory/nodeFactory.ts -/** @internal */ -export type HasDecorators = - | ParameterDeclaration - | PropertyDeclaration - | MethodDeclaration - | GetAccessorDeclaration - | SetAccessorDeclaration - | ClassExpression - | ClassDeclaration; - -/** @internal */ export type AstHasDecorators = AstNodeOneOf; - -// NOTE: Changing the following list requires changes to: -// - `canHaveModifiers` in factory/utilitiesPublic.ts -// - `updateModifiers` in factory/nodeFactory.ts -/** @internal */ -export type HasModifiers = - | TypeParameterDeclaration - | ParameterDeclaration - | ConstructorTypeNode - | PropertySignature - | PropertyDeclaration - | MethodSignature - | MethodDeclaration - | ConstructorDeclaration - | GetAccessorDeclaration - | SetAccessorDeclaration - | IndexSignatureDeclaration - | FunctionExpression - | ArrowFunction - | ClassExpression - | VariableStatement - | FunctionDeclaration - | ClassDeclaration - | InterfaceDeclaration - | TypeAliasDeclaration - | EnumDeclaration - | ModuleDeclaration - | ImportEqualsDeclaration - | ImportDeclaration - | ExportAssignment - | ExportDeclaration; - -/** @internal */ export type AstHasModifiers = AstNodeOneOf; - -/** @internal */ -export type HasChildren = - | QualifiedName - | ComputedPropertyName - | TypeParameterDeclaration - | ParameterDeclaration - | Decorator - | PropertySignature - | PropertyDeclaration - | MethodSignature - | MethodDeclaration - | ConstructorDeclaration - | GetAccessorDeclaration - | SetAccessorDeclaration - | ClassStaticBlockDeclaration - | CallSignatureDeclaration - | ConstructSignatureDeclaration - | IndexSignatureDeclaration - | TypePredicateNode - | TypeReferenceNode - | FunctionTypeNode - | ConstructorTypeNode - | TypeQueryNode - | TypeLiteralNode - | ArrayTypeNode - | TupleTypeNode - | OptionalTypeNode - | RestTypeNode - | UnionTypeNode - | IntersectionTypeNode - | ConditionalTypeNode - | InferTypeNode - | ImportTypeNode - | ImportTypeAssertionContainer - | NamedTupleMember - | ParenthesizedTypeNode - | TypeOperatorNode - | IndexedAccessTypeNode - | MappedTypeNode - | LiteralTypeNode - | TemplateLiteralTypeNode - | TemplateLiteralTypeSpan - | ObjectBindingPattern - | ArrayBindingPattern - | BindingElement - | ArrayLiteralExpression - | ObjectLiteralExpression - | PropertyAccessExpression - | ElementAccessExpression - | CallExpression - | NewExpression - | TaggedTemplateExpression - | TypeAssertion - | ParenthesizedExpression - | FunctionExpression - | ArrowFunction - | DeleteExpression - | TypeOfExpression - | VoidExpression - | AwaitExpression - | PrefixUnaryExpression - | PostfixUnaryExpression - | BinaryExpression - | ConditionalExpression - | TemplateExpression - | YieldExpression - | SpreadElement - | ClassExpression - | ExpressionWithTypeArguments - | AsExpression - | NonNullExpression - | SatisfiesExpression - | MetaProperty - | TemplateSpan - | Block - | VariableStatement - | ExpressionStatement - | IfStatement - | DoStatement - | WhileStatement - | ForStatement - | ForInStatement - | ForOfStatement - | ContinueStatement - | BreakStatement - | ReturnStatement - | WithStatement - | SwitchStatement - | LabeledStatement - | ThrowStatement - | TryStatement - | VariableDeclaration - | VariableDeclarationList - | FunctionDeclaration - | ClassDeclaration - | InterfaceDeclaration - | TypeAliasDeclaration - | EnumDeclaration - | ModuleDeclaration - | ModuleBlock - | CaseBlock - | NamespaceExportDeclaration - | ImportEqualsDeclaration - | ImportDeclaration - | AssertClause - | AssertEntry - | ImportAttributes - | ImportAttribute - | ImportClause - | NamespaceImport - | NamespaceExport - | NamedImports - | ImportSpecifier - | ExportAssignment - | ExportDeclaration - | NamedExports - | ExportSpecifier - | ExternalModuleReference - | JsxElement - | JsxSelfClosingElement - | JsxOpeningElement - | JsxClosingElement - | JsxFragment - | JsxAttribute - | JsxAttributes - | JsxSpreadAttribute - | JsxExpression - | JsxNamespacedName - | CaseClause - | DefaultClause - | HeritageClause - | CatchClause - | PropertyAssignment - | ShorthandPropertyAssignment - | SpreadAssignment - | EnumMember - | SourceFile - | PartiallyEmittedExpression - | CommaListExpression; - /** @internal */ export type AstHasChildren = AstNodeOneOf; - -/** @internal */ -export type ForEachChildNodes = - | HasChildren - | MissingDeclaration - | JSDocTypeExpression - | JSDocNonNullableType - | JSDocNullableType - | JSDocOptionalType - | JSDocVariadicType - | JSDocFunctionType - | JSDoc - | JSDocSeeTag - | JSDocNameReference - | JSDocMemberName - | JSDocParameterTag - | JSDocPropertyTag - | JSDocAuthorTag - | JSDocImplementsTag - | JSDocAugmentsTag - | JSDocTemplateTag - | JSDocTypedefTag - | JSDocCallbackTag - | JSDocReturnTag - | JSDocTypeTag - | JSDocThisTag - | JSDocEnumTag - | JSDocSignature - | JSDocLink - | JSDocLinkCode - | JSDocLinkPlain - | JSDocTypeLiteral - | JSDocUnknownTag - | JSDocClassTag - | JSDocPublicTag - | JSDocPrivateTag - | JSDocProtectedTag - | JSDocReadonlyTag - | JSDocDeprecatedTag - | JSDocThrowsTag - | JSDocOverrideTag - | JSDocSatisfiesTag - | JSDocOverloadTag - | JSDocImportTag; - /** @internal */ export type AstForEachChildNodes = AstNodeOneOf; - -/** @internal */ -export interface Declaration extends Node { - readonly ast: AstDeclaration; - _declarationBrand: any; - - get symbol(): Symbol; - set symbol(value: Symbol); - get localSymbol(): Symbol | undefined; - set localSymbol(value: Symbol | undefined); -} - -/** @internal */ export type AstDeclaration = AstNode; - -/** @internal */ -export interface TypeNode extends Node { - readonly ast: AstTypeNode; - _typeNodeBrand: any; -} - -/** @internal */ export type AstTypeNode = AstNode>; - -/** @internal */ -export interface Statement extends JSDocContainer { - readonly ast: AstStatement; - _statementBrand: any; -} - -/** @internal */ export type AstStatement = AstNode; - -/** @internal */ -export interface Expression extends Node { - readonly ast: AstExpression; - _expressionBrand: any; -} - -/** @internal */ export type AstExpression = AstNode; - -/** @internal */ -export interface UnaryExpression extends Expression { - readonly ast: AstUnaryExpression; - _unaryExpressionBrand: any; -} - -/** @internal */ export type AstUnaryExpression = AstNode; - -/** @internal */ -export interface UpdateExpression extends UnaryExpression { - readonly ast: AstUpdateExpression; - _updateExpressionBrand: any; -} - -/** @internal */ export type AstUpdateExpression = AstNode; - -/** @internal */ -export interface LeftHandSideExpression extends UpdateExpression { - readonly ast: AstLeftHandSideExpression; - _leftHandSideExpressionBrand: any; -} - -/** @internal */ export type AstLeftHandSideExpression = AstNode; - -/** @internal */ -export interface MemberExpression extends LeftHandSideExpression { - readonly ast: AstMemberExpression; - _memberExpressionBrand: any; -} - -/** @internal */ export type AstMemberExpression = AstNode; - -/** @internal */ -export interface PrimaryExpression extends MemberExpression { - readonly ast: AstPrimaryExpression; - _primaryExpressionBrand: any; -} - -/** @internal */ export type AstPrimaryExpression = AstNode; - -/** @internal */ -export interface KeywordExpression extends PrimaryExpression, KeywordToken { - readonly ast: AstKeywordExpression; - readonly kind: TKind; -} - -/** @internal */ export type AstKeywordExpression = AstNode>; - -/** @internal */ -export interface LiteralLikeNode extends Node { - readonly ast: AstLiteralLikeNode; - readonly data: AstLiteralLikeNodeData; - - text: string; - isUnterminated?: boolean | undefined; - hasExtendedUnicodeEscape?: boolean | undefined; -} - -/** @internal */ export type AstLiteralLikeNode = AstNode; -/** @internal */ export interface AstLiteralLikeNodeData extends AstData { text: string; - isUnterminated?: boolean | undefined; - hasExtendedUnicodeEscape?: boolean | undefined; } -/** @internal */ -export interface TemplateLiteralLikeNode extends LiteralLikeNode { - readonly ast: AstTemplateLiteralLikeNode; - readonly data: AstTemplateLiteralLikeNodeData; - rawText?: string | undefined; - /** @internal */ - templateFlags?: TokenFlags | undefined; +export type AstStringLiteralLikeNode = AstNode; + +export interface AstStringLiteralLikeNodeData extends AstLiteralLikeNodeData { + isUnterminated: boolean | undefined; + hasExtendedUnicodeEscape: boolean | undefined; } -/** @internal */ -export interface AstTemplateLiteralLikeNodeData extends AstLiteralLikeNodeData { - rawText?: string | undefined; - /** @internal */ - templateFlags?: TokenFlags | undefined; +export interface AstTemplateLiteralLikeNodeData extends AstStringLiteralLikeNodeData { + rawText: string | undefined; + /** @internal */ templateFlags: TokenFlags | undefined; } -/** @internal */ export type AstTemplateLiteralLikeNode = AstNode; -/** @internal */ -export interface LiteralExpression extends PrimaryExpression, LiteralLikeNode { - readonly ast: AstLiteralExpression; - readonly data: AstLiteralExpressionData; - _literalExpressionBrand: any; - - get text(): string; - set text(value: string); -} - -/** @internal */ export type AstLiteralExpression = AstNode; -/** @internal */ export interface AstLiteralExpressionData extends AstLiteralLikeNodeData { } -/** @internal */ -export class Token extends Node implements ts.Token { - public override getChildCount(_sourceFile?: ts.SourceFile): number { - return this.getChildren().length; - } - - public override getChildAt(index: number, _sourceFile?: ts.SourceFile): ts.Node { - return this.getChildren()[index]; - } - - public override getChildren(_sourceFile?: ts.SourceFileLike): readonly ts.Node[] { - return this.kind === SyntaxKind.EndOfFileToken ? (this as Node as EndOfFileToken).jsDoc || emptyArray : emptyArray; - } - - public override getFirstToken(_sourceFile?: ts.SourceFileLike): ts.Node | undefined { - return undefined; - } - - public override getLastToken(_sourceFile?: ts.SourceFileLike): ts.Node | undefined { - return undefined; - } - - public override forEachChild(_cbNode: (node: ts.Node) => T, _cbNodeArray?: (nodes: ts.NodeArray) => T): T | undefined { - return undefined; - } -} - -/** @internal */ +// dprint-ignore export class AstTokenData extends AstData { - override computeTransformFlags(node: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(node: AstNode): TransformFlags { switch (node.kind) { case SyntaxKind.AsyncKeyword: // 'async' modifier is ES2017 (async functions) or ES2018 (async generators) @@ -1925,388 +1479,81 @@ export class AstTokenData extends AstData { } } -/** @internal */ -export class EndOfFileToken extends Token implements JSDocContainer, ts.EndOfFileToken { - declare readonly ast: AstEndOfFileToken; - - declare _jsdocContainerBrand: any; - - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } -} - -/** @internal */ +// dprint-ignore export class AstEndOfFileTokenData extends AstTokenData { - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) } -/** @internal */ -export class ThisExpression extends Token implements KeywordExpression, FlowContainer, ts.ThisExpression { - declare readonly ast: AstThisExpression; - - declare _primaryExpressionBrand: any; - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - declare _flowContainerBrand: any; - - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value: FlowNode | undefined) { - this.ast.data.flowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstThisExpressionData extends AstTokenData { - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) } -/** @internal */ -export class SuperExpression extends Token implements KeywordExpression, FlowContainer, ts.SuperExpression { - declare readonly ast: AstSuperExpression; - - declare _primaryExpressionBrand: any; - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - declare _flowContainerBrand: any; - - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value: FlowNode | undefined) { - this.ast.data.flowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstSuperExpressionData extends AstTokenData { - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) } -/** @internal */ -export class ImportExpression extends Token implements KeywordExpression, ts.ImportExpression { - declare readonly ast: AstImportExpression; - - declare _primaryExpressionBrand: any; - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; -} - -/** @internal */ -export class NullLiteral extends Token implements KeywordExpression, ts.NullLiteral { - declare readonly ast: AstNullLiteral; - - declare _primaryExpressionBrand: any; - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; -} - -/** @internal */ -export class TrueLiteral extends Token implements KeywordExpression, ts.TrueLiteral { - declare readonly ast: AstTrueLiteral; - - declare _primaryExpressionBrand: any; - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; -} - -/** @internal */ -export class FalseLiteral extends Token implements KeywordExpression, ts.FalseLiteral { - declare readonly ast: AstFalseLiteral; - - declare _primaryExpressionBrand: any; - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; -} - -/** @internal */ -export type BooleanLiteral = - | TrueLiteral - | FalseLiteral; - -/** @internal */ export type AstBooleanLiteral = AstNodeOneOf; // Punctuation -/** @internal */ -export interface PunctuationToken extends Token {} - -/** @internal */ -export type DotToken = PunctuationToken; -/** @internal */ -export type DotDotDotToken = PunctuationToken; -/** @internal */ -export type QuestionToken = PunctuationToken; -/** @internal */ -export type ExclamationToken = PunctuationToken; -/** @internal */ -export type ColonToken = PunctuationToken; -/** @internal */ -export type EqualsToken = PunctuationToken; -/** @internal */ -export type AmpersandAmpersandEqualsToken = PunctuationToken; -/** @internal */ -export type BarBarEqualsToken = PunctuationToken; -/** @internal */ -export type QuestionQuestionEqualsToken = PunctuationToken; -/** @internal */ -export type AsteriskToken = PunctuationToken; -/** @internal */ -export type EqualsGreaterThanToken = PunctuationToken; -/** @internal */ -export type PlusToken = PunctuationToken; -/** @internal */ -export type MinusToken = PunctuationToken; -/** @internal */ -export type QuestionDotToken = PunctuationToken; - -/** @internal */ export type AstPunctuationToken = AstNode>; - -/** @internal */ export type AstDotToken = AstNode; -/** @internal */ export type AstDotDotDotToken = AstNode; -/** @internal */ export type AstQuestionToken = AstNode; -/** @internal */ export type AstExclamationToken = AstNode; -/** @internal */ export type AstColonToken = AstNode; -/** @internal */ export type AstEqualsToken = AstNode; -/** @internal */ export type AstAmpersandAmpersandEqualsToken = AstNode; -/** @internal */ export type AstBarBarEqualsToken = AstNode; -/** @internal */ export type AstQuestionQuestionEqualsToken = AstNode; -/** @internal */ export type AstAsteriskToken = AstNode; -/** @internal */ export type AstEqualsGreaterThanToken = AstNode; -/** @internal */ export type AstPlusToken = AstNode; -/** @internal */ export type AstMinusToken = AstNode; -/** @internal */ export type AstQuestionDotToken = AstNode; // Keywords -/** @internal */ -export interface KeywordToken extends Token {} - -/** @internal */ -export type AssertsKeyword = KeywordToken; -/** @internal */ -export type AssertKeyword = KeywordToken; -/** @internal */ -export type AwaitKeyword = KeywordToken; -/** @internal */ -export type CaseKeyword = KeywordToken; - -/** @internal */ export type AstKeywordToken = AstNode>; - -/** @internal */ export type AstAssertsKeyword = AstNode; -/** @internal */ export type AstAssertKeyword = AstNode; -/** @internal */ export type AstAwaitKeyword = AstNode; -/** @internal */ export type AstCaseKeyword = AstNode; // Modifiers -/** @internal */ -export interface ModifierToken extends KeywordToken {} - -/** @internal */ -export type AbstractKeyword = ModifierToken; -/** @internal */ -export type AccessorKeyword = ModifierToken; -/** @internal */ -export type AsyncKeyword = ModifierToken; -/** @internal */ -export type ConstKeyword = ModifierToken; -/** @internal */ -export type DeclareKeyword = ModifierToken; -/** @internal */ -export type DefaultKeyword = ModifierToken; -/** @internal */ -export type ExportKeyword = ModifierToken; -/** @internal */ -export type InKeyword = ModifierToken; -/** @internal */ -export type PrivateKeyword = ModifierToken; -/** @internal */ -export type ProtectedKeyword = ModifierToken; -/** @internal */ -export type PublicKeyword = ModifierToken; -/** @internal */ -export type ReadonlyKeyword = ModifierToken; -/** @internal */ -export type OutKeyword = ModifierToken; -/** @internal */ -export type OverrideKeyword = ModifierToken; -/** @internal */ -export type StaticKeyword = ModifierToken; - -/** @internal */ export type AstModifierToken = AstNode>; - -/** @internal */ export type AstAbstractKeyword = AstNode; -/** @internal */ export type AstAccessorKeyword = AstNode; -/** @internal */ export type AstAsyncKeyword = AstNode; -/** @internal */ export type AstConstKeyword = AstNode; -/** @internal */ export type AstDeclareKeyword = AstNode; -/** @internal */ export type AstDefaultKeyword = AstNode; -/** @internal */ export type AstExportKeyword = AstNode; -/** @internal */ export type AstInKeyword = AstNode; -/** @internal */ export type AstPrivateKeyword = AstNode; -/** @internal */ export type AstProtectedKeyword = AstNode; -/** @internal */ export type AstPublicKeyword = AstNode; -/** @internal */ export type AstReadonlyKeyword = AstNode; -/** @internal */ export type AstOutKeyword = AstNode; -/** @internal */ export type AstOverrideKeyword = AstNode; -/** @internal */ export type AstStaticKeyword = AstNode; - -/** @internal */ -export type Modifier = - | AbstractKeyword - | AccessorKeyword - | AsyncKeyword - | ConstKeyword - | DeclareKeyword - | DefaultKeyword - | ExportKeyword - | InKeyword - | PrivateKeyword - | ProtectedKeyword - | PublicKeyword - | OutKeyword - | OverrideKeyword - | ReadonlyKeyword - | StaticKeyword; - -/** @internal */ export type AstModifier = AstNodeOneOf; - -/** @internal */ -export type ModifierLike = - | Modifier - | Decorator; - -/** @internal */ export type AstModifierLike = AstNodeOneOf; -/** @internal */ -export class Identifier extends Token implements PrimaryExpression, JSDocContainer, FlowContainer, Declaration, ts.Identifier { - declare readonly ast: AstIdentifier; - - declare _primaryExpressionBrand: any; - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - declare _flowContainerBrand: any; - - get escapedText(): __String { - return this.ast.data.escapedText; - } - set escapedText(value: __String) { - this.ast.data.escapedText = value; - } - get resolvedSymbol(): Symbol { - return this.ast.data.resolvedSymbol; - } - set resolvedSymbol(value: Symbol) { - this.ast.data.resolvedSymbol = value; - } - get symbol(): Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value) { - this.ast.data.flowNode = value; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value) { - this.ast.data.jsDoc = value; - } - - get text(): string { - return idText(this); - } -} - -/** @internal */ +// dprint-ignore export class AstIdentifierData extends AstTokenData { escapedText: __String = undefined!; - resolvedSymbol: Symbol = undefined!; // TransientIdentifier - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(node: AstNode): TransformFlags { + /** @internal */ resolvedSymbol: Symbol = undefined!; // TransientIdentifier + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + + /** @internal */ override computeTransformFlags(node: AstNode): TransformFlags { let transformFlags = TransformFlags.None; if (this.escapedText === "await") { transformFlags |= TransformFlags.ContainsPossibleTopLevelAwait; @@ -2318,316 +1565,74 @@ export class AstIdentifierData extends AstTokenData { } } -/** @internal */ -export class QualifiedName extends Node implements FlowContainer, ts.QualifiedName { - declare readonly ast: AstQualifiedName; - - declare _flowContainerBrand: any; - - get left(): EntityName { - return this.ast.data.left?.node; - } - set left(value: EntityName) { - this.ast.data.left = value?.ast; - } - get right(): Identifier { - return this.ast.data.right?.node; - } - set right(value: Identifier) { - this.ast.data.right = value?.ast; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value) { - this.ast.data.flowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstQualifiedNameData extends AstData { left: AstEntityName = undefined!; right: AstIdentifier = undefined!; - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.left) | propagateIdentifierNameFlags(this.right); } } -/** @internal */ -export type EntityName = - | Identifier - | QualifiedName; - -/** @internal */ export type AstEntityName = AstNodeOneOf; - -/** @internal */ -export type BindingName = - | Identifier - | BindingPattern; - -/** @internal */ export type AstBindingName = AstNodeOneOf; - -/** @internal */ -export type PropertyName = - | Identifier - | StringLiteral - | NoSubstitutionTemplateLiteral - | NumericLiteral - | ComputedPropertyName - | PrivateIdentifier - | BigIntLiteral; - -/** @internal */ export type AstPropertyName = AstNodeOneOf; - -/** @internal */ -export type MemberName = - | Identifier - | PrivateIdentifier; - -/** @internal */ export type AstMemberName = AstNodeOneOf; - -/** @internal */ -export type DeclarationName = - | PropertyName - | JsxAttributeName - | StringLiteralLike - | ElementAccessExpression - | BindingPattern - | EntityNameExpression; - -/** @internal */ export type AstDeclarationName = AstNodeOneOf; -/** @internal */ -export class ComputedPropertyName extends Node implements ts.ComputedPropertyName { - declare readonly ast: AstComputedPropertyName; - - override get parent() { - return super.parent as Declaration; - } - override set parent(value) { - super.parent = value; - } - - get expression(): Expression { - return this.ast.data.expression.node; - } - set expression(value: Expression) { - this.ast.data.expression = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstComputedPropertyNameData extends AstData { expression: AstExpression = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.expression) | TransformFlags.ContainsES2015 | TransformFlags.ContainsComputedPropertyName; } } -/** @internal */ -export class PrivateIdentifier extends Token implements ts.PrivateIdentifier { - declare readonly ast: AstPrivateIdentifier; - - declare _primaryExpressionBrand: any; - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - - get escapedText(): __String { - return this.ast.data.escapedText; - } - set escapedText(value: __String) { - this.ast.data.escapedText = value; - } - - get text(): string { - return idText(this); - } -} - -/** @internal */ +// dprint-ignore export class AstPrivateIdentifierData extends AstTokenData { escapedText: __String = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return TransformFlags.ContainsClassFields; } } -/** @internal */ -export class TypeParameterDeclaration extends Node implements JSDocContainer, Declaration, ts.TypeParameterDeclaration { - declare readonly ast: AstTypeParameterDeclaration; - - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - - override get parent() { - return super.parent as DeclarationWithTypeParameterChildren | InferTypeNode; - } - override set parent(value) { - super.parent = value; - } - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value: NodeArray | undefined) { - this.ast.data.modifiers = value?.ast; - } - get name(): Identifier { - return this.ast.data.name.node; - } - set name(value: Identifier) { - this.ast.data.name = value.ast; - } - get constraint(): TypeNode | undefined { - return this.ast.data.constraint?.node; - } - set constraint(value: TypeNode | undefined) { - this.ast.data.constraint = value?.ast; - } - get default(): TypeNode | undefined { - return this.ast.data.default?.node; - } - set default(value: TypeNode | undefined) { - this.ast.data.default = value?.ast; - } - get expression(): Expression | undefined { - return this.ast.data.expression?.node; - } - set expression(value: Expression | undefined) { - this.ast.data.expression = value?.ast; - } - get symbol(): Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value) { - this.ast.data.jsDoc = value; - } -} - -/** @internal */ +// dprint-ignore export class AstTypeParameterDeclarationData extends AstTypeScriptNodeData { modifiers: AstNodeArray | undefined = undefined; name: AstIdentifier = undefined!; constraint: AstTypeNode | undefined = undefined; default: AstTypeNode | undefined = undefined; - expression: AstExpression | undefined = undefined; + expression: AstExpression | undefined = undefined; // For error recovery purposes (see `isGrammarError` in utilities.ts). - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) } -/** @internal */ -export class ParameterDeclaration extends Node implements Declaration, JSDocContainer, ts.ParameterDeclaration { - declare readonly ast: AstParameterDeclaration; - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - - override get parent() { - return super.parent as SignatureDeclaration; - } - override set parent(value) { - super.parent = value; - } - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value: NodeArray | undefined) { - this.ast.data.modifiers = value?.ast; - } - get dotDotDotToken(): DotDotDotToken | undefined { - return this.ast.data.dotDotDotToken?.node; - } - set dotDotDotToken(value: DotDotDotToken | undefined) { - this.ast.data.dotDotDotToken = value?.ast; - } - get name(): BindingName { // TODO(rbuckton): `name` can be undefined for JSDoc signature parameters - return this.ast.data.name?.node; - } - set name(value: BindingName) { - this.ast.data.name = value?.ast; - } - get questionToken(): QuestionToken | undefined { - return this.ast.data.questionToken?.node; - } - set questionToken(value: QuestionToken | undefined) { - this.ast.data.questionToken = value?.ast; - } - get type(): TypeNode | undefined { - return this.ast.data.type?.node; - } - set type(value: TypeNode | undefined) { - this.ast.data.type = value?.ast; - } - get initializer(): Expression | undefined { - return this.ast.data.initializer?.node; - } - set initializer(value: Expression | undefined) { - this.ast.data.initializer = value?.ast; - } - get symbol(): Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value) { - this.ast.data.jsDoc = value; - } -} - -/** @internal */ +// dprint-ignore export class AstParameterDeclarationData extends AstData { modifiers: AstNodeArray | undefined = undefined; - dotDotDotToken: AstDotDotDotToken | undefined = undefined; - name: AstBindingName = undefined!; // TODO(rbuckton): `name` can be undefined for JSDoc signature parameters - questionToken: AstQuestionToken | undefined = undefined; - type: AstTypeNode | undefined = undefined; - initializer: AstExpression | undefined = undefined; + dotDotDotToken: AstDotDotDotToken | undefined = undefined; // Present on rest parameter + // TODO(rbuckton): `name` can be undefined for JSDoc signature parameters + name: AstBindingName = undefined!; // Declared parameter name. + questionToken: AstQuestionToken | undefined = undefined; // Present on optional parameter + type: AstTypeNode | undefined = undefined; // Optional type annotation + initializer: AstExpression | undefined = undefined; // Optional initializer - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { const name = this.name; if (name?.kind === SyntaxKind.Identifier && name.data.escapedText === "this") { return TransformFlags.ContainsTypeScript; @@ -2643,30 +1648,11 @@ export class AstParameterDeclarationData extends AstData { } } -/** @internal */ -export class Decorator extends Node implements ts.Decorator { - declare readonly ast: AstDecorator; - - override get parent() { - return super.parent as Declaration; - } - override set parent(value) { - super.parent = value; - } - - get expression(): LeftHandSideExpression { - return this.ast.data.expression.node; - } - set expression(value: LeftHandSideExpression) { - this.ast.data.expression = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstDecoratorData extends AstData { expression: AstLeftHandSideExpression = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.expression) | TransformFlags.ContainsTypeScript | TransformFlags.ContainsTypeScriptClassSyntax | @@ -2674,359 +1660,72 @@ export class AstDecoratorData extends AstData { } } -/** @internal */ -export class PropertySignature extends Node implements Declaration, JSDocContainer, ts.PropertySignature { - declare readonly ast: AstPropertySignature; - - declare _typeElementBrand: any; - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - - override get parent() { - return super.parent as TypeLiteralNode | InterfaceDeclaration; - } - override set parent(value) { - super.parent = value; - } - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value: NodeArray | undefined) { - this.ast.data.modifiers = value?.ast; - } - get name(): PropertyName { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } - get questionToken(): QuestionToken | undefined { - return this.ast.data.questionToken?.node; - } - set questionToken(value) { - this.ast.data.questionToken = value?.ast; - } - get type(): TypeNode | undefined { - return this.ast.data.type?.node; - } - set type(value) { - this.ast.data.type = value?.ast; - } - get initializer(): Expression | undefined { - return this.ast.data.initializer?.node; - } - set initializer(value) { - this.ast.data.initializer = value?.ast; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } -} - -/** @internal */ +// dprint-ignore export class AstPropertySignatureData extends AstTypeScriptNodeData { modifiers: AstNodeArray | undefined = undefined; - name: AstPropertyName = undefined!; - questionToken: AstQuestionToken | undefined = undefined; - type: AstTypeNode | undefined = undefined; - initializer: AstExpression | undefined = undefined; // initialized by parser (grammar error) + name: AstPropertyName = undefined!; // Declared property name. + questionToken: AstQuestionToken | undefined = undefined; // Present on optional property + type: AstTypeNode | undefined = undefined; // Optional type annotation - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ initializer: AstExpression | undefined = undefined; // initialized by parser (grammar error, see see `isGrammarError` in utilities.ts) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) } -/** @internal */ -export type SignatureDeclaration = - | CallSignatureDeclaration - | ConstructSignatureDeclaration - | MethodSignature - | IndexSignatureDeclaration - | FunctionTypeNode - | ConstructorTypeNode - | JSDocFunctionType - | FunctionDeclaration - | MethodDeclaration - | ConstructorDeclaration - | AccessorDeclaration - | FunctionExpression - | ArrowFunction; - -/** @internal */ export type AstSignatureDeclaration = AstNodeOneOf; -/** @internal */ -export class CallSignatureDeclaration extends Node implements LocalsContainer, Declaration, JSDocContainer, TypeElement, ts.CallSignatureDeclaration { - declare readonly ast: AstCallSignatureDeclaration; - - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - declare _typeElementBrand: any; - declare _localsContainerBrand: any; - - get typeParameters(): NodeArray | undefined { - return this.ast.data.typeParameters?.nodes; - } - set typeParameters(value) { - this.ast.data.typeParameters = value?.ast; - } - get parameters(): NodeArray { - return this.ast.data.parameters.nodes; - } - set parameters(value) { - this.ast.data.parameters = value.ast; - } - get type(): TypeNode | undefined { - return this.ast.data.type?.node; - } - set type(value) { - this.ast.data.type = value?.ast; - } - get typeArguments(): NodeArray | undefined { - return this.ast.data.typeArguments?.nodes; - } - set typeArguments(value) { - this.ast.data.typeArguments = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstCallSignatureDeclarationData extends AstTypeScriptNodeData { typeParameters: AstNodeArray | undefined = undefined; parameters: AstNodeArray = undefined!; type: AstTypeNode | undefined = undefined; - typeArguments: AstNodeArray | undefined = undefined; // quick info - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + + /** @internal */ typeArguments: AstNodeArray | undefined = undefined; // quick info + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) } -/** @internal */ -export class ConstructSignatureDeclaration extends Node implements JSDocContainer, Declaration, LocalsContainer, ts.ConstructSignatureDeclaration { - declare readonly ast: AstConstructSignatureDeclaration; - - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - declare _typeElementBrand: any; - declare _localsContainerBrand: any; - - get typeParameters(): NodeArray | undefined { - return this.ast.data.typeParameters?.nodes; - } - set typeParameters(value) { - this.ast.data.typeParameters = value?.ast; - } - get parameters(): NodeArray { - return this.ast.data.parameters.nodes; - } - set parameters(value) { - this.ast.data.parameters = value.ast; - } - get type(): TypeNode | undefined { - return this.ast.data.type?.node; - } - set type(value) { - this.ast.data.type = value?.ast; - } - get typeArguments(): NodeArray | undefined { - return this.ast.data.typeArguments?.nodes; - } - set typeArguments(value) { - this.ast.data.typeArguments = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstConstructSignatureDeclarationData extends AstTypeScriptNodeData { typeParameters: AstNodeArray | undefined = undefined; parameters: AstNodeArray = undefined!; type: AstTypeNode | undefined = undefined; - typeArguments: AstNodeArray | undefined = undefined; // quick info - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; + + /** @internal */ typeArguments: AstNodeArray | undefined = undefined; // quick info + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; } -/** @internal */ -export class VariableDeclaration extends Node implements JSDocContainer, Declaration, ts.VariableDeclaration { - declare readonly ast: AstVariableDeclaration; - - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - - override get parent() { - return super.parent as VariableDeclarationList | CatchClause; - } - override set parent(value) { - super.parent = value; - } - - get name(): BindingName { - return this.ast.data.name.node; - } - set name(value: BindingName) { - this.ast.data.name = value.ast; - } - get exclamationToken(): ExclamationToken | undefined { - return this.ast.data.exclamationToken?.node; - } - set exclamationToken(value: ExclamationToken | undefined) { - this.ast.data.exclamationToken = value?.ast; - } - get type(): TypeNode | undefined { - return this.ast.data.type?.node; - } - set type(value: TypeNode | undefined) { - this.ast.data.type = value?.ast; - } - get initializer(): Expression | undefined { - return this.ast.data.initializer?.node; - } - set initializer(value: Expression | undefined) { - this.ast.data.initializer = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstVariableDeclarationData extends AstData { - name: AstBindingName = undefined!; - exclamationToken: AstExclamationToken | undefined = undefined; - type: AstTypeNode | undefined = undefined; - initializer: AstExpression | undefined = undefined; + name: AstBindingName = undefined!; // Declared variable name + exclamationToken: AstExclamationToken | undefined = undefined; // Optional definite assignment assertion + type: AstTypeNode | undefined = undefined; // Optional type annotation + initializer: AstExpression | undefined = undefined; // Optional initializer - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateNameFlags(this.name) | propagateChildFlags(this.initializer) | (this.exclamationToken ?? this.type ? TransformFlags.ContainsTypeScript : TransformFlags.None); } } -/** @internal */ -export class VariableDeclarationList extends Node implements ts.VariableDeclarationList { - declare readonly ast: AstVariableDeclarationList; - - override get parent() { - return super.parent as VariableStatement | ForStatement | ForOfStatement | ForInStatement; - } - override set parent(value) { - super.parent = value; - } - - get declarations(): NodeArray { - return this.ast.data.declarations.nodes; - } - set declarations(value) { - this.ast.data.declarations = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstVariableDeclarationListData extends AstData { declarations: AstNodeArray = undefined!; - override computeTransformFlags(node: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(node: AstNode): TransformFlags { let transformFlags = propagateChildrenFlags(this.declarations) | TransformFlags.ContainsHoistedDeclarationOrCompletion; if (node.flags & NodeFlags.BlockScoped) { @@ -3040,76 +1739,18 @@ export class AstVariableDeclarationListData extends AstData { } } -/** @internal */ -export class BindingElement extends Node implements Declaration, FlowContainer, ts.BindingElement { - declare readonly ast: AstBindingElement; - - declare _declarationBrand: any; - declare _flowContainerBrand: any; - - override get parent() { - return super.parent as BindingPattern; - } - override set parent(value) { - super.parent = value; - } - - get propertyName(): PropertyName | undefined { - return this.ast.data.propertyName?.node; - } - set propertyName(value) { - this.ast.data.propertyName = value?.ast; - } - get dotDotDotToken(): DotDotDotToken | undefined { - return this.ast.data.dotDotDotToken?.node; - } - set dotDotDotToken(value) { - this.ast.data.dotDotDotToken = value?.ast; - } - get name(): BindingName { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } - get initializer(): Expression | undefined { - return this.ast.data.initializer?.node; - } - set initializer(value) { - this.ast.data.initializer = value?.ast; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value: FlowNode | undefined) { - this.ast.data.flowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstBindingElementData extends AstData { - propertyName: AstPropertyName | undefined = undefined; - dotDotDotToken: AstDotDotDotToken | undefined = undefined; - name: AstBindingName = undefined!; - initializer: AstExpression | undefined = undefined; + propertyName: AstPropertyName | undefined = undefined; // Binding property name (in object binding pattern) + dotDotDotToken: AstDotDotDotToken | undefined = undefined; // Present on rest element (in object binding pattern) + name: AstBindingName = undefined!; // Declared binding element name + initializer: AstExpression | undefined = undefined; // Optional initializer - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.dotDotDotToken) | propagateNameFlags(this.propertyName) | propagateNameFlags(this.name) | @@ -3119,91 +1760,20 @@ export class AstBindingElementData extends AstData { } } -/** @internal */ -export class PropertyDeclaration extends Node implements JSDocContainer, Declaration, ts.PropertyDeclaration { - declare readonly ast: AstPropertyDeclaration; - - declare _classElementBrand: any; - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - - override get parent() { - return super.parent as ClassLikeDeclaration; - } - override set parent(value) { - super.parent = value; - } - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get name(): PropertyName { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } - get questionToken(): QuestionToken | undefined { - return this.ast.data.questionToken?.node; - } - set questionToken(value) { - this.ast.data.questionToken = value?.ast; - } - get exclamationToken(): ExclamationToken | undefined { - return this.ast.data.exclamationToken?.node; - } - set exclamationToken(value) { - this.ast.data.exclamationToken = value?.ast; - } - get type(): TypeNode | undefined { - return this.ast.data.type?.node; - } - set type(value) { - this.ast.data.type = value?.ast; - } - get initializer(): Expression | undefined { - return this.ast.data.initializer?.node; - } - set initializer(value) { - this.ast.data.initializer = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstPropertyDeclarationData extends AstData { modifiers: AstNodeArray | undefined = undefined; name: AstPropertyName = undefined!; - questionToken: AstQuestionToken | undefined = undefined; + questionToken: AstQuestionToken | undefined = undefined; // Optional field. indicates grammar error for auto-accessor generation (see `isGrammarError` in utilities.ts) exclamationToken: AstExclamationToken | undefined = undefined; - type: AstTypeNode | undefined = undefined; - initializer: AstExpression | undefined = undefined; + type: AstTypeNode | undefined = undefined; // Optional type annotation + initializer: AstExpression | undefined = undefined; // Optional initializer - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(node: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(node: AstNode): TransformFlags { const modifierFlags = modifiersToFlags(this.modifiers?.items); const isAmbient = node.flags & NodeFlags.Ambient || modifierFlags & ModifierFlags.Ambient; @@ -3216,276 +1786,69 @@ export class AstPropertyDeclarationData extends AstData { } } -/** @internal */ -export class PropertyAssignment extends Node implements ObjectLiteralElement, JSDocContainer, Declaration, ts.PropertyAssignment { - declare readonly ast: AstPropertyAssignment; - - declare _objectLiteralBrand: any; - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - - override get parent() { - return super.parent as ObjectLiteralExpression; - } - override set parent(value) { - super.parent = value; - } - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get name(): PropertyName { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } - get questionToken(): QuestionToken | undefined { - return this.ast.data.questionToken?.node; - } - set questionToken(value) { - this.ast.data.questionToken = value?.ast; - } - get exclamationToken(): ExclamationToken | undefined { - return this.ast.data.exclamationToken?.node; - } - set exclamationToken(value) { - this.ast.data.exclamationToken = value?.ast; - } - get initializer(): Expression { - return this.ast.data.initializer.node; - } - set initializer(value) { - this.ast.data.initializer = value.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstPropertyAssignmentData extends AstData { - modifiers: AstNodeArray | undefined = undefined; // initialized by parser (grammar error) + modifiers: AstNodeArray | undefined = undefined; // initialized by parser (grammar error) name: AstPropertyName = undefined!; - questionToken: AstQuestionToken | undefined = undefined; // initialized by parser (grammar error) - exclamationToken: AstExclamationToken | undefined = undefined; // initialized by parser (grammar error) + questionToken: AstQuestionToken | undefined = undefined; // initialized by parser (grammar error) + exclamationToken: AstExclamationToken | undefined = undefined; // initialized by parser (grammar error) initializer: AstExpression = undefined!; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateNameFlags(this.name) | propagateChildFlags(this.initializer); } } -/** @internal */ -export class ShorthandPropertyAssignment extends Node implements ObjectLiteralElement, JSDocContainer, Declaration, ts.ShorthandPropertyAssignment { - declare readonly ast: AstShorthandPropertyAssignment; - - declare _objectLiteralBrand: any; - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - - override get parent() { - return super.parent as ObjectLiteralExpression; - } - override set parent(value) { - super.parent = value; - } - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get name(): Identifier { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } - get questionToken(): QuestionToken | undefined { - return this.ast.data.questionToken?.node; - } - set questionToken(value) { - this.ast.data.questionToken = value?.ast; - } - get exclamationToken(): ExclamationToken | undefined { - return this.ast.data.exclamationToken?.node; - } - set exclamationToken(value) { - this.ast.data.exclamationToken = value?.ast; - } - get equalsToken(): EqualsToken | undefined { - return this.ast.data.equalsToken?.node; - } - set equalsToken(value) { - this.ast.data.equalsToken = value?.ast; - } - get objectAssignmentInitializer(): Expression | undefined { - return this.ast.data.objectAssignmentInitializer?.node; - } - set objectAssignmentInitializer(value) { - this.ast.data.objectAssignmentInitializer = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstShorthandPropertyAssignmentData extends AstData { - modifiers: AstNodeArray | undefined = undefined; // initialized by parser (grammar error) name: AstIdentifier = undefined!; - questionToken: AstQuestionToken | undefined = undefined; // initialized by parser (grammar error) - exclamationToken: AstExclamationToken | undefined = undefined; // initialized by parser (grammar error) - equalsToken: AstEqualsToken | undefined = undefined; // initialized by parser (grammar error) + // used when ObjectLiteralExpression is used in ObjectAssignmentPattern + // it is a grammar error to appear in actual object initializer (see `isGrammarError` in utilities.ts): + equalsToken: AstEqualsToken | undefined = undefined; // initialized by parser (grammar error) objectAssignmentInitializer: AstExpression | undefined = undefined; + modifiers: AstNodeArray | undefined = undefined; // initialized by parser (grammar error) + questionToken: AstQuestionToken | undefined = undefined; // initialized by parser (grammar error) + exclamationToken: AstExclamationToken | undefined = undefined; // initialized by parser (grammar error) - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateIdentifierNameFlags(this.name) | propagateChildFlags(this.objectAssignmentInitializer) | TransformFlags.ContainsES2015; } } -/** @internal */ -export class SpreadAssignment extends Node implements ObjectLiteralElement, JSDocContainer, Declaration, ts.SpreadAssignment { - declare readonly ast: AstSpreadAssignment; - - declare _objectLiteralBrand: any; - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - - override get parent() { - return super.parent as ObjectLiteralExpression; - } - override set parent(value) { - super.parent = value; - } - - get expression(): Expression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstSpreadAssignmentData extends AstData { expression: AstExpression = undefined!; - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.expression) | TransformFlags.ContainsES2018 | TransformFlags.ContainsObjectRestOrSpread; } } -/** @internal */ -export type BindingPattern = - | ObjectBindingPattern - | ArrayBindingPattern; - -/** @internal */ export type AstBindingPattern = AstNodeOneOf; - -/** @internal */ -export type ArrayBindingElement = - | BindingElement - | OmittedExpression; - -/** @internal */ export type AstArrayBindingElement = AstNodeOneOf; -/** @internal */ -export class ObjectBindingPattern extends Node implements ts.ObjectBindingPattern { - declare readonly ast: AstObjectBindingPattern; - - override get parent() { - return super.parent as VariableDeclaration | ParameterDeclaration | BindingElement; - } - override set parent(value) { - super.parent = value; - } - - get elements(): NodeArray { - return this.ast.data.elements.nodes; - } - set elements(value) { - this.ast.data.elements = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstObjectBindingPatternData extends AstData { elements: AstNodeArray = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { let transformFlags = propagateChildrenFlags(this.elements) | TransformFlags.ContainsES2015 | TransformFlags.ContainsBindingPattern; @@ -3496,139 +1859,18 @@ export class AstObjectBindingPatternData extends AstData { } } -/** @internal */ -export class ArrayBindingPattern extends Node implements ts.ArrayBindingPattern { - declare readonly ast: AstArrayBindingPattern; - - override get parent() { - return super.parent as VariableDeclaration | ParameterDeclaration | BindingElement; - } - override set parent(value) { - super.parent = value; - } - - get elements(): NodeArray { - return this.ast.data.elements.nodes; - } - set elements(value) { - this.ast.data.elements = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstArrayBindingPatternData extends AstData { elements: AstNodeArray = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildrenFlags(this.elements) | TransformFlags.ContainsES2015 | TransformFlags.ContainsBindingPattern; } } -/** @internal */ -export class FunctionDeclaration extends Node implements JSDocContainer, Declaration, LocalsContainer, ts.FunctionDeclaration { - declare readonly ast: AstFunctionDeclaration; - - declare _functionLikeDeclarationBrand: any; - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - declare _statementBrand: any; - declare _localsContainerBrand: any; - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get asteriskToken(): AsteriskToken | undefined { - return this.ast.data.asteriskToken?.node; - } - set asteriskToken(value) { - this.ast.data.asteriskToken = value?.ast; - } - get name(): Identifier | undefined { - return this.ast.data.name?.node; - } - set name(value) { - this.ast.data.name = value?.ast; - } - get typeParameters(): NodeArray | undefined { - return this.ast.data.typeParameters?.nodes; - } - set typeParameters(value) { - this.ast.data.typeParameters = value?.ast; - } - get parameters(): NodeArray { - return this.ast.data.parameters.nodes; - } - set parameters(value) { - this.ast.data.parameters = value.ast; - } - get type(): TypeNode | undefined { - return this.ast.data.type?.node; - } - set type(value) { - this.ast.data.type = value?.ast; - } - get body(): Block | undefined { - return this.ast.data.body?.node; - } - set body(value) { - this.ast.data.body = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } - get endFlowNode(): ts.FlowNode | undefined { - return this.ast.data.endFlowNode; - } - set endFlowNode(value) { - this.ast.data.endFlowNode = value; - } - get returnFlowNode(): ts.FlowNode | undefined { - return this.ast.data.returnFlowNode; - } - set returnFlowNode(value) { - this.ast.data.returnFlowNode = value; - } - get typeArguments(): NodeArray | undefined { - return this.ast.data.typeArguments?.nodes; // Used for quick info, replaces typeParameters for instantiated signatures - } - set typeArguments(value) { - this.ast.data.typeArguments = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstFunctionDeclarationData extends AstData { modifiers: AstNodeArray | undefined = undefined; asteriskToken: AstAsteriskToken | undefined = undefined; @@ -3637,17 +1879,17 @@ export class AstFunctionDeclarationData extends AstData { parameters: AstNodeArray = undefined!; type: AstTypeNode | undefined = undefined; body: AstFunctionBody | undefined = undefined; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; - endFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - returnFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; + /** @internal */ endFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ returnFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) /** @internal */ typeArguments: AstNodeArray | undefined = undefined; // Used for quick info, replaces typeParameters for instantiated signatures - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { if (!this.body || modifiersToFlags(this.modifiers?.items) & ModifierFlags.Ambient) { return TransformFlags.ContainsTypeScript; } @@ -3673,97 +1915,7 @@ export class AstFunctionDeclarationData extends AstData { } } -/** @internal */ -export class MethodSignature extends Node implements JSDocContainer, Declaration, LocalsContainer, ts.MethodSignature { - declare readonly ast: AstMethodSignature; - - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - declare _typeElementBrand: any; - declare _localsContainerBrand: any; - - override get parent() { - return super.parent as TypeLiteralNode | InterfaceDeclaration; - } - override set parent(value) { - super.parent = value; - } - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get name(): PropertyName { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } - get questionToken(): QuestionToken | undefined { - return this.ast.data.questionToken?.node; - } - set questionToken(value) { - this.ast.data.questionToken = value?.ast; - } - get typeParameters(): NodeArray | undefined { - return this.ast.data.typeParameters?.nodes; - } - set typeParameters(value) { - this.ast.data.typeParameters = value?.ast; - } - get parameters(): NodeArray { - return this.ast.data.parameters.nodes; - } - set parameters(value) { - this.ast.data.parameters = value.ast; - } - get type(): TypeNode | undefined { - return this.ast.data.type?.node; - } - set type(value) { - this.ast.data.type = value?.ast; - } - get typeArguments(): NodeArray | undefined { - return this.ast.data.typeArguments?.nodes; - } - set typeArguments(value) { - this.ast.data.typeArguments = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstMethodSignatureData extends AstTypeScriptNodeData { modifiers: AstNodeArray | undefined = undefined; name: AstPropertyName = undefined!; @@ -3772,144 +1924,15 @@ export class AstMethodSignatureData extends AstTypeScriptNodeData { parameters: AstNodeArray = undefined!; type: AstTypeNode | undefined = undefined; - typeArguments: AstNodeArray | undefined = undefined; // quick info - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; + /** @internal */ typeArguments: AstNodeArray | undefined = undefined; // quick info + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; } -/** @internal */ -export class MethodDeclaration extends Node implements JSDocContainer, Declaration, LocalsContainer, FlowContainer, ts.MethodDeclaration { - declare readonly ast: AstMethodDeclaration; - - declare _functionLikeDeclarationBrand: any; - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - declare _classElementBrand: any; - declare _objectLiteralBrand: any; - declare _localsContainerBrand: any; - declare _flowContainerBrand: any; - - override get parent() { - return super.parent as ClassLikeDeclaration | ObjectLiteralExpression; - } - override set parent(value) { - super.parent = value; - } - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get asteriskToken(): AsteriskToken | undefined { - return this.ast.data.asteriskToken?.node; - } - set asteriskToken(value) { - this.ast.data.asteriskToken = value?.ast; - } - get name(): PropertyName { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } - get questionToken(): QuestionToken | undefined { - return this.ast.data.questionToken?.node; - } - set questionToken(value) { - this.ast.data.questionToken = value?.ast; - } - get exclamationToken(): ExclamationToken | undefined { - return this.ast.data.exclamationToken?.node; - } - set exclamationToken(value) { - this.ast.data.exclamationToken = value?.ast; - } - get typeParameters(): NodeArray | undefined { - return this.ast.data.typeParameters?.nodes; - } - set typeParameters(value) { - this.ast.data.typeParameters = value?.ast; - } - get parameters(): NodeArray { - return this.ast.data.parameters.nodes; - } - set parameters(value) { - this.ast.data.parameters = value.ast; - } - get type(): TypeNode | undefined { - return this.ast.data.type?.node; - } - set type(value) { - this.ast.data.type = value?.ast; - } - get body(): Block | undefined { - return this.ast.data.body?.node; - } - set body(value) { - this.ast.data.body = value?.ast; - } - get typeArguments(): NodeArray | undefined { - return this.ast.data.typeArguments?.nodes; - } - set typeArguments(value) { - this.ast.data.typeArguments = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value: FlowNode | undefined) { - this.ast.data.flowNode = value; - } - get endFlowNode(): ts.FlowNode | undefined { - return this.ast.data.endFlowNode; - } - set endFlowNode(value) { - this.ast.data.endFlowNode = value; - } - get returnFlowNode(): ts.FlowNode | undefined { - return this.ast.data.returnFlowNode; - } - set returnFlowNode(value) { - this.ast.data.returnFlowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstMethodDeclarationData extends AstData { modifiers: AstNodeArray | undefined = undefined; asteriskToken: AstAsteriskToken | undefined = undefined; @@ -3920,18 +1943,18 @@ export class AstMethodDeclarationData extends AstData { parameters: AstNodeArray = undefined!; type: AstTypeNode | undefined = undefined; body: AstFunctionBody | undefined = undefined; - typeArguments: AstNodeArray | undefined = undefined; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - endFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - returnFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ typeArguments: AstNodeArray | undefined = undefined; + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ endFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ returnFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { if (!this.body) { return TransformFlags.ContainsTypeScript; } @@ -3958,121 +1981,24 @@ export class AstMethodDeclarationData extends AstData { } } -/** @internal */ -export class ConstructorDeclaration extends Node implements JSDocContainer, Declaration, LocalsContainer, ts.ConstructorDeclaration { - declare readonly ast: AstConstructorDeclaration; - - declare _functionLikeDeclarationBrand: any; - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - declare _classElementBrand: any; - declare _localsContainerBrand: any; - - override get parent() { - return super.parent as ClassLikeDeclaration; - } - override set parent(value) { - super.parent = value; - } - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get body(): Block | undefined { - return this.ast.data.body?.node; - } - set body(value) { - this.ast.data.body = value?.ast; - } - get typeParameters(): NodeArray | undefined { - return this.ast.data.typeParameters?.nodes; - } - set typeParameters(value) { - this.ast.data.typeParameters = value?.ast; - } - get parameters(): NodeArray { - return this.ast.data.parameters.nodes; - } - set parameters(value) { - this.ast.data.parameters = value.ast; - } - get type(): TypeNode | undefined { - return this.ast.data.type?.node; - } - set type(value) { - this.ast.data.type = value?.ast; - } - get typeArguments(): NodeArray | undefined { - return this.ast.data.typeArguments?.nodes; - } - set typeArguments(value) { - this.ast.data.typeArguments = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } - get endFlowNode(): ts.FlowNode | undefined { - return this.ast.data.endFlowNode; - } - set endFlowNode(value) { - this.ast.data.endFlowNode = value; - } - get returnFlowNode(): ts.FlowNode | undefined { - return this.ast.data.returnFlowNode; - } - set returnFlowNode(value) { - this.ast.data.returnFlowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstConstructorDeclarationData extends AstData { modifiers: AstNodeArray | undefined = undefined; body: AstFunctionBody | undefined = undefined; typeParameters: AstNodeArray | undefined = undefined; // initialized by parser (grammar error) parameters: AstNodeArray = undefined!; type: AstTypeNode | undefined = undefined; // initialized by parser (grammar error) - typeArguments: AstNodeArray | undefined = undefined; // quick info - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; - endFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - returnFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ typeArguments: AstNodeArray | undefined = undefined; // quick info + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; + /** @internal */ endFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ returnFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { if (!this.body) { return TransformFlags.ContainsTypeScript; } @@ -4085,153 +2011,16 @@ export class AstConstructorDeclarationData extends AstData { } } -/** @internal */ -export class SemicolonClassElement extends Node implements JSDocContainer, ts.SemicolonClassElement { - declare readonly ast: AstSemicolonClassElement; - - declare _classElementBrand: any; - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - declare symbol: never; - declare localSymbol: never; - - override get parent() { - return super.parent as ClassLikeDeclaration; - } - override set parent(value) { - super.parent = value; - } - - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } -} - -/** @internal */ +// dprint-ignore export class AstSemicolonClassElementData extends AstData { - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return TransformFlags.None; } } -/** @internal */ -export class GetAccessorDeclaration extends Node implements JSDocContainer, Declaration, LocalsContainer, FlowContainer, ts.GetAccessorDeclaration { - declare readonly ast: AstGetAccessorDeclaration; - - declare _functionLikeDeclarationBrand: any; - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - declare _classElementBrand: any; - declare _typeElementBrand: any; - declare _objectLiteralBrand: any; - declare _localsContainerBrand: any; - declare _flowContainerBrand: any; - - override get parent() { - return super.parent as ClassLikeDeclaration | ObjectLiteralExpression; - } - override set parent(value) { - super.parent = value; - } - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get name(): PropertyName { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } - get body(): Block | undefined { - return this.ast.data.body?.node; - } - set body(value) { - this.ast.data.body = value?.ast; - } - get typeParameters(): NodeArray | undefined { - return this.ast.data.typeParameters?.nodes; - } - set typeParameters(value) { - this.ast.data.typeParameters = value?.ast; - } - get parameters(): NodeArray { - return this.ast.data.parameters.nodes; - } - set parameters(value) { - this.ast.data.parameters = value.ast; - } - get type(): TypeNode | undefined { - return this.ast.data.type?.node; - } - set type(value) { - this.ast.data.type = value?.ast; - } - get typeArguments(): NodeArray | undefined { - return this.ast.data.typeArguments?.nodes; - } - set typeArguments(value) { - this.ast.data.typeArguments = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value: FlowNode | undefined) { - this.ast.data.flowNode = value; - } - get endFlowNode(): ts.FlowNode | undefined { - return this.ast.data.endFlowNode; - } - set endFlowNode(value) { - this.ast.data.endFlowNode = value; - } - get returnFlowNode(): ts.FlowNode | undefined { - return this.ast.data.returnFlowNode; - } - set returnFlowNode(value) { - this.ast.data.returnFlowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstGetAccessorDeclarationData extends AstData { modifiers: AstNodeArray | undefined = undefined; name: AstPropertyName = undefined!; @@ -4239,18 +2028,18 @@ export class AstGetAccessorDeclarationData extends AstData { typeParameters: AstNodeArray | undefined = undefined; // initialized by parser (grammar error) parameters: AstNodeArray = undefined!; type: AstTypeNode | undefined = undefined; - typeArguments: AstNodeArray | undefined = undefined; // quick info - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - endFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - returnFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ typeArguments: AstNodeArray | undefined = undefined; // quick info + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ endFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ returnFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { if (!this.body) { return TransformFlags.ContainsTypeScript; } @@ -4265,119 +2054,7 @@ export class AstGetAccessorDeclarationData extends AstData { } } -/** @internal */ -export class SetAccessorDeclaration extends Node implements JSDocContainer, Declaration, LocalsContainer, FlowContainer, ts.SetAccessorDeclaration { - declare readonly ast: AstSetAccessorDeclaration; - - declare _functionLikeDeclarationBrand: any; - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - declare _classElementBrand: any; - declare _typeElementBrand: any; - declare _objectLiteralBrand: any; - declare _localsContainerBrand: any; - declare _flowContainerBrand: any; - - override get parent() { - return super.parent as ClassLikeDeclaration | ObjectLiteralExpression; - } - override set parent(value) { - super.parent = value; - } - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get name(): PropertyName { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } - get body(): Block | undefined { - return this.ast.data.body?.node; - } - set body(value) { - this.ast.data.body = value?.ast; - } - get typeParameters(): NodeArray | undefined { - return this.ast.data.typeParameters?.nodes; - } - set typeParameters(value) { - this.ast.data.typeParameters = value?.ast; - } - get parameters(): NodeArray { - return this.ast.data.parameters.nodes; - } - set parameters(value) { - this.ast.data.parameters = value.ast; - } - get type(): TypeNode | undefined { - return this.ast.data.type?.node; - } - set type(value) { - this.ast.data.type = value?.ast; - } - get typeArguments(): NodeArray | undefined { - return this.ast.data.typeArguments?.nodes; - } - set typeArguments(value) { - this.ast.data.typeArguments = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value: FlowNode | undefined) { - this.ast.data.flowNode = value; - } - get endFlowNode(): ts.FlowNode | undefined { - return this.ast.data.endFlowNode; - } - set endFlowNode(value) { - this.ast.data.endFlowNode = value; - } - get returnFlowNode(): ts.FlowNode | undefined { - return this.ast.data.returnFlowNode; - } - set returnFlowNode(value) { - this.ast.data.returnFlowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstSetAccessorDeclarationData extends AstData { modifiers: AstNodeArray | undefined = undefined; name: AstPropertyName = undefined!; @@ -4385,18 +2062,18 @@ export class AstSetAccessorDeclarationData extends AstData { typeParameters: AstNodeArray | undefined = undefined; // initialized by parser (grammar error) parameters: AstNodeArray = undefined!; type: AstTypeNode | undefined = undefined; // initialized by parser (grammar error) - typeArguments: AstNodeArray | undefined = undefined; // quick info - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - endFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - returnFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ typeArguments: AstNodeArray | undefined = undefined; // quick info + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ endFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ returnFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { if (!this.body) { return TransformFlags.ContainsTypeScript; } @@ -4410,288 +2087,55 @@ export class AstSetAccessorDeclarationData extends AstData { } } -/** @internal */ -export type AccessorDeclaration = - | GetAccessorDeclaration - | SetAccessorDeclaration; - -/** @internal */ export type AstAccessorDeclaration = AstNodeOneOf; -/** @internal */ -export class IndexSignatureDeclaration extends Node implements JSDocContainer, Declaration, LocalsContainer, ts.IndexSignatureDeclaration { - declare readonly ast: AstIndexSignatureDeclaration; - - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - declare _classElementBrand: any; - declare _typeElementBrand: any; - declare _localsContainerBrand: any; - - override get parent() { - return super.parent as ObjectTypeDeclaration; - } - override set parent(value) { - super.parent = value; - } - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get typeParameters(): NodeArray | undefined { - return this.ast.data.typeParameters?.nodes; - } - set typeParameters(value) { - this.ast.data.typeParameters = value?.ast; - } - get parameters(): NodeArray { - return this.ast.data.parameters.nodes; - } - set parameters(value) { - this.ast.data.parameters = value.ast; - } - get type(): TypeNode { - return this.ast.data.type?.node!; - } - set type(value) { - this.ast.data.type = value?.ast; - } - get typeArguments(): NodeArray | undefined { - return this.ast.data.typeArguments?.nodes; - } - set typeArguments(value) { - this.ast.data.typeArguments = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstIndexSignatureDeclarationData extends AstTypeScriptNodeData { modifiers: AstNodeArray | undefined = undefined; typeParameters: AstNodeArray | undefined = undefined; parameters: AstNodeArray = undefined!; type: AstTypeNode | undefined = undefined; - typeArguments: AstNodeArray | undefined = undefined; // quick info - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; + /** @internal */ typeArguments: AstNodeArray | undefined = undefined; // quick info + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; } -/** @internal */ -export class ClassStaticBlockDeclaration extends Node implements JSDocContainer, Declaration, LocalsContainer, ts.ClassStaticBlockDeclaration { - declare readonly ast: AstClassStaticBlockDeclaration; - - declare _classElementBrand: any; - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - declare _localsContainerBrand: any; - - override get parent() { - return super.parent as ClassLikeDeclaration; - } - override set parent(value) { - super.parent = value; - } - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get body(): Block { - return this.ast.data.body.node; - } - set body(value) { - this.ast.data.body = value.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } - get endFlowNode(): ts.FlowNode | undefined { - return this.ast.data.endFlowNode; - } - set endFlowNode(value) { - this.ast.data.endFlowNode = value; - } - get returnFlowNode(): ts.FlowNode | undefined { - return this.ast.data.returnFlowNode; - } - set returnFlowNode(value) { - this.ast.data.returnFlowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstClassStaticBlockDeclarationData extends AstData { body: AstBlock = undefined!; modifiers: AstNodeArray | undefined = undefined; // initialized by parser (grammar error) - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; - endFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - returnFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; + /** @internal */ endFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ returnFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.body) | TransformFlags.ContainsClassFields; } } /** * @deprecated - * @internal - */ -export class ImportTypeAssertionContainer extends Node implements ts.ImportTypeAssertionContainer { - declare readonly ast: AstImportTypeAssertionContainer; - - override get parent() { - return super.parent as ImportTypeNode; - } - override set parent(value) { - super.parent = value; - } - - /** @deprecated */ - get assertClause(): ImportAttributes { - return this.ast.data.assertClause.node; - } - set assertClause(value) { - this.ast.data.assertClause = value.ast; - } - get multiLine(): boolean { - return this.ast.data.multiLine; - } - set multiLine(value) { - this.ast.data.multiLine = value; - } -} - -/** - * @deprecated - * @internal */ export type AstImportTypeAssertionContainer = AstNode; /** * @deprecated - * @internal */ export class AstImportTypeAssertionContainerData extends AstTypeScriptNodeData { assertClause: AstImportAttributes = undefined!; multiLine: boolean = false; } -/** @internal */ -export class ImportTypeNode extends Node implements ts.ImportTypeNode { - declare readonly ast: AstImportTypeNode; - - declare _typeNodeBrand: any; - - get isTypeOf(): boolean { - return this.ast.data.isTypeOf; - } - set isTypeOf(value) { - this.ast.data.isTypeOf = value; - } - get argument(): TypeNode { - return this.ast.data.argument.node; - } - set argument(value) { - this.ast.data.argument = value.ast; - } - /** @deprecated */ - get attributes(): ImportAttributes | undefined { - return this.ast.data.attributes?.node; - } - set attributes(value) { - this.ast.data.attributes = value?.ast; - } - get assertions(): ImportTypeAssertionContainer | undefined { - return this.ast.data.assertions?.node; - } - set assertions(value) { - this.ast.data.assertions = value?.ast; - } - get qualifier(): Identifier | QualifiedName | undefined { - return this.ast.data.qualifier?.node; - } - set qualifier(value) { - this.ast.data.qualifier = value?.ast; - } - get typeArguments(): NodeArray | undefined { - return this.ast.data.typeArguments?.nodes; - } - set typeArguments(value) { - this.ast.data.typeArguments = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstImportTypeNodeData extends AstTypeScriptNodeData { isTypeOf: boolean = false; argument: AstTypeNode = undefined!; @@ -4701,735 +2145,149 @@ export class AstImportTypeNodeData extends AstTypeScriptNodeData { typeArguments: AstNodeArray | undefined = undefined; } -/** @internal */ -export interface KeywordTypeNode extends KeywordToken, TypeNode { - readonly ast: AstKeywordTypeNode; - readonly kind: TKind; - _typeNodeBrand: any; -} +export type AstKeywordTypeNode = AstNode>; -/** @internal */ -export type AstKeywordTypeNode = AstNode>; - -/** @internal */ -export class ThisTypeNode extends Node implements ts.ThisTypeNode { - declare readonly ast: AstThisTypeNode; - - declare _typeNodeBrand: any; -} - -/** @internal */ +// dprint-ignore export class AstThisTypeNodeData extends AstTypeScriptNodeData { } -/** @internal */ -export type FunctionOrConstructorTypeNode = - | FunctionTypeNode - | ConstructorTypeNode; - -/** @internal */ export type AstFunctionOrConstructorTypeNode = AstNodeOneOf; -/** @internal */ -export class FunctionTypeNode extends Node implements JSDocContainer, Declaration, LocalsContainer, ts.FunctionTypeNode { - declare readonly ast: AstFunctionTypeNode; - - declare _typeNodeBrand: any; - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - declare _localsContainerBrand: any; - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get typeParameters(): NodeArray | undefined { - return this.ast.data.typeParameters?.nodes; - } - set typeParameters(value) { - this.ast.data.typeParameters = value?.ast; - } - get parameters(): NodeArray { - return this.ast.data.parameters.nodes; - } - set parameters(value) { - this.ast.data.parameters = value.ast; - } - get type(): TypeNode { - return this.ast.data.type.node; - } - set type(value) { - this.ast.data.type = value.ast; - } - get typeArguments(): NodeArray | undefined { - return this.ast.data.typeArguments?.nodes; - } - set typeArguments(value) { - this.ast.data.typeArguments = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstFunctionTypeNodeData extends AstTypeScriptNodeData { modifiers: AstNodeArray | undefined = undefined; // initialized by parser (grammar error) typeParameters: AstNodeArray | undefined = undefined; parameters: AstNodeArray = undefined!; type: AstTypeNode = undefined!; - typeArguments: AstNodeArray | undefined = undefined; // quick info - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; + /** @internal */ typeArguments: AstNodeArray | undefined = undefined; // quick info + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; } -/** @internal */ -export class ConstructorTypeNode extends Node implements JSDocContainer, Declaration, LocalsContainer, ts.ConstructorTypeNode { - declare readonly ast: AstConstructorTypeNode; - - declare _typeNodeBrand: any; - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - declare _localsContainerBrand: any; - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get typeParameters(): NodeArray | undefined { - return this.ast.data.typeParameters?.nodes; - } - set typeParameters(value) { - this.ast.data.typeParameters = value?.ast; - } - get parameters(): NodeArray { - return this.ast.data.parameters.nodes; - } - set parameters(value) { - this.ast.data.parameters = value.ast; - } - get type(): TypeNode { - return this.ast.data.type.node; - } - set type(value) { - this.ast.data.type = value.ast; - } - get typeArguments(): NodeArray | undefined { - return this.ast.data.typeArguments?.nodes; - } - set typeArguments(value) { - this.ast.data.typeArguments = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstConstructorTypeNodeData extends AstTypeScriptNodeData { modifiers: AstNodeArray | undefined = undefined; typeParameters: AstNodeArray | undefined = undefined; parameters: AstNodeArray = undefined!; type: AstTypeNode = undefined!; - typeArguments: AstNodeArray | undefined = undefined; // quick info - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; + /** @internal */ typeArguments: AstNodeArray | undefined = undefined; // quick info + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; } -/** @internal */ -export class TypeReferenceNode extends Node implements ts.TypeReferenceNode { - declare readonly ast: AstTypeReferenceNode; - - declare _typeNodeBrand: any; - - get typeName(): Identifier | QualifiedName { - return this.ast.data.typeName.node; - } - set typeName(value) { - this.ast.data.typeName = value.ast; - } - get typeArguments(): NodeArray | undefined { - return this.ast.data.typeArguments?.nodes; - } - set typeArguments(value) { - this.ast.data.typeArguments = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstTypeReferenceNodeData extends AstTypeScriptNodeData { typeName: AstEntityName = undefined!; typeArguments: AstNodeArray | undefined = undefined; } -/** @internal */ -export class TypePredicateNode extends Node implements ts.TypePredicateNode { - declare readonly ast: AstTypePredicateNode; - - declare _typeNodeBrand: any; - - override get parent() { - return super.parent as SignatureDeclaration | JSDocTypeExpression; - } - override set parent(value) { - super.parent = value; - } - - get assertsModifier(): AssertsKeyword | undefined { - return this.ast.data.assertsModifier?.node; - } - set assertsModifier(value) { - this.ast.data.assertsModifier = value?.ast; - } - get parameterName(): Identifier | ThisTypeNode { - return this.ast.data.parameterName.node; - } - set parameterName(value) { - this.ast.data.parameterName = value.ast; - } - get type(): TypeNode | undefined { - return this.ast.data.type?.node; - } - set type(value) { - this.ast.data.type = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstTypePredicateNodeData extends AstTypeScriptNodeData { assertsModifier: AstAssertsKeyword | undefined = undefined; parameterName: AstIdentifier | AstThisTypeNode = undefined!; type: AstTypeNode | undefined = undefined; } -/** @internal */ -export class TypeQueryNode extends Node implements ts.TypeQueryNode { - declare readonly ast: AstTypeQueryNode; - - declare _typeNodeBrand: any; - - get exprName(): Identifier | QualifiedName { - return this.ast.data.exprName.node; - } - set exprName(value) { - this.ast.data.exprName = value.ast; - } - get typeArguments(): NodeArray | undefined { - return this.ast.data.typeArguments?.nodes; - } - set typeArguments(value) { - this.ast.data.typeArguments = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstTypeQueryNodeData extends AstTypeScriptNodeData { exprName: AstEntityName = undefined!; typeArguments: AstNodeArray | undefined = undefined; } -/** @internal */ -export class TypeLiteralNode extends Node implements Declaration, ts.TypeLiteralNode { - declare readonly ast: AstTypeLiteralNode; - - declare _typeNodeBrand: any; - declare _declarationBrand: any; - - get members(): NodeArray { - return this.ast.data.members.nodes; - } - set members(value) { - this.ast.data.members = value.ast; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstTypeLiteralNodeData extends AstTypeScriptNodeData { members: AstNodeArray = undefined!; - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) } -/** @internal */ -export class ArrayTypeNode extends Node implements ts.ArrayTypeNode { - declare readonly ast: AstArrayTypeNode; - - declare _typeNodeBrand: any; - - get elementType(): TypeNode { - return this.ast.data.elementType.node; - } - set elementType(value) { - this.ast.data.elementType = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstArrayTypeNodeData extends AstTypeScriptNodeData { elementType: AstTypeNode = undefined!; } -/** @internal */ -export class TupleTypeNode extends Node implements ts.TupleTypeNode { - declare readonly ast: AstTupleTypeNode; - - declare _typeNodeBrand: any; - - get elements(): NodeArray { - return this.ast.data.elements.nodes; - } - set elements(value: NodeArray) { - this.ast.data.elements = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstTupleTypeNodeData extends AstTypeScriptNodeData { elements: AstNodeArray = undefined!; } -/** @internal */ -export class NamedTupleMember extends Node implements JSDocContainer, Declaration, ts.NamedTupleMember { - declare readonly ast: AstNamedTupleMember; - - declare _typeNodeBrand: any; - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - - get dotDotDotToken(): DotDotDotToken | undefined { - return this.ast.data.dotDotDotToken?.node; - } - set dotDotDotToken(value) { - this.ast.data.dotDotDotToken = value?.ast; - } - get name(): Identifier { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } - get questionToken(): QuestionToken | undefined { - return this.ast.data.questionToken?.node; - } - set questionToken(value) { - this.ast.data.questionToken = value?.ast; - } - get type(): TypeNode { - return this.ast.data.type.node; - } - set type(value) { - this.ast.data.type = value.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstNamedTupleMemberData extends AstTypeScriptNodeData { dotDotDotToken: AstDotDotDotToken | undefined = undefined; name: AstIdentifier = undefined!; questionToken: AstQuestionToken | undefined = undefined; type: AstTypeNode = undefined!; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) } -/** @internal */ -export class OptionalTypeNode extends Node implements ts.OptionalTypeNode { - declare readonly ast: AstOptionalTypeNode; - - declare _typeNodeBrand: any; - - get type(): TypeNode { - return this.ast.data.type.node; - } - set type(value) { - this.ast.data.type = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstOptionalTypeNodeData extends AstTypeScriptNodeData { type: AstTypeNode = undefined!; } -/** @internal */ -export class RestTypeNode extends Node implements ts.RestTypeNode { - declare readonly ast: AstRestTypeNode; - - declare _typeNodeBrand: any; - - get type(): TypeNode { - return this.ast.data.type.node; - } - set type(value) { - this.ast.data.type = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstRestTypeNodeData extends AstTypeScriptNodeData { type: AstTypeNode = undefined!; } -/** @internal */ -export type UnionOrIntersectionTypeNode = - | UnionTypeNode - | IntersectionTypeNode; - -/** @internal */ export type AstUnionOrIntersectionTypeNode = AstNodeOneOf; -/** @internal */ -export class UnionTypeNode extends Node implements ts.UnionTypeNode { - declare readonly ast: AstUnionTypeNode; - - declare _typeNodeBrand: any; - - get types(): NodeArray { - return this.ast.data.types.nodes; - } - set types(value) { - this.ast.data.types = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstUnionTypeNodeData extends AstTypeScriptNodeData { types: AstNodeArray = undefined!; } -/** @internal */ -export class IntersectionTypeNode extends Node implements ts.IntersectionTypeNode { - declare readonly ast: AstIntersectionTypeNode; - - declare _typeNodeBrand: any; - - get types(): NodeArray { - return this.ast.data.types.nodes; - } - set types(value) { - this.ast.data.types = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstIntersectionTypeNodeData extends AstTypeScriptNodeData { types: AstNodeArray = undefined!; } -/** @internal */ -export class ConditionalTypeNode extends Node implements LocalsContainer, ts.ConditionalTypeNode { - declare readonly ast: AstConditionalTypeNode; - - declare _typeNodeBrand: any; - declare _localsContainerBrand: any; - - get checkType(): TypeNode { - return this.ast.data.checkType.node; - } - set checkType(value) { - this.ast.data.checkType = value.ast; - } - get extendsType(): TypeNode { - return this.ast.data.extendsType.node; - } - set extendsType(value) { - this.ast.data.extendsType = value.ast; - } - get trueType(): TypeNode { - return this.ast.data.trueType.node; - } - set trueType(value) { - this.ast.data.trueType = value.ast; - } - get falseType(): TypeNode { - return this.ast.data.falseType.node; - } - set falseType(value) { - this.ast.data.falseType = value.ast; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstConditionalTypeNodeData extends AstTypeScriptNodeData { checkType: AstTypeNode = undefined!; extendsType: AstTypeNode = undefined!; trueType: AstTypeNode = undefined!; falseType: AstTypeNode = undefined!; - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; + + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; } -/** @internal */ -export class InferTypeNode extends Node implements ts.InferTypeNode { - declare readonly ast: AstInferTypeNode; - - declare _typeNodeBrand: any; - - get typeParameter(): TypeParameterDeclaration { - return this.ast.data.typeParameter.node; - } - set typeParameter(value) { - this.ast.data.typeParameter = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstInferTypeNodeData extends AstTypeScriptNodeData { typeParameter: AstTypeParameterDeclaration = undefined!; } -/** @internal */ -export class ParenthesizedTypeNode extends Node implements ts.ParenthesizedTypeNode { - declare readonly ast: AstParenthesizedTypeNode; - - declare _typeNodeBrand: any; - - get type(): TypeNode { - return this.ast.data.type.node; - } - set type(value) { - this.ast.data.type = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstParenthesizedTypeNodeData extends AstTypeScriptNodeData { type: AstTypeNode = undefined!; } -/** @internal */ -export class TypeOperatorNode extends Node implements ts.TypeOperatorNode { - declare readonly ast: AstTypeOperatorNode; - - declare _typeNodeBrand: any; - - get operator(): ts.SyntaxKind.KeyOfKeyword | ts.SyntaxKind.ReadonlyKeyword | ts.SyntaxKind.UniqueKeyword { - return this.ast.data.operator; - } - set operator(value) { - this.ast.data.operator = value; - } - get type(): TypeNode { - return this.ast.data.type.node; - } - set type(value) { - this.ast.data.type = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstTypeOperatorNodeData extends AstTypeScriptNodeData { operator: SyntaxKind.KeyOfKeyword | SyntaxKind.UniqueKeyword | SyntaxKind.ReadonlyKeyword = undefined!; type: AstTypeNode = undefined!; } -/** @internal */ -export class IndexedAccessTypeNode extends Node implements ts.IndexedAccessTypeNode { - declare readonly ast: AstIndexedAccessTypeNode; - - declare _typeNodeBrand: any; - - get objectType(): TypeNode { - return this.ast.data.objectType.node; - } - set objectType(value) { - this.ast.data.objectType = value.ast; - } - get indexType(): TypeNode { - return this.ast.data.indexType.node; - } - set indexType(value) { - this.ast.data.indexType = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstIndexedAccessTypeNodeData extends AstTypeScriptNodeData { objectType: AstTypeNode = undefined!; indexType: AstTypeNode = undefined!; } -/** @internal */ -export class MappedTypeNode extends Node implements Declaration, LocalsContainer, ts.MappedTypeNode { - declare readonly ast: AstMappedTypeNode; - - declare _typeNodeBrand: any; - declare _declarationBrand: any; - declare _localsContainerBrand: any; - - get readonlyToken(): PlusToken | MinusToken | ReadonlyKeyword | undefined { - return this.ast.data.readonlyToken?.node; - } - set readonlyToken(value) { - this.ast.data.readonlyToken = value?.ast; - } - get typeParameter(): TypeParameterDeclaration { - return this.ast.data.typeParameter.node; - } - set typeParameter(value) { - this.ast.data.typeParameter = value.ast; - } - get nameType(): TypeNode | undefined { - return this.ast.data.nameType?.node; - } - set nameType(value) { - this.ast.data.nameType = value?.ast; - } - get questionToken(): QuestionToken | PlusToken | MinusToken | undefined { - return this.ast.data.questionToken?.node; - } - set questionToken(value) { - this.ast.data.questionToken = value?.ast; - } - get type(): TypeNode | undefined { - return this.ast.data.type?.node; - } - set type(value) { - this.ast.data.type = value?.ast; - } - get members(): NodeArray | undefined { - return this.ast.data.members?.nodes; - } - set members(value) { - this.ast.data.members = value?.ast; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstMappedTypeNodeData extends AstTypeScriptNodeData { readonlyToken: AstReadonlyKeyword | AstPlusToken | AstMinusToken | undefined = undefined; typeParameter: AstTypeParameterDeclaration = undefined!; @@ -5437,155 +2295,45 @@ export class AstMappedTypeNodeData extends AstTypeScriptNodeData { questionToken: AstQuestionToken | AstPlusToken | AstMinusToken | undefined = undefined; type: AstTypeNode | undefined = undefined; members: AstNodeArray | undefined = undefined; - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; + + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; } -/** @internal */ -export class LiteralTypeNode extends Node implements ts.LiteralTypeNode { - declare readonly ast: AstLiteralTypeNode; - - declare _typeNodeBrand: any; - - get literal(): NullLiteral | TrueLiteral | FalseLiteral | PrefixUnaryExpression | LiteralExpression { - return this.ast.data.literal.node; - } - set literal(value) { - this.ast.data.literal = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstLiteralTypeNodeData extends AstTypeScriptNodeData { literal: AstNullLiteral | AstBooleanLiteral | AstLiteralExpression | AstPrefixUnaryExpression = undefined!; } -/** @internal */ -export type PropertyNameLiteral = - | Identifier - | StringLiteralLike - | NumericLiteral - | JsxNamespacedName - | BigIntLiteral; - -/** @internal */ export type AstPropertyNameLiteral = AstNodeOneOf; -/** @internal */ -export class TemplateLiteralTypeNode extends Node implements ts.TemplateLiteralTypeNode { - declare readonly ast: AstTemplateLiteralTypeNode; - - declare _typeNodeBrand: any; - - get head(): TemplateHead { - return this.ast.data.head.node; - } - set head(value) { - this.ast.data.head = value.ast; - } - get templateSpans(): NodeArray { - return this.ast.data.templateSpans.nodes; - } - set templateSpans(value) { - this.ast.data.templateSpans = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstTemplateLiteralTypeNodeData extends AstTypeScriptNodeData { head: AstTemplateHead = undefined!; templateSpans: AstNodeArray = undefined!; } -/** @internal */ -export class TemplateLiteralTypeSpan extends Node implements ts.TemplateLiteralTypeSpan { - declare readonly ast: AstTemplateLiteralTypeSpan; - - declare _typeNodeBrand: any; - - override get parent() { - return super.parent as TemplateLiteralTypeNode; - } - override set parent(value) { - super.parent = value; - } - - get type(): TypeNode { - return this.ast.data.type.node; - } - set type(value) { - this.ast.data.type = value.ast; - } - get literal(): TemplateMiddle | TemplateTail { - return this.ast.data.literal.node; - } - set literal(value) { - this.ast.data.literal = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstTemplateLiteralTypeSpanData extends AstTypeScriptNodeData { type: AstTypeNode = undefined!; literal: AstTemplateMiddle | AstTemplateTail = undefined!; } -/** @internal */ -export type Literal = - | NumericLiteral - | BigIntLiteral - | StringLiteral - | JsxText - | RegularExpressionLiteral - | NoSubstitutionTemplateLiteral; - -/** @internal */ -export type AstLiteral = AstNodeOneOf; - -/** @internal */ -export class OmittedExpression extends Node implements ts.OmittedExpression { - declare readonly ast: AstOmittedExpression; - - declare _expressionBrand: any; -} - -/** @internal */ +// dprint-ignore export class AstOmittedExpressionData extends AstData { - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return TransformFlags.None; } } -/** @internal */ -export class PrefixUnaryExpression extends Node implements ts.PrefixUnaryExpression { - declare readonly ast: AstPrefixUnaryExpression; - - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - - get operator(): ts.PrefixUnaryOperator { - return this.ast.data.operator; - } - set operator(value) { - this.ast.data.operator = value; - } - get operand(): UnaryExpression { - return this.ast.data.operand.node; - } - set operand(value) { - this.ast.data.operand = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstPrefixUnaryExpressionData extends AstData { operator: PrefixUnaryOperator = undefined!; operand: AstUnaryExpression = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { let transformFlags = propagateChildFlags(this.operand); // Only set this flag for non-generated identifiers and non-"local" names. See the // comment in `visitPreOrPostfixUnaryExpression` in module.ts @@ -5602,34 +2350,12 @@ export class AstPrefixUnaryExpressionData extends AstData { } } -/** @internal */ -export class PostfixUnaryExpression extends Node implements ts.PostfixUnaryExpression { - declare readonly ast: AstPostfixUnaryExpression; - - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - - get operand(): LeftHandSideExpression { - return this.ast.data.operand.node; - } - set operand(value) { - this.ast.data.operand = value.ast; - } - get operator(): ts.PostfixUnaryOperator { - return this.ast.data.operator; - } - set operator(value) { - this.ast.data.operator = value; - } -} - -/** @internal */ +// dprint-ignore export class AstPostfixUnaryExpressionData extends AstData { operand: AstLeftHandSideExpression = undefined!; operator: PostfixUnaryOperator = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { let transformFlags = propagateChildFlags(this.operand); // Only set this flag for non-generated identifiers and non-"local" names. See the // comment in `visitPreOrPostfixUnaryExpression` in module.ts @@ -5645,98 +2371,38 @@ export class AstPostfixUnaryExpressionData extends AstData { } } -/** @internal */ -export class DeleteExpression extends Node implements ts.DeleteExpression { - declare readonly ast: AstDeleteExpression; - - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - - get expression(): UnaryExpression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstDeleteExpressionData extends AstData { expression: AstUnaryExpression = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.expression); } } -/** @internal */ -export class TypeOfExpression extends Node implements ts.TypeOfExpression { - declare readonly ast: AstTypeOfExpression; - - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - - get expression(): UnaryExpression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstTypeOfExpressionData extends AstData { expression: AstUnaryExpression = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.expression); } } -/** @internal */ -export class VoidExpression extends Node implements ts.VoidExpression { - declare readonly ast: AstVoidExpression; - - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - - get expression(): UnaryExpression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstVoidExpressionData extends AstData { expression: AstUnaryExpression = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.expression); } } -/** @internal */ -export class AwaitExpression extends Node implements ts.AwaitExpression { - declare readonly ast: AstAwaitExpression; - - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - - get expression(): UnaryExpression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstAwaitExpressionData extends AstData { expression: AstUnaryExpression = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.expression) | TransformFlags.ContainsES2017 | TransformFlags.ContainsES2018 | @@ -5744,32 +2410,12 @@ export class AstAwaitExpressionData extends AstData { } } -/** @internal */ -export class YieldExpression extends Node implements ts.YieldExpression { - declare readonly ast: AstYieldExpression; - - declare _expressionBrand: any; - - get asteriskToken(): AsteriskToken | undefined { - return this.ast.data.asteriskToken?.node; - } - set asteriskToken(value) { - this.ast.data.asteriskToken = value?.ast; - } - get expression(): Expression | undefined { - return this.ast.data.expression?.node; - } - set expression(value) { - this.ast.data.expression = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstYieldExpressionData extends AstData { asteriskToken: AstAsteriskToken | undefined = undefined; expression: AstExpression | undefined = undefined; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.expression) | propagateChildFlags(this.asteriskToken) | TransformFlags.ContainsES2015 | @@ -5778,70 +2424,20 @@ export class AstYieldExpressionData extends AstData { } } -/** @internal */ -export type BinaryOperatorToken = Token; - -/** @internal */ export type AstBinaryOperatorToken = AstNode; -/** @internal */ -export class BinaryExpression extends Node implements JSDocContainer, Declaration, ts.BinaryExpression { - declare readonly ast: AstBinaryExpression; - - declare _expressionBrand: any; - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - - get left(): Expression { - return this.ast.data.left.node; - } - set left(value) { - this.ast.data.left = value.ast; - } - get operatorToken(): BinaryOperatorToken { - return this.ast.data.operatorToken.node; - } - set operatorToken(value) { - this.ast.data.operatorToken = value.ast; - } - get right(): Expression { - return this.ast.data.right.node; - } - set right(value) { - this.ast.data.right = value.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstBinaryExpressionData extends AstData { left: AstExpression = undefined!; operatorToken: AstBinaryOperatorToken = undefined!; right: AstExpression = undefined!; - cachedLiteralKind: SyntaxKind | undefined = undefined; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ cachedLiteralKind: SyntaxKind | undefined = undefined; + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { const operatorKind = this.operatorToken.kind; let transformFlags = propagateChildFlags(this.left) | propagateChildFlags(this.operatorToken) | @@ -5875,72 +2471,9 @@ export class AstBinaryExpressionData extends AstData { } } -/** @internal */ -export type AssignmentOperatorToken = Token; - -/** @internal */ -export interface AssignmentExpression extends BinaryExpression { - readonly left: LeftHandSideExpression; - readonly operatorToken: TOperator; -} - -/** @internal */ -export interface ObjectDestructuringAssignment extends AssignmentExpression { - readonly left: ObjectLiteralExpression; -} - -/** @internal */ -export interface ArrayDestructuringAssignment extends AssignmentExpression { - readonly left: ArrayLiteralExpression; -} - -/** @internal */ -export type DestructuringAssignment = - | ObjectDestructuringAssignment - | ArrayDestructuringAssignment; - -/** @internal */ export type AstDestructuringAssignment = AstNodeOneOf; -/** @internal */ -export class ConditionalExpression extends Node implements ts.ConditionalExpression { - declare readonly ast: AstConditionalExpression; - - declare _expressionBrand: any; - - get condition(): Expression { - return this.ast.data.condition.node; - } - set condition(value) { - this.ast.data.condition = value.ast; - } - get questionToken(): QuestionToken { - return this.ast.data.questionToken.node; - } - set questionToken(value) { - this.ast.data.questionToken = value.ast; - } - get whenTrue(): Expression { - return this.ast.data.whenTrue.node; - } - set whenTrue(value) { - this.ast.data.whenTrue = value.ast; - } - get colonToken(): ColonToken { - return this.ast.data.colonToken.node; - } - set colonToken(value) { - this.ast.data.colonToken = value.ast; - } - get whenFalse(): Expression { - return this.ast.data.whenFalse.node; - } - set whenFalse(value) { - this.ast.data.whenFalse = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstConditionalExpressionData extends AstData { condition: AstExpression = undefined!; questionToken: AstQuestionToken = undefined!; @@ -5948,7 +2481,7 @@ export class AstConditionalExpressionData extends AstData { colonToken: AstColonToken = undefined!; whenFalse: AstExpression = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.condition) | propagateChildFlags(this.questionToken) | propagateChildFlags(this.whenTrue) | @@ -5957,135 +2490,10 @@ export class AstConditionalExpressionData extends AstData { } } -/** @internal */ -export type FunctionBody = Block; - -/** @internal */ export type AstFunctionBody = AstNodeOneOf; - -/** @internal */ -export type ConciseBody = - | FunctionBody - | Expression; - -/** @internal */ export type AstConciseBody = AstNodeOneOf; -/** @internal */ -export class FunctionExpression extends Node implements JSDocContainer, Declaration, LocalsContainer, FlowContainer, ts.FunctionExpression { - declare readonly ast: AstFunctionExpression; - - declare _primaryExpressionBrand: any; - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - declare _functionLikeDeclarationBrand: any; - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - declare _localsContainerBrand: any; - declare _flowContainerBrand: any; - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get asteriskToken(): AsteriskToken | undefined { - return this.ast.data.asteriskToken?.node; - } - set asteriskToken(value) { - this.ast.data.asteriskToken = value?.ast; - } - get name(): Identifier | undefined { - return this.ast.data.name?.node; - } - set name(value) { - this.ast.data.name = value?.ast; - } - get typeParameters(): NodeArray | undefined { - return this.ast.data.typeParameters?.nodes; - } - set typeParameters(value) { - this.ast.data.typeParameters = value?.ast; - } - /** @internal */ get typeArguments(): NodeArray | undefined { - return this.ast.data.typeArguments?.nodes; - } - /** @internal */ set typeArguments(value) { - this.ast.data.typeArguments = value?.ast; - } - get parameters(): NodeArray { - return this.ast.data.parameters.nodes; - } - set parameters(value) { - this.ast.data.parameters = value.ast; - } - get type(): TypeNode | undefined { - return this.ast.data.type?.node; - } - set type(value) { - this.ast.data.type = value?.ast; - } - get body(): Block { - return this.ast.data.body.node; - } - set body(value) { - this.ast.data.body = value.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value: FlowNode | undefined) { - this.ast.data.flowNode = value; - } - get endFlowNode(): ts.FlowNode | undefined { - return this.ast.data.endFlowNode; - } - set endFlowNode(value) { - this.ast.data.endFlowNode = value; - } - get returnFlowNode(): ts.FlowNode | undefined { - return this.ast.data.returnFlowNode; - } - set returnFlowNode(value) { - this.ast.data.returnFlowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstFunctionExpressionData extends AstData { modifiers: AstNodeArray | undefined = undefined; asteriskToken: AstAsteriskToken | undefined = undefined; @@ -6093,19 +2501,19 @@ export class AstFunctionExpressionData extends AstData { typeParameters: AstNodeArray | undefined = undefined; parameters: AstNodeArray = undefined!; type: AstTypeNode | undefined = undefined; - body: AstFunctionBody = undefined!; + body: AstFunctionBody = undefined!; // Required, whereas the member inherited from FunctionDeclaration is optional + /** @internal */ typeArguments: AstNodeArray | undefined = undefined; // Used for quick info, replaces typeParameters for instantiated signatures + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ endFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ returnFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - endFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - returnFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { const isAsync = modifiersToFlags(this.modifiers?.items) & ModifierFlags.Async; const isGenerator = !!this.asteriskToken; const isAsyncGenerator = isAsync && isGenerator; @@ -6125,114 +2533,7 @@ export class AstFunctionExpressionData extends AstData { } } -/** @internal */ -export type ImmediatelyInvokedFunctionExpression = CallExpression & { readonly expression: FunctionExpression; }; - -/** @internal */ -export class ArrowFunction extends Node implements JSDocContainer, Declaration, LocalsContainer, FlowContainer, ts.ArrowFunction { - declare readonly ast: AstArrowFunction; - - declare _expressionBrand: any; - declare _functionLikeDeclarationBrand: any; - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - declare _localsContainerBrand: any; - declare _flowContainerBrand: any; - declare name: never; - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get equalsGreaterThanToken(): EqualsGreaterThanToken { - return this.ast.data.equalsGreaterThanToken.node; - } - set equalsGreaterThanToken(value) { - this.ast.data.equalsGreaterThanToken = value.ast; - } - get typeParameters(): NodeArray | undefined { - return this.ast.data.typeParameters?.nodes; - } - set typeParameters(value) { - this.ast.data.typeParameters = value?.ast; - } - get parameters(): NodeArray { - return this.ast.data.parameters.nodes; - } - set parameters(value) { - this.ast.data.parameters = value.ast; - } - get type(): TypeNode | undefined { - return this.ast.data.type?.node; - } - set type(value) { - this.ast.data.type = value?.ast; - } - get body(): Block | Expression { - return this.ast.data.body.node; - } - set body(value) { - this.ast.data.body = value.ast; - } - get typeArguments(): NodeArray | undefined { - return this.ast.data.typeArguments?.nodes; - } - set typeArguments(value) { - this.ast.data.typeArguments = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value: FlowNode | undefined) { - this.ast.data.flowNode = value; - } - get endFlowNode(): ts.FlowNode | undefined { - return this.ast.data.endFlowNode; - } - set endFlowNode(value) { - this.ast.data.endFlowNode = value; - } - get returnFlowNode(): ts.FlowNode | undefined { - return this.ast.data.returnFlowNode; - } - set returnFlowNode(value) { - this.ast.data.returnFlowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstArrowFunctionData extends AstData { modifiers: AstNodeArray | undefined = undefined; equalsGreaterThanToken: AstEqualsGreaterThanToken = undefined!; @@ -6242,16 +2543,16 @@ export class AstArrowFunctionData extends AstData { body: AstConciseBody = undefined!; typeArguments: AstNodeArray | undefined = undefined; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - endFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - returnFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ endFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ returnFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { const isAsync = modifiersToFlags(this.modifiers?.items) & ModifierFlags.Async; return propagateChildrenFlags(this.modifiers) | propagateChildrenFlags(this.typeParameters) | @@ -6265,817 +2566,207 @@ export class AstArrowFunctionData extends AstData { } } -/** @internal */ -export type ImmediatelyInvokedArrowFunction = CallExpression & { readonly expression: ParenthesizedExpression & { readonly expression: ArrowFunction; }; }; - -/** @internal */ -export class RegularExpressionLiteral extends Token implements ts.RegularExpressionLiteral { - declare readonly ast: AstRegularExpressionLiteral; - - declare _literalExpressionBrand: any; - declare _primaryExpressionBrand: any; - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - - get text(): string { - return this.ast.data.text; - } - set text(value) { - this.ast.data.text = value; - } - get isUnterminated(): boolean | undefined { - return this.ast.data.isUnterminated; - } - set isUnterminated(value) { - this.ast.data.isUnterminated = value; - } - get hasExtendedUnicodeEscape(): boolean | undefined { - return this.ast.data.hasExtendedUnicodeEscape; - } - set hasExtendedUnicodeEscape(value) { - this.ast.data.hasExtendedUnicodeEscape = value; - } -} - -/** @internal */ +// dprint-ignore export class AstRegularExpressionLiteralData extends AstTokenData { text: string = ""; isUnterminated: boolean | undefined = undefined; hasExtendedUnicodeEscape: boolean | undefined = undefined; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return TransformFlags.None; } } -/** @internal */ -export class StringLiteral extends Token implements LiteralExpression, Declaration, ts.StringLiteral { - declare readonly ast: AstStringLiteral; - - declare _literalExpressionBrand: any; - declare _primaryExpressionBrand: any; - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - declare _declarationBrand: any; - - get text(): string { - return this.ast.data.text; - } - set text(value) { - this.ast.data.text = value; - } - get singleQuote(): boolean | undefined { - return this.ast.data.singleQuote; - } - set singleQuote(value) { - this.ast.data.singleQuote = value; - } - get isUnterminated(): boolean { - return this.ast.data.isUnterminated; - } - set isUnterminated(value) { - this.ast.data.isUnterminated = value; - } - get hasExtendedUnicodeEscape(): boolean { - return this.ast.data.hasExtendedUnicodeEscape; - } - set hasExtendedUnicodeEscape(value) { - this.ast.data.hasExtendedUnicodeEscape = value; - } - get textSourceNode(): Identifier | PrivateIdentifier | NumericLiteral | BigIntLiteral | JsxNamespacedName | StringLiteralLike | undefined { - return this.ast.data.textSourceNode?.node; - } - set textSourceNode(value) { - this.ast.data.textSourceNode = value?.ast; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstStringLiteralData extends AstTokenData { text: string = ""; singleQuote: boolean | undefined = undefined; isUnterminated: boolean = false; hasExtendedUnicodeEscape: boolean = false; - textSourceNode?: AstNode | undefined; - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ textSourceNode?: AstNode | undefined; + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return this.hasExtendedUnicodeEscape ? TransformFlags.ContainsES2015 : TransformFlags.None; } } -/** @internal */ -export class NoSubstitutionTemplateLiteral extends Token implements Declaration, ts.NoSubstitutionTemplateLiteral { - declare readonly ast: AstNoSubstitutionTemplateLiteral; - - declare _literalExpressionBrand: any; - declare _primaryExpressionBrand: any; - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - declare _declarationBrand: any; - - get text(): string { - return this.ast.data.text; - } - set text(value) { - this.ast.data.text = value; - } - get rawText(): string | undefined { - return this.ast.data.rawText; - } - set rawText(value) { - this.ast.data.rawText = value; - } - get isUnterminated(): boolean | undefined { - return this.ast.data.isUnterminated; - } - set isUnterminated(value) { - this.ast.data.isUnterminated = value; - } - get hasExtendedUnicodeEscape(): boolean | undefined { - return this.ast.data.hasExtendedUnicodeEscape; - } - set hasExtendedUnicodeEscape(value) { - this.ast.data.hasExtendedUnicodeEscape = value; - } - get templateFlags(): ts.TokenFlags { - return this.ast.data.templateFlags; - } - set templateFlags(value) { - this.ast.data.templateFlags = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstNoSubstitutionTemplateLiteralData extends AstTokenData { text: string = ""; rawText: string | undefined = undefined; isUnterminated: boolean | undefined = undefined; hasExtendedUnicodeEscape: boolean | undefined = undefined; - templateFlags: ts.TokenFlags = TokenFlags.None; - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ templateFlags: TokenFlags = TokenFlags.None; + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return getTransformFlagsOfTemplateLiteralLike(this.templateFlags); } } -/** @internal */ -export type PseudoLiteralToken = - | TemplateHead - | TemplateMiddle - | TemplateTail; - -/** @internal */ export type AstPseudoLiteralToken = AstNodeOneOf; - -/** @internal */ -export type TemplateLiteralToken = - | NoSubstitutionTemplateLiteral - | PseudoLiteralToken; - -/** @internal */ export type AstTemplateLiteralToken = AstNodeOneOf; - -/** @internal */ -export type StringLiteralLike = - | StringLiteral - | NoSubstitutionTemplateLiteral; - -/** @internal */ export type AstStringLiteralLike = AstNodeOneOf; -/** @internal */ -export class NumericLiteral extends Token implements Declaration, ts.NumericLiteral { - declare readonly ast: AstNumericLiteral; - - declare _literalExpressionBrand: any; - declare _primaryExpressionBrand: any; - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - declare _declarationBrand: any; - - get text(): string { - return this.ast.data.text; - } - set text(value) { - this.ast.data.text = value; - } - get numericLiteralFlags(): ts.TokenFlags { - return this.ast.data.numericLiteralFlags; - } - set numericLiteralFlags(value) { - this.ast.data.numericLiteralFlags = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstNumericLiteralData extends AstTokenData { text: string = ""; - numericLiteralFlags: ts.TokenFlags = TokenFlags.None; - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ numericLiteralFlags: TokenFlags = TokenFlags.None; + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return this.numericLiteralFlags & TokenFlags.BinaryOrOctalSpecifier ? TransformFlags.ContainsES2015 : TransformFlags.None; } } -/** @internal */ -export class BigIntLiteral extends Token implements ts.BigIntLiteral { - declare readonly ast: AstBigIntLiteral; - - declare _literalExpressionBrand: any; - declare _primaryExpressionBrand: any; - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - - get text(): string { - return this.ast.data.text; - } - set text(value) { - this.ast.data.text = value; - } -} - -/** @internal */ +// dprint-ignore export class AstBigIntLiteralData extends AstTokenData { text: string = ""; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return TransformFlags.ContainsES2020; } } -/** @internal */ -export type LiteralToken = - | NumericLiteral - | BigIntLiteral - | StringLiteral - | JsxText - | RegularExpressionLiteral - | NoSubstitutionTemplateLiteral; - -/** @internal */ export type AstLiteralToken = AstNodeOneOf; -/** @internal */ -export class TemplateHead extends Token implements ts.TemplateHead { - declare readonly ast: AstTemplateHead; - - override get parent() { - return super.parent as TemplateExpression | TemplateLiteralTypeNode; - } - override set parent(value) { - super.parent = value; - } - - get text(): string { - return this.ast.data.text; - } - set text(value) { - this.ast.data.text = value; - } - get isUnterminated(): boolean | undefined { - return this.ast.data.isUnterminated; - } - set isUnterminated(value) { - this.ast.data.isUnterminated = value; - } - get hasExtendedUnicodeEscape(): boolean | undefined { - return this.ast.data.hasExtendedUnicodeEscape; - } - set hasExtendedUnicodeEscape(value) { - this.ast.data.hasExtendedUnicodeEscape = value; - } - get rawText(): string | undefined { - return this.ast.data.rawText; - } - set rawText(value) { - this.ast.data.rawText = value; - } - get templateFlags(): ts.TokenFlags { - return this.ast.data.templateFlags; - } - set templateFlags(value) { - this.ast.data.templateFlags = value; - } -} - -/** @internal */ +// dprint-ignore export class AstTemplateHeadData extends AstTokenData { text = ""; isUnterminated: boolean | undefined = undefined; hasExtendedUnicodeEscape: boolean | undefined = undefined; rawText: string | undefined = undefined; - templateFlags: ts.TokenFlags = TokenFlags.None; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ templateFlags: TokenFlags = TokenFlags.None; + + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return getTransformFlagsOfTemplateLiteralLike(this.templateFlags); } } -/** @internal */ -export class TemplateMiddle extends Token implements ts.TemplateMiddle { - declare readonly ast: AstTemplateMiddle; - - override get parent() { - return super.parent as TemplateSpan | TemplateLiteralTypeSpan; - } - override set parent(value) { - super.parent = value; - } - - get text(): string { - return this.ast.data.text; - } - set text(value) { - this.ast.data.text = value; - } - get isUnterminated(): boolean | undefined { - return this.ast.data.isUnterminated; - } - set isUnterminated(value) { - this.ast.data.isUnterminated = value; - } - get hasExtendedUnicodeEscape(): boolean | undefined { - return this.ast.data.hasExtendedUnicodeEscape; - } - set hasExtendedUnicodeEscape(value) { - this.ast.data.hasExtendedUnicodeEscape = value; - } - get rawText(): string | undefined { - return this.ast.data.rawText; - } - set rawText(value) { - this.ast.data.rawText = value; - } - get templateFlags(): ts.TokenFlags { - return this.ast.data.templateFlags; - } - set templateFlags(value) { - this.ast.data.templateFlags = value; - } -} - -/** @internal */ +// dprint-ignore export class AstTemplateMiddleData extends AstTokenData { text = ""; isUnterminated: boolean | undefined = undefined; hasExtendedUnicodeEscape: boolean | undefined = undefined; rawText: string | undefined = undefined; - templateFlags: ts.TokenFlags = TokenFlags.None; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ templateFlags: TokenFlags = TokenFlags.None; + + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return getTransformFlagsOfTemplateLiteralLike(this.templateFlags); } } -/** @internal */ -export class TemplateTail extends Token implements ts.TemplateTail { - declare readonly ast: AstTemplateTail; - - override get parent() { - return super.parent as TemplateSpan | TemplateLiteralTypeSpan; - } - override set parent(value) { - super.parent = value; - } - - get text(): string { - return this.ast.data.text; - } - set text(value) { - this.ast.data.text = value; - } - get isUnterminated(): boolean | undefined { - return this.ast.data.isUnterminated; - } - set isUnterminated(value) { - this.ast.data.isUnterminated = value; - } - get hasExtendedUnicodeEscape(): boolean | undefined { - return this.ast.data.hasExtendedUnicodeEscape; - } - set hasExtendedUnicodeEscape(value) { - this.ast.data.hasExtendedUnicodeEscape = value; - } - get rawText(): string | undefined { - return this.ast.data.rawText; - } - set rawText(value) { - this.ast.data.rawText = value; - } - get templateFlags(): ts.TokenFlags { - return this.ast.data.templateFlags; - } - set templateFlags(value) { - this.ast.data.templateFlags = value; - } -} - -/** @internal */ +// dprint-ignore export class AstTemplateTailData extends AstTokenData { text = ""; isUnterminated: boolean | undefined = undefined; hasExtendedUnicodeEscape: boolean | undefined = undefined; rawText: string | undefined = undefined; - templateFlags: ts.TokenFlags = TokenFlags.None; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ templateFlags: TokenFlags = TokenFlags.None; + + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return getTransformFlagsOfTemplateLiteralLike(this.templateFlags); } } -/** @internal */ -export class TemplateExpression extends Node implements ts.TemplateExpression { - declare readonly ast: AstTemplateExpression; - - declare _primaryExpressionBrand: any; - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - - get head(): TemplateHead { - return this.ast.data.head.node; - } - set head(value) { - this.ast.data.head = value.ast; - } - get templateSpans(): NodeArray { - return this.ast.data.templateSpans.nodes; - } - set templateSpans(value) { - this.ast.data.templateSpans = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstTemplateExpressionData extends AstData { head: AstTemplateHead = undefined!; templateSpans: AstNodeArray = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.head) | propagateChildrenFlags(this.templateSpans) | TransformFlags.ContainsES2015; } } -/** @internal */ -export class TemplateSpan extends Node implements ts.TemplateSpan { - declare readonly ast: AstTemplateSpan; - - override get parent() { - return super.parent as TemplateExpression; - } - override set parent(value) { - super.parent = value; - } - - get expression(): Expression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } - get literal(): TemplateMiddle | TemplateTail { - return this.ast.data.literal.node; - } - set literal(value) { - this.ast.data.literal = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstTemplateSpanData extends AstData { expression: AstExpression = undefined!; literal: AstTemplateMiddle | AstTemplateTail = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.expression) | propagateChildFlags(this.literal) | TransformFlags.ContainsES2015; } } -/** @internal */ -export class ParenthesizedExpression extends Node implements JSDocContainer, ts.ParenthesizedExpression { - declare readonly ast: AstParenthesizedExpression; - - declare _primaryExpressionBrand: any; - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - declare _jsdocContainerBrand: any; - - get expression(): Expression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } -} - -/** @internal */ +// dprint-ignore export class AstParenthesizedExpressionData extends AstData { expression: AstExpression = undefined!; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.expression); } } -/** @internal */ -export interface JSDocTypeAssertion extends ParenthesizedExpression { - readonly ast: AstJSDocTypeAssertion; - readonly _jsDocTypeAssertionBrand: never; -} - /** @internal */ export type AstJSDocTypeAssertion = AstNode; -/** @internal */ -export class ArrayLiteralExpression extends Node implements ts.ArrayLiteralExpression { - declare readonly ast: AstArrayLiteralExpression; - - declare _primaryExpressionBrand: any; - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - - get elements(): NodeArray { - return this.ast.data.elements.nodes; - } - set elements(value: NodeArray) { - this.ast.data.elements = value.ast; - } - get multiLine(): boolean | undefined { - return this.ast.data.multiLine; - } - set multiLine(value) { - this.ast.data.multiLine = value; - } -} - -/** @internal */ +// dprint-ignore export class AstArrayLiteralExpressionData extends AstData { elements: AstNodeArray = undefined!; - multiLine: boolean | undefined = undefined; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ multiLine: boolean | undefined = undefined; + + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildrenFlags(this.elements); } } -/** @internal */ -export class SpreadElement extends Node implements ts.SpreadElement { - declare readonly ast: AstSpreadElement; - - declare _expressionBrand: any; - - override get parent() { - return super.parent as ArrayLiteralExpression | CallExpression | NewExpression; - } - override set parent(value) { - super.parent = value; - } - - get expression(): Expression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstSpreadElementData extends AstData { expression: AstExpression = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.expression) | TransformFlags.ContainsES2015 | TransformFlags.ContainsRestOrSpread; } } -/** @internal */ -export interface ObjectLiteralElement extends Declaration { - /** @internal */ readonly ast: AstObjectLiteralElement; - _objectLiteralBrand: any; -} - -/** @internal */ export type AstObjectLiteralElement = AstNode; - -/** @internal */ -export type ObjectLiteralElementLike = - | PropertyAssignment - | ShorthandPropertyAssignment - | SpreadAssignment - | MethodDeclaration - | AccessorDeclaration; - -/** @internal */ export type AstObjectLiteralElementLike = AstNodeOneOf; -/** @internal */ -export class ObjectLiteralExpression extends Node implements JSDocContainer, Declaration, ts.ObjectLiteralExpression { - declare readonly ast: AstObjectLiteralExpression; - - declare _primaryExpressionBrand: any; - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - - get properties(): NodeArray { - return this.ast.data.properties.nodes; - } - set properties(value) { - this.ast.data.properties = value.ast; - } - get multiLine(): boolean | undefined { - return this.ast.data.multiLine; - } - set multiLine(value) { - this.ast.data.multiLine = value; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstObjectLiteralExpressionData extends AstData { properties: AstNodeArray = undefined!; - multiLine: boolean | undefined = undefined; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ multiLine: boolean | undefined = undefined; + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildrenFlags(this.properties); } } -/** @internal */ -export class PropertyAccessExpression extends Node implements JSDocContainer, Declaration, FlowContainer, ts.PropertyAccessExpression { - declare readonly ast: AstPropertyAccessExpression; - - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - declare _flowContainerBrand: any; - - get expression(): LeftHandSideExpression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } - get questionDotToken(): QuestionDotToken | undefined { - return this.ast.data.questionDotToken?.node; - } - set questionDotToken(value) { - this.ast.data.questionDotToken = value?.ast; - } - get name(): Identifier | PrivateIdentifier { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value: FlowNode | undefined) { - this.ast.data.flowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstPropertyAccessExpressionData extends AstData { expression: AstLeftHandSideExpression = undefined!; questionDotToken: AstQuestionDotToken | undefined = undefined; name: AstMemberName = undefined!; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(node: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(node: AstNode): TransformFlags { let transformFlags = propagateChildFlags(this.expression) | propagateChildFlags(this.questionDotToken) | (this.name.kind === SyntaxKind.Identifier ? @@ -7094,120 +2785,31 @@ export class AstPropertyAccessExpressionData extends AstData { } } -/** @internal */ -export interface PropertyAccessEntityNameExpression extends PropertyAccessExpression { - _propertyAccessExpressionLikeQualifiedNameBrand?: any; - readonly ast: AstPropertyAccessEntityNameExpression; - readonly data: AstPropertyAccessEntityNameExpressionData; - readonly expression: EntityNameExpression; - readonly name: Identifier; -} - -/** @internal */ export type AstPropertyAccessEntityNameExpression = AstNode; -/** @internal */ export interface AstPropertyAccessEntityNameExpressionData extends AstPropertyAccessExpressionData { expression: AstEntityNameExpression; name: AstIdentifier; } -/** @internal */ -export type EntityNameExpression = - | Identifier - | PropertyAccessEntityNameExpression; -/** @internal */ export type AstEntityNameExpression = AstNodeOneOf; - -/** @internal */ -export interface PropertyAccessChain extends PropertyAccessExpression { - _optionalChainBrand: any; - readonly ast: AstPropertyAccessChain; - readonly name: MemberName; -} - -/** @internal */ export type AstPropertyAccessChain = AstNode; - -/** @internal */ -export interface PropertyAccessChainRoot extends PropertyAccessChain { - readonly questionDotToken: QuestionDotToken; -} - /** @internal */ export type AstPropertyAccessChainRoot = AstNode; -/** @internal */ -export class ElementAccessExpression extends Node implements JSDocContainer, Declaration, FlowContainer, ts.ElementAccessExpression { - declare readonly ast: AstElementAccessExpression; - - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - declare _flowContainerBrand: any; - - get expression(): LeftHandSideExpression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } - get questionDotToken(): QuestionDotToken | undefined { - return this.ast.data.questionDotToken?.node; - } - set questionDotToken(value) { - this.ast.data.questionDotToken = value?.ast; - } - get argumentExpression(): Expression { - return this.ast.data.argumentExpression.node; - } - set argumentExpression(value) { - this.ast.data.argumentExpression = value.ast; - } - - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value: FlowNode | undefined) { - this.ast.data.flowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstElementAccessExpressionData extends AstData { expression: AstLeftHandSideExpression = undefined!; questionDotToken: AstQuestionDotToken | undefined = undefined; argumentExpression: AstExpression = undefined!; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(node: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(node: AstNode): TransformFlags { let transformFlags = propagateChildFlags(this.expression) | propagateChildFlags(this.questionDotToken) | propagateChildFlags(this.argumentExpression); @@ -7224,82 +2826,21 @@ export class AstElementAccessExpressionData extends AstData { } } -/** @internal */ -export interface ElementAccessChain extends ElementAccessExpression { - readonly ast: AstElementAccessChain; - _optionalChainBrand: any; -} - -/** @internal */ export type AstElementAccessChain = AstNode; - -/** @internal */ -export interface ElementAccessChainRoot extends ElementAccessChain { - readonly questionDotToken: QuestionDotToken; -} - /** @internal */ export type AstElementAccessChainRoot = AstNode; -/** @internal */ -export class CallExpression extends Node implements Declaration, ts.CallExpression { - declare readonly ast: AstCallExpression; - - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - declare _declarationBrand: any; - - get expression(): LeftHandSideExpression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } - get questionDotToken(): QuestionDotToken | undefined { - return this.ast.data.questionDotToken?.node; - } - set questionDotToken(value) { - this.ast.data.questionDotToken = value?.ast; - } - get typeArguments(): NodeArray | undefined { - return this.ast.data.typeArguments?.nodes; - } - set typeArguments(value) { - this.ast.data.typeArguments = value?.ast; - } - get arguments(): NodeArray { - return this.ast.data.arguments.nodes; - } - set arguments(value) { - this.ast.data.arguments = value.ast; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstCallExpressionData extends AstData { expression: AstLeftHandSideExpression = undefined!; questionDotToken: AstQuestionDotToken | undefined = undefined; typeArguments: AstNodeArray | undefined = undefined; arguments: AstNodeArray = undefined!; - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(node: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(node: AstNode): TransformFlags { let transformFlags = propagateChildFlags(this.expression) | propagateChildFlags(this.questionDotToken) | propagateChildrenFlags(this.typeArguments) | @@ -7324,123 +2865,34 @@ export class AstCallExpressionData extends AstData { } } -/** @internal */ -export interface CallChain extends CallExpression { - readonly ast: AstCallChain; - _optionalChainBrand: any; -} - -/** @internal */ export type AstCallChain = AstNode; - -/** @internal */ -export interface CallChainRoot extends CallChain { - readonly questionDotToken: QuestionDotToken; -} - /** @internal */ export type AstCallChainRoot = AstNode; - -/** @internal */ -export type OptionalChainRoot = - | PropertyAccessChainRoot - | ElementAccessChainRoot - | CallChainRoot; - /** @internal */ export type AstOptionalChainRoot = AstNodeOneOf; -/** @internal */ -export class ExpressionWithTypeArguments extends Node implements ts.ExpressionWithTypeArguments { - declare readonly ast: AstExpressionWithTypeArguments; - - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - declare _typeNodeBrand: any; - - get expression(): LeftHandSideExpression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } - get typeArguments(): NodeArray | undefined { - return this.ast.data.typeArguments?.nodes; - } - set typeArguments(value) { - this.ast.data.typeArguments = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstExpressionWithTypeArgumentsData extends AstData { expression: AstLeftHandSideExpression = undefined!; typeArguments: AstNodeArray | undefined = undefined; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.expression) | propagateChildrenFlags(this.typeArguments) | TransformFlags.ContainsES2015; } } -/** @internal */ -export class NewExpression extends Node implements Declaration, ts.NewExpression { - declare readonly ast: AstNewExpression; - - declare _primaryExpressionBrand: any; - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - declare _declarationBrand: any; - - get expression(): LeftHandSideExpression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } - get typeArguments(): NodeArray | undefined { - return this.ast.data.typeArguments?.nodes; - } - set typeArguments(value) { - this.ast.data.typeArguments = value?.ast; - } - get arguments(): NodeArray | undefined { - return this.ast.data.arguments?.nodes; - } - set arguments(value) { - this.ast.data.arguments = value?.ast; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstNewExpressionData extends AstData { expression: AstLeftHandSideExpression = undefined!; typeArguments: AstNodeArray | undefined = undefined; arguments: AstNodeArray | undefined = undefined; - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { let transformFlags = propagateChildFlags(this.expression) | propagateChildrenFlags(this.typeArguments) | propagateChildrenFlags(this.arguments) | @@ -7452,58 +2904,16 @@ export class AstNewExpressionData extends AstData { } } -/** @internal */ -export type TemplateLiteral = - | TemplateExpression - | NoSubstitutionTemplateLiteral; - -/** @internal */ export type AstTemplateLiteral = AstNodeOneOf; -/** @internal */ -export class TaggedTemplateExpression extends Node implements ts.TaggedTemplateExpression { - declare readonly ast: AstTaggedTemplateExpression; - - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - - get tag(): LeftHandSideExpression { - return this.ast.data.tag.node; - } - set tag(value) { - this.ast.data.tag = value.ast; - } - get typeArguments(): NodeArray | undefined { - return this.ast.data.typeArguments?.nodes; - } - set typeArguments(value) { - this.ast.data.typeArguments = value?.ast; - } - get template(): NoSubstitutionTemplateLiteral | TemplateExpression { - return this.ast.data.template.node; - } - set template(value) { - this.ast.data.template = value.ast; - } - get questionDotToken(): QuestionDotToken | undefined { - return this.ast.data.questionDotToken?.node; - } - set questionDotToken(value) { - this.ast.data.questionDotToken = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstTaggedTemplateExpressionData extends AstData { tag: AstLeftHandSideExpression = undefined!; typeArguments: AstNodeArray | undefined = undefined; template: AstTemplateLiteral = undefined!; questionDotToken: AstQuestionDotToken | undefined = undefined; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { let transformFlags = propagateChildFlags(this.tag) | propagateChildrenFlags(this.typeArguments) | propagateChildFlags(this.template) | @@ -7518,179 +2928,62 @@ export class AstTaggedTemplateExpressionData extends AstData { } } -/** @internal */ -export class AsExpression extends Node implements ts.AsExpression { - declare readonly ast: AstAsExpression; - - declare _expressionBrand: any; - - get expression(): Expression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } - get type(): TypeNode { - return this.ast.data.type.node; - } - set type(value) { - this.ast.data.type = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstAsExpressionData extends AstData { expression: AstExpression = undefined!; type: AstTypeNode = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.expression) | propagateChildFlags(this.type) | TransformFlags.ContainsTypeScript; } } -/** @internal */ -export class TypeAssertion extends Node implements ts.TypeAssertion { - declare readonly ast: AstTypeAssertion; - - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - - get type(): TypeNode { - return this.ast.data.type.node; - } - set type(value) { - this.ast.data.type = value.ast; - } - get expression(): UnaryExpression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstTypeAssertionData extends AstData { type: AstTypeNode = undefined!; expression: AstUnaryExpression = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.expression) | propagateChildFlags(this.type) | TransformFlags.ContainsTypeScript; } } -/** @internal */ -export class SatisfiesExpression extends Node implements ts.SatisfiesExpression { - declare readonly ast: AstSatisfiesExpression; - - declare _expressionBrand: any; - - get expression(): Expression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } - get type(): TypeNode { - return this.ast.data.type.node; - } - set type(value) { - this.ast.data.type = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstSatisfiesExpressionData extends AstData { expression: AstExpression = undefined!; type: AstTypeNode = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.expression) | propagateChildFlags(this.type) | TransformFlags.ContainsTypeScript; } } -/** @internal */ -export class NonNullExpression extends Node implements ts.NonNullExpression { - declare readonly ast: AstNonNullExpression; - - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - - get expression(): Expression { - return this.ast.data.expression.node; - } - set expression(value: Expression) { - this.ast.data.expression = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstNonNullExpressionData extends AstData { expression: AstExpression = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.expression) | TransformFlags.ContainsTypeScript; } } -/** @internal */ -export interface NonNullChain extends NonNullExpression { - readonly ast: AstNonNullChain; - _optionalChainBrand: any; -} - -/** @internal */ export type AstNonNullChain = AstNode; -/** @internal */ -export class MetaProperty extends Node implements FlowContainer, ts.MetaProperty { - declare readonly ast: AstMetaProperty; - - declare _primaryExpressionBrand: any; - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - declare _flowContainerBrand: any; - - get keywordToken(): SyntaxKind.ImportKeyword | SyntaxKind.NewKeyword { - return this.ast.data.keywordToken; - } - set keywordToken(value: SyntaxKind.ImportKeyword | SyntaxKind.NewKeyword) { - this.ast.data.keywordToken = value; - } - get name(): Identifier { - return this.ast.data.name.node; - } - set name(value: Identifier) { - this.ast.data.name = value.ast; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value) { - this.ast.data.flowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstMetaPropertyData extends AstData { keywordToken: SyntaxKind.NewKeyword | SyntaxKind.ImportKeyword = undefined!; name: AstIdentifier = undefined!; - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { let transformFlags = propagateChildFlags(this.name); switch (this.keywordToken) { case SyntaxKind.NewKeyword: @@ -7706,44 +2999,13 @@ export class AstMetaPropertyData extends AstData { } } -/** @internal */ -export class JsxElement extends Node implements ts.JsxElement { - declare readonly ast: AstJsxElement; - - declare _primaryExpressionBrand: any; - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - - get openingElement(): JsxOpeningElement { - return this.ast.data.openingElement.node; - } - set openingElement(value: JsxOpeningElement) { - this.ast.data.openingElement = value.ast; - } - get children(): NodeArray { - return this.ast.data.children.nodes; - } - set children(value: NodeArray) { - this.ast.data.children = value.ast; - } - get closingElement(): JsxClosingElement { - return this.ast.data.closingElement.node; - } - set closingElement(value: JsxClosingElement) { - this.ast.data.closingElement = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJsxElementData extends AstData { openingElement: AstJsxOpeningElement = undefined!; children: AstNodeArray = undefined!; closingElement: AstJsxClosingElement = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.openingElement) | propagateChildrenFlags(this.children) | propagateChildFlags(this.closingElement) | @@ -7751,177 +3013,48 @@ export class AstJsxElementData extends AstData { } } -/** @internal */ -export type JsxOpeningLikeElement = - | JsxSelfClosingElement - | JsxOpeningElement; - -/** @internal */ export type AstJsxOpeningLikeElement = AstNodeOneOf; - -/** @internal */ -export type JsxAttributeLike = - | JsxAttribute - | JsxSpreadAttribute; - -/** @internal */ export type AstJsxAttributeLike = AstNodeOneOf; - -/** @internal */ -export type JsxAttributeName = - | Identifier - | JsxNamespacedName; - -/** @internal */ export type AstJsxAttributeName = AstNodeOneOf; - -/** @internal */ -export type JsxTagNameExpression = - | Identifier - | ThisExpression - | JsxTagNamePropertyAccess - | JsxNamespacedName; - -/** @internal */ export type AstJsxTagNameExpression = AstNodeOneOf; - -/** @internal */ -export interface JsxTagNamePropertyAccess extends PropertyAccessExpression { - readonly ast: AstJsxTagNamePropertyAccess; - readonly data: AstJsxTagNamePropertyAccessData; - readonly expression: Identifier | ThisExpression | JsxTagNamePropertyAccess; -} - -/** @internal */ export type AstJsxTagNamePropertyAccess = AstNode; -/** @internal */ export interface AstJsxTagNamePropertyAccessData extends AstPropertyAccessExpressionData { expression: AstIdentifier | AstThisExpression | AstJsxTagNamePropertyAccess; } -/** @internal */ -export class JsxAttributes extends Node implements Declaration, ts.JsxAttributes { - declare readonly ast: AstJsxAttributes; - - declare _primaryExpressionBrand: any; - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - declare _declarationBrand: any; - - override get parent() { - return super.parent as JsxOpeningLikeElement; - } - override set parent(value) { - super.parent = value; - } - - get properties(): NodeArray { - return this.ast.data.properties.nodes; - } - set properties(value) { - this.ast.data.properties = value.ast; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstJsxAttributesData extends AstData { properties: AstNodeArray = undefined!; - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildrenFlags(this.properties) | TransformFlags.ContainsJsx; } } -/** @internal */ -export class JsxNamespacedName extends Node implements ts.JsxNamespacedName { - declare readonly ast: AstJsxNamespacedName; - - get name(): Identifier { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } - get namespace(): Identifier { - return this.ast.data.namespace.node; - } - set namespace(value) { - this.ast.data.namespace = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJsxNamespacedNameData extends AstData { name: AstIdentifier = undefined!; namespace: AstIdentifier = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.namespace) | propagateChildFlags(this.name) | TransformFlags.ContainsJsx; } } -/** @internal */ -export class JsxOpeningElement extends Node implements ts.JsxOpeningElement { - declare readonly ast: AstJsxOpeningElement; - - declare _expressionBrand: any; - - override get parent() { - return super.parent as JsxElement; - } - override set parent(value) { - super.parent = value; - } - - get tagName(): JsxTagNameExpression { - return this.ast.data.tagName.node; - } - set tagName(value) { - this.ast.data.tagName = value.ast; - } - get typeArguments(): NodeArray | undefined { - return this.ast.data.typeArguments?.nodes; - } - set typeArguments(value) { - this.ast.data.typeArguments = value?.ast; - } - get attributes(): JsxAttributes { - return this.ast.data.attributes.node; - } - set attributes(value) { - this.ast.data.attributes = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJsxOpeningElementData extends AstData { tagName: AstJsxTagNameExpression = undefined!; typeArguments: AstNodeArray | undefined = undefined; attributes: AstJsxAttributes = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { let transformFlags = propagateChildFlags(this.tagName) | propagateChildrenFlags(this.typeArguments) | propagateChildFlags(this.attributes) | @@ -7933,73 +3066,23 @@ export class AstJsxOpeningElementData extends AstData { } } -/** @internal */ -export class JsxClosingElement extends Node implements ts.JsxClosingElement { - declare readonly ast: AstJsxClosingElement; - - override get parent() { - return super.parent as JsxElement; - } - override set parent(value) { - super.parent = value; - } - - get tagName(): JsxTagNameExpression { - return this.ast.data.tagName.node; - } - set tagName(value) { - this.ast.data.tagName = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJsxClosingElementData extends AstData { tagName: AstJsxTagNameExpression = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.tagName) | TransformFlags.ContainsJsx; } } -/** @internal */ -export class JsxSelfClosingElement extends Node implements ts.JsxSelfClosingElement { - declare readonly ast: AstJsxSelfClosingElement; - - declare _primaryExpressionBrand: any; - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - - get tagName(): JsxTagNameExpression { - return this.ast.data.tagName.node; - } - set tagName(value) { - this.ast.data.tagName = value.ast; - } - get typeArguments(): NodeArray | undefined { - return this.ast.data.typeArguments?.nodes; - } - set typeArguments(value) { - this.ast.data.typeArguments = value?.ast; - } - get attributes(): JsxAttributes { - return this.ast.data.attributes.node; - } - set attributes(value) { - this.ast.data.attributes = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJsxSelfClosingElementData extends AstData { tagName: AstJsxTagNameExpression = undefined!; typeArguments: AstNodeArray | undefined = undefined; attributes: AstJsxAttributes = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { let transformFlags = propagateChildFlags(this.tagName) | propagateChildrenFlags(this.typeArguments) | propagateChildFlags(this.attributes) | @@ -8011,44 +3094,13 @@ export class AstJsxSelfClosingElementData extends AstData { } } -/** @internal */ -export class JsxFragment extends Node implements ts.JsxFragment { - declare readonly ast: AstJsxFragment; - - declare _primaryExpressionBrand: any; - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - - get openingFragment(): JsxOpeningFragment { - return this.ast.data.openingFragment.node; - } - set openingFragment(value: JsxOpeningFragment) { - this.ast.data.openingFragment = value.ast; - } - get children(): NodeArray { - return this.ast.data.children.nodes; - } - set children(value: NodeArray) { - this.ast.data.children = value.ast; - } - get closingFragment(): JsxClosingFragment { - return this.ast.data.closingFragment.node; - } - set closingFragment(value: JsxClosingFragment) { - this.ast.data.closingFragment = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJsxFragmentData extends AstData { openingFragment: AstJsxOpeningFragment = undefined!; children: AstNodeArray = undefined!; closingFragment: AstJsxClosingFragment = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.openingFragment) | propagateChildrenFlags(this.children) | propagateChildFlags(this.closingFragment) | @@ -8056,469 +3108,130 @@ export class AstJsxFragmentData extends AstData { } } -/** @internal */ -export class JsxOpeningFragment extends Node implements ts.JsxOpeningFragment { - declare readonly ast: AstJsxOpeningFragment; - - declare _expressionBrand: any; // TODO: is this accurate? - - override get parent() { - return super.parent as JsxFragment; - } - override set parent(value) { - super.parent = value; - } -} - -/** @internal */ +// dprint-ignore export class AstJsxOpeningFragmentData extends AstData { - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return TransformFlags.ContainsJsx; } } -/** @internal */ -export class JsxClosingFragment extends Node implements ts.JsxClosingFragment { - declare readonly ast: AstJsxClosingFragment; - - declare _expressionBrand: any; // TODO: is this accurate? - - override get parent() { - return super.parent as JsxFragment; - } - override set parent(value) { - super.parent = value; - } -} - -/** @internal */ +// dprint-ignore export class AstJsxClosingFragmentData extends AstData { - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return TransformFlags.ContainsJsx; } } -/** @internal */ -export class JsxAttribute extends Node implements Declaration, ts.JsxAttribute { - declare readonly ast: AstJsxAttribute; - - declare _declarationBrand: any; - - override get parent() { - return super.parent as JsxAttributes; - } - override set parent(value) { - super.parent = value; - } - - get name(): JsxAttributeName { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } - get initializer(): JsxAttributeValue | undefined { - return this.ast.data.initializer?.node; - } - set initializer(value) { - this.ast.data.initializer = value?.ast; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstJsxAttributeData extends AstData { name: AstJsxAttributeName = undefined!; initializer: AstJsxAttributeValue | undefined = undefined; - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.name) | propagateChildFlags(this.initializer) | TransformFlags.ContainsJsx; } } -/** @internal */ -export type JsxAttributeValue = - | StringLiteral - | JsxExpression - | JsxElement - | JsxSelfClosingElement - | JsxFragment; - -/** @internal */ export type AstJsxAttributeValue = AstNodeOneOf; -/** @internal */ -export class JsxSpreadAttribute extends Node implements ts.JsxSpreadAttribute { - declare readonly ast: AstJsxSpreadAttribute; - - declare _objectLiteralBrand: any; - declare _declarationBrand: any; - declare symbol: never; - declare localSymbol: never; - - override get parent() { - return super.parent as JsxAttributes; - } - override set parent(value) { - super.parent = value; - } - - get expression(): Expression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJsxSpreadAttributeData extends AstData { expression: AstExpression = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.expression) | TransformFlags.ContainsJsx; } } -/** @internal */ -export class JsxExpression extends Node implements ts.JsxExpression { - declare readonly ast: AstJsxExpression; - - declare _expressionBrand: any; // TODO: is this accurate? - - override get parent() { - return super.parent as JsxElement | JsxFragment | JsxAttributeLike; - } - override set parent(value) { - super.parent = value; - } - - get dotDotDotToken(): DotDotDotToken | undefined { - return this.ast.data.dotDotDotToken?.node; - } - set dotDotDotToken(value) { - this.ast.data.dotDotDotToken = value?.ast; - } - get expression(): Expression | undefined { - return this.ast.data.expression?.node; - } - set expression(value) { - this.ast.data.expression = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJsxExpressionData extends AstData { dotDotDotToken: AstDotDotDotToken | undefined = undefined; expression: AstExpression | undefined = undefined; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.dotDotDotToken) | propagateChildFlags(this.expression) | TransformFlags.ContainsJsx; } } -/** @internal */ -export class JsxText extends Token implements ts.JsxText, LiteralLikeNode { - declare readonly ast: AstJsxText; - - override get parent() { - return super.parent as JsxElement | JsxFragment; - } - override set parent(value) { - super.parent = value; - } - - get text(): string { - return this.ast.data.text; - } - set text(value) { - this.ast.data.text = value; - } - get isUnterminated(): boolean | undefined { - return this.ast.data.isUnterminated; - } - set isUnterminated(value) { - this.ast.data.isUnterminated = value; - } - get hasExtendedUnicodeEscape(): boolean | undefined { - return this.ast.data.hasExtendedUnicodeEscape; - } - set hasExtendedUnicodeEscape(value) { - this.ast.data.hasExtendedUnicodeEscape = value; - } - get containsOnlyTriviaWhiteSpaces(): boolean { - return this.ast.data.containsOnlyTriviaWhiteSpaces; - } - set containsOnlyTriviaWhiteSpaces(value) { - this.ast.data.containsOnlyTriviaWhiteSpaces = value; - } -} - -/** @internal */ +// dprint-ignore export class AstJsxTextData extends AstData { text = ""; isUnterminated: boolean | undefined = undefined; hasExtendedUnicodeEscape: boolean | undefined = undefined; containsOnlyTriviaWhiteSpaces: boolean = false; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return TransformFlags.ContainsJsx; } } -/** @internal */ -export type JsxChild = - | JsxText - | JsxExpression - | JsxElement - | JsxSelfClosingElement - | JsxFragment; - -/** @internal */ export type AstJsxChild = AstNodeOneOf; - -/** @internal */ -export type IterationStatement = - | DoStatement - | WhileStatement - | ForStatement - | ForInOrOfStatement; - -/** @internal */ export type AstIterationStatement = AstNodeOneOf; -/** @internal */ -export class EmptyStatement extends Node implements JSDocContainer, ts.EmptyStatement { - declare readonly ast: AstEmptyStatement; - - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } -} - -/** @internal */ +// dprint-ignore export class AstEmptyStatementData extends AstData { - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return TransformFlags.None; } } -/** @internal */ -export class DebuggerStatement extends Node implements JSDocContainer, FlowContainer, ts.DebuggerStatement { - declare readonly ast: AstDebuggerStatement; - - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - declare _flowContainerBrand: any; - - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value: FlowNode | undefined) { - this.ast.data.flowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstDebuggerStatementData extends AstData { - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return TransformFlags.None; } } -/** @internal */ -export class MissingDeclaration extends Node implements JSDocContainer, Declaration, ts.MissingDeclaration { - declare readonly ast: AstMissingDeclaration; - - declare _declarationBrand: any; - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - declare _primaryExpressionBrand: any; - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - - get name(): Identifier | undefined { - return this.ast.data.name?.node; - } - set name(value) { - this.ast.data.name = value?.ast; - } - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstMissingDeclarationData extends AstData { name: AstIdentifier | undefined = undefined; modifiers: AstNodeArray | undefined = undefined; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return TransformFlags.None; } } -/** @internal */ -export class Block extends Node implements JSDocContainer, LocalsContainer, ts.Block { - declare readonly ast: AstBlock; - - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - declare _localsContainerBrand: any; - - get statements(): NodeArray { - return this.ast.data.statements.nodes; - } - set statements(value) { - this.ast.data.statements = value.ast; - } - get multiLine(): boolean | undefined { - return this.ast.data.multiLine; - } - set multiLine(value) { - this.ast.data.multiLine = value; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstBlockData extends AstData { statements: AstNodeArray = undefined!; - multiLine: boolean | undefined = undefined; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; + /** @internal */ multiLine: boolean | undefined = undefined; + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildrenFlags(this.statements); } } -/** @internal */ -export class VariableStatement extends Node implements JSDocContainer, FlowContainer, ts.VariableStatement { - declare readonly ast: AstVariableStatement; - - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - declare _flowContainerBrand: any; - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get declarationList(): VariableDeclarationList { - return this.ast.data.declarationList.node; - } - set declarationList(value) { - this.ast.data.declarationList = value.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value: FlowNode | undefined) { - this.ast.data.flowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstVariableStatementData extends AstData { modifiers: AstNodeArray | undefined = undefined; declarationList: AstVariableDeclarationList = undefined!; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { let transformFlags = propagateChildrenFlags(this.modifiers) | propagateChildFlags(this.declarationList); if (modifiersToFlags(this.modifiers?.items) & ModifierFlags.Ambient) { @@ -8528,281 +3241,77 @@ export class AstVariableStatementData extends AstData { } } -/** @internal */ -export class ExpressionStatement extends Node implements JSDocContainer, FlowContainer, ts.ExpressionStatement { - declare readonly ast: AstExpressionStatement; - - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - declare _flowContainerBrand: any; - - get expression(): Expression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value: FlowNode | undefined) { - this.ast.data.flowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstExpressionStatementData extends AstData { expression: AstExpression = undefined!; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.expression); } } -/** @internal */ -export interface PrologueDirective extends ExpressionStatement { - readonly expression: StringLiteral; -} - -/** @internal */ -export class IfStatement extends Node implements JSDocContainer, FlowContainer, ts.IfStatement { - declare readonly ast: AstIfStatement; - - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - declare _flowContainerBrand: any; - - get expression(): Expression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } - get thenStatement(): Statement { - return this.ast.data.thenStatement.node; - } - set thenStatement(value) { - this.ast.data.thenStatement = value.ast; - } - get elseStatement(): Statement | undefined { - return this.ast.data.elseStatement?.node; - } - set elseStatement(value) { - this.ast.data.elseStatement = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value: FlowNode | undefined) { - this.ast.data.flowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstIfStatementData extends AstData { expression: AstExpression = undefined!; thenStatement: AstStatement = undefined!; elseStatement: AstStatement | undefined = undefined; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.expression) | propagateChildFlags(this.thenStatement) | propagateChildFlags(this.elseStatement); } } -/** @internal */ -export class DoStatement extends Node implements JSDocContainer, FlowContainer, ts.DoStatement { - declare readonly ast: AstDoStatement; - - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - declare _flowContainerBrand: any; - - get statement(): Statement { - return this.ast.data.statement.node; - } - set statement(value) { - this.ast.data.statement = value.ast; - } - get expression(): Expression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value: FlowNode | undefined) { - this.ast.data.flowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstDoStatementData extends AstData { statement: AstStatement = undefined!; expression: AstExpression = undefined!; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.statement) | propagateChildFlags(this.expression); } } -/** @internal */ -export class WhileStatement extends Node implements JSDocContainer, FlowContainer, ts.WhileStatement { - declare readonly ast: AstWhileStatement; - - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - declare _flowContainerBrand: any; - - get expression(): Expression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } - get statement(): Statement { - return this.ast.data.statement.node; - } - set statement(value) { - this.ast.data.statement = value.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value: FlowNode | undefined) { - this.ast.data.flowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstWhileStatementData extends AstData { expression: AstExpression = undefined!; statement: AstStatement = undefined!; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.expression) | propagateChildFlags(this.statement); } } -/** @internal */ -export type ForInitializer = - | VariableDeclarationList - | Expression; - -/** @internal */ export type AstForInitializer = AstNodeOneOf; -/** @internal */ -export class ForStatement extends Node implements JSDocContainer, LocalsContainer, FlowContainer, ts.ForStatement { - declare readonly ast: AstForStatement; - - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - declare _localsContainerBrand: any; - declare _flowContainerBrand: any; - - get initializer(): ForInitializer | undefined { - return this.ast.data.initializer?.node; - } - set initializer(value) { - this.ast.data.initializer = value?.ast; - } - get condition(): Expression | undefined { - return this.ast.data.condition?.node; - } - set condition(value) { - this.ast.data.condition = value?.ast; - } - get incrementor(): Expression | undefined { - return this.ast.data.incrementor?.node; - } - set incrementor(value) { - this.ast.data.incrementor = value?.ast; - } - get statement(): Statement { - return this.ast.data.statement.node; - } - set statement(value) { - this.ast.data.statement = value.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value: FlowNode | undefined) { - this.ast.data.flowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstForStatementData extends AstData { initializer: AstForInitializer | undefined = undefined; condition: AstExpression | undefined = undefined; incrementor: AstExpression | undefined = undefined; statement: AstStatement = undefined!; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.initializer) | propagateChildFlags(this.condition) | propagateChildFlags(this.incrementor) | @@ -8810,157 +3319,39 @@ export class AstForStatementData extends AstData { } } -/** @internal */ -export type ForInOrOfStatement = - | ForInStatement - | ForOfStatement; - -/** @internal */ export type AstForInOrOfStatement = AstNodeOneOf; -/** @internal */ -export class ForInStatement extends Node implements JSDocContainer, LocalsContainer, FlowContainer, ts.ForInStatement { - declare readonly ast: AstForInStatement; - - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - declare _localsContainerBrand: any; - declare _flowContainerBrand: any; - - get initializer(): ForInitializer { - return this.ast.data.initializer.node; - } - set initializer(value) { - this.ast.data.initializer = value.ast; - } - get expression(): Expression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } - get statement(): Statement { - return this.ast.data.statement.node; - } - set statement(value) { - this.ast.data.statement = value.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value: FlowNode | undefined) { - this.ast.data.flowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstForInStatementData extends AstData { initializer: AstForInitializer = undefined!; expression: AstExpression = undefined!; statement: AstStatement = undefined!; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.initializer) | propagateChildFlags(this.expression) | propagateChildFlags(this.statement); } } -/** @internal */ -export class ForOfStatement extends Node implements JSDocContainer, LocalsContainer, FlowContainer, ts.ForOfStatement { - declare readonly ast: AstForOfStatement; - - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - declare _localsContainerBrand: any; - declare _flowContainerBrand: any; - - get awaitModifier(): AwaitKeyword | undefined { - return this.ast.data.awaitModifier?.node; - } - set awaitModifier(value) { - this.ast.data.awaitModifier = value?.ast; - } - get initializer(): ForInitializer { - return this.ast.data.initializer.node; - } - set initializer(value) { - this.ast.data.initializer = value.ast; - } - get expression(): Expression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } - get statement(): Statement { - return this.ast.data.statement.node; - } - set statement(value) { - this.ast.data.statement = value.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value: FlowNode | undefined) { - this.ast.data.flowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstForOfStatementData extends AstData { awaitModifier: AstAwaitKeyword | undefined = undefined; initializer: AstForInitializer = undefined!; expression: AstExpression = undefined!; statement: AstStatement = undefined!; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { let transformFlags = propagateChildFlags(this.awaitModifier) | propagateChildFlags(this.initializer) | propagateChildFlags(this.expression) | @@ -8973,130 +3364,42 @@ export class AstForOfStatementData extends AstData { } } -/** @internal */ -export class BreakStatement extends Node implements JSDocContainer, FlowContainer, ts.BreakStatement { - declare readonly ast: AstBreakStatement; - - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - declare _flowContainerBrand: any; - - get label(): Identifier | undefined { - return this.ast.data.label?.node; - } - set label(value) { - this.ast.data.label = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value: FlowNode | undefined) { - this.ast.data.flowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstBreakStatementData extends AstData { label: AstIdentifier | undefined = undefined; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.label) | TransformFlags.ContainsHoistedDeclarationOrCompletion; } } -/** @internal */ -export class ContinueStatement extends Node implements JSDocContainer, FlowContainer, ts.ContinueStatement { - declare readonly ast: AstContinueStatement; - - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - declare _flowContainerBrand: any; - - get label(): Identifier | undefined { - return this.ast.data.label?.node; - } - set label(value) { - this.ast.data.label = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value: FlowNode | undefined) { - this.ast.data.flowNode = value; - } -} - -/** @internal */ -export type BreakOrContinueStatement = - | BreakStatement - | ContinueStatement; - -/** @internal */ export type AstBreakOrContinueStatement = AstNodeOneOf; -/** @internal */ +// dprint-ignore export class AstContinueStatementData extends AstData { label: AstIdentifier | undefined = undefined; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.label) | TransformFlags.ContainsHoistedDeclarationOrCompletion; } } -/** @internal */ -export class ReturnStatement extends Node implements JSDocContainer, FlowContainer, ts.ReturnStatement { - declare readonly ast: AstReturnStatement; - - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - declare _flowContainerBrand: any; - - get expression(): Expression | undefined { - return this.ast.data.expression?.node; - } - set expression(value) { - this.ast.data.expression = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value: FlowNode | undefined) { - this.ast.data.flowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstReturnStatementData extends AstData { expression: AstExpression | undefined = undefined; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { // return in an ES2018 async generator must be awaited return propagateChildFlags(this.expression) | TransformFlags.ContainsES2018 | @@ -9104,561 +3407,150 @@ export class AstReturnStatementData extends AstData { } } -/** @internal */ -export class WithStatement extends Node implements JSDocContainer, FlowContainer, ts.WithStatement { - declare readonly ast: AstWithStatement; - - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - declare _flowContainerBrand: any; - - get expression(): Expression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } - get statement(): Statement { - return this.ast.data.statement.node; - } - set statement(value) { - this.ast.data.statement = value.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value: FlowNode | undefined) { - this.ast.data.flowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstWithStatementData extends AstData { expression: AstExpression = undefined!; statement: AstStatement = undefined!; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.expression) | propagateChildFlags(this.statement); } } -/** @internal */ -export class SwitchStatement extends Node implements JSDocContainer, FlowContainer, ts.SwitchStatement { - declare readonly ast: AstSwitchStatement; - - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - declare _flowContainerBrand: any; - - get expression(): Expression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } - get caseBlock(): CaseBlock { - return this.ast.data.caseBlock.node; - } - set caseBlock(value) { - this.ast.data.caseBlock = value.ast; - } - get possiblyExhaustive(): boolean { - return this.ast.data.possiblyExhaustive; - } - set possiblyExhaustive(value) { - this.ast.data.possiblyExhaustive = value; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value: FlowNode | undefined) { - this.ast.data.flowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstSwitchStatementData extends AstData { expression: AstExpression = undefined!; caseBlock: AstCaseBlock = undefined!; - possiblyExhaustive: boolean = false; + possiblyExhaustive: boolean | undefined = undefined; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.expression) | propagateChildFlags(this.caseBlock); } } -/** @internal */ -export class CaseBlock extends Node implements LocalsContainer, ts.CaseBlock { - declare readonly ast: AstCaseBlock; - - declare _localsContainerBrand: any; - - override get parent() { - return super.parent as SwitchStatement; - } - override set parent(value) { - super.parent = value; - } - - get clauses(): NodeArray { - return this.ast.data.clauses.nodes; - } - set clauses(value) { - this.ast.data.clauses = value.ast; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstCaseBlockData extends AstData { clauses: AstNodeArray = undefined!; - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildrenFlags(this.clauses); } } -/** @internal */ -export class CaseClause extends Node implements JSDocContainer, ts.CaseClause { - declare readonly ast: AstCaseClause; - - declare _jsdocContainerBrand: any; - - override get parent() { - return super.parent as CaseBlock; - } - override set parent(value) { - super.parent = value; - } - - get expression(): Expression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } - get statements(): NodeArray { - return this.ast.data.statements.nodes; - } - set statements(value) { - this.ast.data.statements = value.ast; - } - get fallthroughFlowNode(): ts.FlowNode | undefined { - return this.ast.data.fallthroughFlowNode; - } - set fallthroughFlowNode(value) { - this.ast.data.fallthroughFlowNode = value; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } -} - -/** @internal */ +// dprint-ignore export class AstCaseClauseData extends AstData { expression: AstExpression = undefined!; statements: AstNodeArray = undefined!; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - fallthroughFlowNode?: FlowNode | undefined; + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ fallthroughFlowNode?: FlowNode | undefined; // initialized by binding - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.expression) | propagateChildrenFlags(this.statements); } } -/** @internal */ -export class DefaultClause extends Node implements ts.DefaultClause { - declare readonly ast: AstDefaultClause; - - override get parent() { - return super.parent as CaseBlock; - } - override set parent(value) { - super.parent = value; - } - - get statements(): NodeArray { - return this.ast.data.statements.nodes; - } - set statements(value) { - this.ast.data.statements = value.ast; - } - get fallthroughFlowNode(): ts.FlowNode | undefined { - return this.ast.data.fallthroughFlowNode; - } - set fallthroughFlowNode(value) { - this.ast.data.fallthroughFlowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstDefaultClauseData extends AstData { statements: AstNodeArray = undefined!; - fallthroughFlowNode?: FlowNode | undefined = undefined; + /** @internal */ fallthroughFlowNode?: FlowNode | undefined = undefined; // initialized by binding - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildrenFlags(this.statements); } } -/** @internal */ -export type CaseOrDefaultClause = - | CaseClause - | DefaultClause; - -/** @internal */ export type AstCaseOrDefaultClause = AstNodeOneOf; -/** @internal */ -export class LabeledStatement extends Node implements JSDocContainer, FlowContainer, ts.LabeledStatement { - declare readonly ast: AstLabeledStatement; - - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - declare _flowContainerBrand: any; - - get label(): Identifier { - return this.ast.data.label.node; - } - set label(value) { - this.ast.data.label = value.ast; - } - get statement(): Statement { - return this.ast.data.statement.node; - } - set statement(value) { - this.ast.data.statement = value.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value: FlowNode | undefined) { - this.ast.data.flowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstLabeledStatementData extends AstData { label: AstIdentifier = undefined!; statement: AstStatement = undefined!; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.label) | propagateChildFlags(this.statement); } } -/** @internal */ -export class ThrowStatement extends Node implements JSDocContainer, FlowContainer, ts.ThrowStatement { - declare readonly ast: AstThrowStatement; - - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - declare _flowContainerBrand: any; - - get expression(): Expression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value: FlowNode | undefined) { - this.ast.data.flowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstThrowStatementData extends AstData { expression: AstExpression = undefined!; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.expression); } } -/** @internal */ -export class TryStatement extends Node implements JSDocContainer, FlowContainer, ts.TryStatement { - declare readonly ast: AstTryStatement; - - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - declare _flowContainerBrand: any; - - get tryBlock(): Block { - return this.ast.data.tryBlock.node; - } - set tryBlock(value) { - this.ast.data.tryBlock = value.ast; - } - get catchClause(): CatchClause | undefined { - return this.ast.data.catchClause?.node; - } - set catchClause(value) { - this.ast.data.catchClause = value?.ast; - } - get finallyBlock(): Block | undefined { - return this.ast.data.finallyBlock?.node; - } - set finallyBlock(value) { - this.ast.data.finallyBlock = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get flowNode(): FlowNode | undefined { - return this.ast.data.flowNode; - } - set flowNode(value: FlowNode | undefined) { - this.ast.data.flowNode = value; - } -} - -/** @internal */ +// dprint-ignore export class AstTryStatementData extends AstData { tryBlock: AstBlock = undefined!; catchClause: AstCatchClause | undefined = undefined; finallyBlock: AstBlock | undefined = undefined; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ flowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.tryBlock) | propagateChildFlags(this.catchClause) | propagateChildFlags(this.finallyBlock); } } -/** @internal */ -export class CatchClause extends Node implements LocalsContainer, ts.CatchClause { - declare readonly ast: AstCatchClause; - - declare _localsContainerBrand: any; - - override get parent() { - return super.parent as TryStatement; - } - override set parent(value) { - super.parent = value; - } - - get variableDeclaration(): VariableDeclaration | undefined { - return this.ast.data.variableDeclaration?.node; - } - set variableDeclaration(value) { - this.ast.data.variableDeclaration = value?.ast; - } - get block(): Block { - return this.ast.data.block.node; - } - set block(value) { - this.ast.data.block = value.ast; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstCatchClauseData extends AstData { variableDeclaration: AstVariableDeclaration | undefined = undefined; block: AstBlock = undefined!; - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.variableDeclaration) | propagateChildFlags(this.block) | (!this.variableDeclaration ? TransformFlags.ContainsES2019 : TransformFlags.None); } } -/** @internal */ -export type ObjectTypeDeclaration = - | ClassLikeDeclaration - | InterfaceDeclaration - | TypeLiteralNode; - -/** @internal */ export type AstObjectTypeDeclaration = AstNodeOneOf; - -/** @internal */ -export type DeclarationWithTypeParameterChildren = - | SignatureDeclaration - | ClassLikeDeclaration - | InterfaceDeclaration - | TypeAliasDeclaration - | JSDocTemplateTag; - -/** @internal */ export type AstDeclarationWithTypeParameterChildren = AstNodeOneOf; - -/** @internal */ -export type ClassElement = - | PropertyDeclaration - | MethodDeclaration - | ConstructorDeclaration - | SemicolonClassElement - | AccessorDeclaration - | IndexSignatureDeclaration - | ClassStaticBlockDeclaration; - -/** @internal */ export type AstClassElement = AstNodeOneOf; - -/** @internal */ -export type ClassLikeDeclaration = - | ClassDeclaration - | ClassExpression; - -/** @internal */ export type AstClassLikeDeclaration = AstNodeOneOf; -/** @internal */ -export class ClassDeclaration extends Node implements JSDocContainer, Declaration, ts.ClassDeclaration { - declare readonly ast: AstClassDeclaration; - - declare _declarationBrand: any; - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get name(): Identifier | undefined { - return this.ast.data.name?.node; - } - set name(value) { - this.ast.data.name = value?.ast; - } - get typeParameters(): NodeArray | undefined { - return this.ast.data.typeParameters?.nodes; - } - set typeParameters(value) { - this.ast.data.typeParameters = value?.ast; - } - get heritageClauses(): NodeArray | undefined { - return this.ast.data.heritageClauses?.nodes; - } - set heritageClauses(value) { - this.ast.data.heritageClauses = value?.ast; - } - get members(): NodeArray { - return this.ast.data.members.nodes; - } - set members(value: NodeArray) { - this.ast.data.members = value.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstClassDeclarationData extends AstData { modifiers: AstNodeArray | undefined = undefined; + /** May be undefined in `export default class { ... }`. */ name: AstIdentifier | undefined = undefined; typeParameters: AstNodeArray | undefined = undefined; heritageClauses: AstNodeArray | undefined = undefined; members: AstNodeArray = undefined!; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { if (modifiersToFlags(this.modifiers?.items) & ModifierFlags.Ambient) { return TransformFlags.ContainsTypeScript; } @@ -9678,70 +3570,7 @@ export class AstClassDeclarationData extends AstData { } } -/** @internal */ -export class ClassExpression extends Node implements JSDocContainer, Declaration, ts.ClassExpression { - declare readonly ast: AstClassExpression; - - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - declare _primaryExpressionBrand: any; - declare _memberExpressionBrand: any; - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get name(): Identifier | undefined { - return this.ast.data.name?.node; - } - set name(value) { - this.ast.data.name = value?.ast; - } - get typeParameters(): NodeArray | undefined { - return this.ast.data.typeParameters?.nodes; - } - set typeParameters(value) { - this.ast.data.typeParameters = value?.ast; - } - get heritageClauses(): NodeArray | undefined { - return this.ast.data.heritageClauses?.nodes; - } - set heritageClauses(value) { - this.ast.data.heritageClauses = value?.ast; - } - get members(): NodeArray { - return this.ast.data.members.nodes; - } - set members(value) { - this.ast.data.members = value.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstClassExpressionData extends AstData { modifiers: AstNodeArray | undefined = undefined; name: AstIdentifier | undefined = undefined; @@ -9749,11 +3578,11 @@ export class AstClassExpressionData extends AstData { heritageClauses: AstNodeArray | undefined = undefined; members: AstNodeArray = undefined!; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildrenFlags(this.modifiers) | propagateNameFlags(this.name) | propagateChildrenFlags(this.typeParameters) | @@ -9764,83 +3593,9 @@ export class AstClassExpressionData extends AstData { } } -/** @internal */ -export interface TypeElement extends Declaration { - readonly ast: AstTypeElement; - _typeElementBrand: any; -} - -/** @internal */ export type AstTypeElement = AstNode; -// type TypeElement = -// | CallSignatureDeclaration -// | ConstructSignatureDeclaration -// | MethodSignature -// | IndexSignatureDeclaration -// | PropertySignature -// | AccessorDeclaration -// ; - -/** @internal */ -export class InterfaceDeclaration extends Node implements JSDocContainer, Declaration, ts.InterfaceDeclaration { - declare readonly ast: AstInterfaceDeclaration; - - declare _declarationBrand: any; - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get name(): Identifier { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } - get typeParameters(): NodeArray | undefined { - return this.ast.data.typeParameters?.nodes; - } - set typeParameters(value) { - this.ast.data.typeParameters = value?.ast; - } - get heritageClauses(): NodeArray | undefined { - return this.ast.data.heritageClauses?.nodes; - } - set heritageClauses(value) { - this.ast.data.heritageClauses = value?.ast; - } - get members(): NodeArray { - return this.ast.data.members.nodes; - } - set members(value) { - this.ast.data.members = value.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstInterfaceDeclarationData extends AstTypeScriptNodeData { modifiers: AstNodeArray | undefined = undefined; name: AstIdentifier = undefined!; @@ -9848,42 +3603,17 @@ export class AstInterfaceDeclarationData extends AstTypeScriptNodeData { heritageClauses: AstNodeArray | undefined = undefined; members: AstNodeArray = undefined!; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) } -/** @internal */ -export class HeritageClause extends Node implements ts.HeritageClause { - declare readonly ast: AstHeritageClause; - - override get parent() { - return super.parent as InterfaceDeclaration | ClassLikeDeclaration; - } - override set parent(value) { - super.parent = value; - } - - get token(): ts.SyntaxKind.ExtendsKeyword | ts.SyntaxKind.ImplementsKeyword { - return this.ast.data.token; - } - set token(value) { - this.ast.data.token = value; - } - get types(): NodeArray { - return this.ast.data.types.nodes; - } - set types(value) { - this.ast.data.types = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstHeritageClauseData extends AstData { token: SyntaxKind.ExtendsKeyword | SyntaxKind.ImplementsKeyword = undefined!; types: AstNodeArray = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { switch (this.token) { case SyntaxKind.ExtendsKeyword: return propagateChildrenFlags(this.types) | TransformFlags.ContainsES2015; @@ -9895,142 +3625,31 @@ export class AstHeritageClauseData extends AstData { } } -/** @internal */ -export class TypeAliasDeclaration extends Node implements JSDocContainer, Declaration, LocalsContainer, ts.TypeAliasDeclaration { - declare readonly ast: AstTypeAliasDeclaration; - - declare _declarationBrand: any; - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - declare _localsContainerBrand: any; - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get name(): Identifier { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } - get typeParameters(): NodeArray | undefined { - return this.ast.data.typeParameters?.nodes; - } - set typeParameters(value) { - this.ast.data.typeParameters = value?.ast; - } - get type(): TypeNode { - return this.ast.data.type.node; - } - set type(value) { - this.ast.data.type = value.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstTypeAliasDeclarationData extends AstTypeScriptNodeData { modifiers: AstNodeArray | undefined = undefined; name: AstIdentifier = undefined!; typeParameters: AstNodeArray | undefined = undefined; type: AstTypeNode = undefined!; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; } -/** @internal */ -export class EnumDeclaration extends Node implements JSDocContainer, Declaration, ts.EnumDeclaration { - declare readonly ast: AstEnumDeclaration; - - declare _declarationBrand: any; - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get name(): Identifier { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } - get members(): NodeArray { - return this.ast.data.members.nodes; - } - set members(value) { - this.ast.data.members = value.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstEnumDeclarationData extends AstData { modifiers: AstNodeArray | undefined = undefined; name: AstIdentifier = undefined!; members: AstNodeArray = undefined!; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { let transformFlags = propagateChildrenFlags(this.modifiers) | propagateChildFlags(this.name) | propagateChildrenFlags(this.members) | @@ -10040,163 +3659,38 @@ export class AstEnumDeclarationData extends AstData { } } -/** @internal */ -export class EnumMember extends Node implements JSDocContainer, Declaration, ts.EnumMember { - declare readonly ast: AstEnumMember; - - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - - override get parent() { - return super.parent as EnumDeclaration; - } - override set parent(value) { - super.parent = value; - } - - get name(): PropertyName { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } - get initializer(): Expression | undefined { - return this.ast.data.initializer?.node; - } - set initializer(value) { - this.ast.data.initializer = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstEnumMemberData extends AstData { name: AstPropertyName = undefined!; initializer: AstExpression | undefined = undefined; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.name) | propagateChildFlags(this.initializer) | TransformFlags.ContainsTypeScript; } } -/** @internal */ -export type ModuleName = - | Identifier - | StringLiteral; - -/** @internal */ export type AstModuleName = AstNodeOneOf; - -/** @internal */ -export type ModuleBody = - | NamespaceBody - | JSDocNamespaceBody; - -/** @internal */ export type AstModuleBody = AstNodeOneOf; -/** @internal */ -export class ModuleDeclaration extends Node implements JSDocContainer, Declaration, LocalsContainer, ts.ModuleDeclaration { - declare readonly ast: AstModuleDeclaration; - - declare _declarationBrand: any; - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - declare _localsContainerBrand: any; - - override get parent() { - return super.parent as ModuleBlock | SourceFile; - } - override set parent(value) { - super.parent = value; - } - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get name(): ModuleName { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } - get body(): ModuleBody | JSDocNamespaceDeclaration | undefined { - return this.ast.data.body?.node; - } - set body(value) { - this.ast.data.body = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstModuleDeclarationData extends AstData { modifiers: AstNodeArray | undefined = undefined; name: AstModuleName = undefined!; body: AstModuleBody | AstJSDocNamespaceDeclaration | undefined = undefined; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { if (modifiersToFlags(this.modifiers?.items) & ModifierFlags.Ambient) { return TransformFlags.ContainsTypeScript; } @@ -10211,173 +3705,49 @@ export class AstModuleDeclarationData extends AstData { } } -/** @internal */ -export type NamespaceBody = - | ModuleBlock - | NamespaceDeclaration; - -/** @internal */ export type AstNamespaceBody = AstNodeOneOf; -/** @internal */ -export interface NamespaceDeclaration extends ModuleDeclaration { - readonly ast: AstNamespaceDeclaration; - readonly data: AstNamespaceDeclarationData; - readonly name: Identifier; - readonly body: NamespaceBody; -} - -/** @internal */ export type AstNamespaceDeclaration = AstNode; -/** @internal */ export interface AstNamespaceDeclarationData extends AstModuleDeclarationData { name: AstIdentifier; body: AstNamespaceBody; } -/** @internal */ -export type JSDocNamespaceBody = - | Identifier - | JSDocNamespaceDeclaration; - -/** @internal */ export type AstJSDocNamespaceBody = AstNodeOneOf; -/** @internal */ -export interface JSDocNamespaceDeclaration extends ModuleDeclaration { - readonly ast: AstJSDocNamespaceDeclaration; - readonly data: AstJSDocNamespaceDeclarationData; - readonly name: Identifier; - readonly body: JSDocNamespaceBody | undefined; -} - -/** @internal */ export type AstJSDocNamespaceDeclaration = AstNode; -/** @internal */ export interface AstJSDocNamespaceDeclarationData extends AstModuleDeclarationData { name: AstIdentifier; body: AstJSDocNamespaceBody | undefined; } -/** @internal */ -export class ModuleBlock extends Node implements JSDocContainer, ts.ModuleBlock { - declare readonly ast: AstModuleBlock; - - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - - override get parent() { - return super.parent as ModuleDeclaration; - } - override set parent(value) { - super.parent = value; - } - - get statements(): NodeArray { - return this.ast.data.statements.nodes; - } - set statements(value) { - this.ast.data.statements = value.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } -} - -/** @internal */ +// dprint-ignore export class AstModuleBlockData extends AstData { statements: AstNodeArray = undefined!; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildrenFlags(this.statements); } } -/** @internal */ -export type ModuleReference = - | EntityName - | ExternalModuleReference; - -/** @internal */ export type AstModuleReference = AstNodeOneOf; -/** @internal */ -export class ImportEqualsDeclaration extends Node implements JSDocContainer, Declaration, ts.ImportEqualsDeclaration { - declare readonly ast: AstImportEqualsDeclaration; - - declare _declarationBrand: any; - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - - override get parent() { - return super.parent as ModuleBlock | SourceFile; - } - override set parent(value) { - super.parent = value; - } - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get name(): Identifier { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } - get isTypeOnly(): boolean { - return this.ast.data.isTypeOnly; - } - set isTypeOnly(value) { - this.ast.data.isTypeOnly = value; - } - get moduleReference(): ModuleReference { - return this.ast.data.moduleReference.node; - } - set moduleReference(value) { - this.ast.data.moduleReference = value.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstImportEqualsDeclarationData extends AstData { modifiers: AstNodeArray | undefined = undefined; name: AstIdentifier = undefined!; isTypeOnly: boolean = undefined!; moduleReference: AstModuleReference = undefined!; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { let transformFlags = propagateChildrenFlags(this.modifiers) | propagateIdentifierNameFlags(this.name) | propagateChildFlags(this.moduleReference); @@ -10390,113 +3760,29 @@ export class AstImportEqualsDeclarationData extends AstData { } } -/** @internal */ -export class ExternalModuleReference extends Node implements ts.ExternalModuleReference { - declare readonly ast: AstExternalModuleReference; - - override get parent() { - return super.parent as ImportEqualsDeclaration; - } - override set parent(value) { - super.parent = value; - } - - get expression(): Expression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstExternalModuleReferenceData extends AstData { expression: AstExpression = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { // always parsed in an Await context return propagateChildFlags(this.expression) & ~TransformFlags.ContainsPossibleTopLevelAwait; } } -/** @internal */ -export class ImportDeclaration extends Node implements JSDocContainer, Declaration, ts.ImportDeclaration { - declare readonly ast: AstImportDeclaration; - - declare _declarationBrand: any; - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - - override get parent() { - return super.parent as ModuleBlock | SourceFile; - } - override set parent(value) { - super.parent = value; - } - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get importClause(): ImportClause | undefined { - return this.ast.data.importClause?.node; - } - set importClause(value) { - this.ast.data.importClause = value?.ast; - } - get moduleSpecifier(): Expression { - return this.ast.data.moduleSpecifier.node; - } - set moduleSpecifier(value) { - this.ast.data.moduleSpecifier = value.ast; - } - get attributes(): ImportAttributes | undefined { - return this.ast.data.attributes?.node; - } - set attributes(value) { - this.ast.data.attributes = value?.ast; - } - /** @deprecated */ - get assertClause(): ImportAttributes | undefined { - return this.ast.data.attributes?.node; - } - set assertClause(value) { - this.ast.data.attributes = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstImportDeclarationData extends AstData { modifiers: AstNodeArray | undefined = undefined; importClause: AstImportClause | undefined = undefined; + /** If this is not a StringLiteral it will be a grammar error. */ moduleSpecifier: AstExpression = undefined!; attributes: AstImportAttributes | undefined = undefined; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { let transformFlags = propagateChildFlags(this.importClause) | propagateChildFlags(this.moduleSpecifier); transformFlags &= ~TransformFlags.ContainsPossibleTopLevelAwait; // always parsed in an Await context @@ -10504,77 +3790,19 @@ export class AstImportDeclarationData extends AstData { } } -/** @internal */ -export type NamedImportBindings = - | NamespaceImport - | NamedImports; - -/** @internal */ export type AstNamedImportBindings = AstNodeOneOf; - -/** @internal */ -export type NamedExportBindings = - | NamespaceExport - | NamedExports; - -/** @internal */ export type AstNamedExportBindings = AstNodeOneOf; -/** @internal */ -export class ImportClause extends Node implements Declaration, ts.ImportClause { - declare readonly ast: AstImportClause; - - declare _declarationBrand: any; - - override get parent() { - return super.parent as ImportDeclaration | JSDocImportTag; - } - override set parent(value) { - super.parent = value; - } - - get isTypeOnly(): boolean { - return this.ast.data.isTypeOnly; - } - set isTypeOnly(value) { - this.ast.data.isTypeOnly = value; - } - get name(): Identifier | undefined { - return this.ast.data.name?.node; - } - set name(value) { - this.ast.data.name = value?.ast; - } - get namedBindings(): NamedImportBindings | undefined { - return this.ast.data.namedBindings?.node; - } - set namedBindings(value) { - this.ast.data.namedBindings = value?.ast; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstImportClauseData extends AstData { isTypeOnly: boolean = false; - name: AstIdentifier | undefined = undefined; + name: AstIdentifier | undefined = undefined; // Default binding namedBindings: AstNamedImportBindings | undefined = undefined; - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { let transformFlags = propagateChildFlags(this.name) | propagateChildFlags(this.namedBindings); if (this.isTypeOnly) { @@ -10585,210 +3813,57 @@ export class AstImportClauseData extends AstData { } } -/** @internal */ -export type AssertionKey = - | Identifier - | StringLiteral; - -/** @internal */ export type AstAssertionKey = AstNodeOneOf; - -/** - * @deprecated - * @internal - */ -export type AssertEntry = ImportAttribute; - -/** - * @deprecated - * @internal - */ +/** @deprecated */ export type AstAssertEntry = AstImportAttribute; - -/** @internal */ -export type ImportAttributeName = - | Identifier - | StringLiteral; - -/** @internal */ export type AstImportAttributeName = AstNodeOneOf; -/** @internal */ -export class ImportAttribute extends Node implements ts.ImportAttribute { - declare readonly ast: AstImportAttribute; - - override get parent() { - return super.parent as ImportAttributes; - } - override set parent(value) { - super.parent = value; - } - - get name(): ImportAttributeName { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } - get value(): Expression { - return this.ast.data.value.node; - } - set value(value) { - this.ast.data.value = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstImportAttributeData extends AstData { name: AstImportAttributeName = undefined!; value: AstExpression = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return TransformFlags.ContainsESNext; } } -/** - * @deprecated - * @internal - */ -export type AssertClause = ImportAttributes; - -/** - * @deprecated - * @internal - */ +/** @deprecated */ export type AstAssertClause = AstNode; -/** @internal */ -export class ImportAttributes extends Node implements ts.ImportAttributes { - declare readonly ast: AstImportAttributes; - - override get parent() { - return super.parent as ImportDeclaration | ExportDeclaration; - } - override set parent(value) { - super.parent = value; - } - - get token(): ts.SyntaxKind.WithKeyword | ts.SyntaxKind.AssertKeyword { - return this.ast.data.token; - } - set token(value) { - this.ast.data.token = value; - } - get elements(): NodeArray { - return this.ast.data.elements.nodes; - } - set elements(value) { - this.ast.data.elements = value.ast; - } - get multiLine(): boolean | undefined { - return this.ast.data.multiLine; - } - set multiLine(value) { - this.ast.data.multiLine = value; - } -} - -/** @internal */ +// dprint-ignore export class AstImportAttributesData extends AstData { token: SyntaxKind.WithKeyword | SyntaxKind.AssertKeyword = SyntaxKind.WithKeyword; elements: AstNodeArray = undefined!; multiLine: boolean | undefined = undefined; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return TransformFlags.ContainsESNext; } } -/** @internal */ -export class NamespaceImport extends Node implements Declaration, ts.NamespaceImport { - declare readonly ast: AstNamespaceImport; - - declare _declarationBrand: any; - - override get parent() { - return super.parent as ImportClause; - } - override set parent(value) { - super.parent = value; - } - - get name(): Identifier { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstNamespaceImportData extends AstData { name: AstIdentifier = undefined!; - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { let transformFlags = propagateChildFlags(this.name); transformFlags &= ~TransformFlags.ContainsPossibleTopLevelAwait; // always parsed in an Await context return transformFlags; } } -/** @internal */ -export class NamespaceExport extends Node implements Declaration, ts.NamespaceExport { - declare readonly ast: AstNamespaceExport; - - declare _declarationBrand: any; - - override get parent() { - return super.parent as ExportDeclaration; - } - override set parent(value) { - super.parent = value; - } - - get name(): ModuleExportName { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstNamespaceExportData extends AstData { name: AstModuleExportName = undefined!; - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { let transformFlags = propagateChildFlags(this.name) | TransformFlags.ContainsES2020; transformFlags &= ~TransformFlags.ContainsPossibleTopLevelAwait; // always parsed in an Await context @@ -10796,133 +3871,22 @@ export class AstNamespaceExportData extends AstData { } } -/** @internal */ -export class NamespaceExportDeclaration extends Node implements JSDocContainer, Declaration, ts.NamespaceExportDeclaration { - declare readonly ast: AstNamespaceExportDeclaration; - - declare _declarationBrand: any; - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - - get name(): Identifier { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstNamespaceExportDeclarationData extends AstData { modifiers: AstNodeArray | undefined = undefined; // initialized by parser (grammar error) name: AstIdentifier = undefined!; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateIdentifierNameFlags(this.name) | TransformFlags.ContainsTypeScript; } } -/** @internal */ -export class ExportDeclaration extends Node implements JSDocContainer, Declaration, ts.ExportDeclaration { - declare readonly ast: AstExportDeclaration; - - declare _declarationBrand: any; - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - - override get parent() { - return super.parent as SourceFile | ModuleBlock; - } - override set parent(value) { - super.parent = value; - } - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get isTypeOnly(): boolean { - return this.ast.data.isTypeOnly; - } - set isTypeOnly(value) { - this.ast.data.isTypeOnly = value; - } - get exportClause(): NamedExportBindings | undefined { - return this.ast.data.exportClause?.node; - } - set exportClause(value) { - this.ast.data.exportClause = value?.ast; - } - get moduleSpecifier(): Expression | undefined { - return this.ast.data.moduleSpecifier?.node; - } - set moduleSpecifier(value) { - this.ast.data.moduleSpecifier = value?.ast; - } - get attributes(): ImportAttributes | undefined { - return this.ast.data.attributes?.node; - } - set attributes(value) { - this.ast.data.attributes = value?.ast; - } - /** @deprecated */ - get assertClause(): ImportAttributes | undefined { - return this.ast.data.attributes?.node; - } - set assertClause(value) { - this.ast.data.attributes = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstExportDeclarationData extends AstData { modifiers: AstNodeArray | undefined = undefined; isTypeOnly = false; @@ -10930,11 +3894,11 @@ export class AstExportDeclarationData extends AstData { moduleSpecifier: AstExpression | undefined = undefined; attributes: AstImportAttributes | undefined = undefined; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { let transformFlags = propagateChildrenFlags(this.modifiers) | propagateChildFlags(this.exportClause) | propagateChildFlags(this.moduleSpecifier); @@ -10943,121 +3907,38 @@ export class AstExportDeclarationData extends AstData { } } -/** @internal */ -export class NamedImports extends Node implements ts.NamedImports { - declare readonly ast: AstNamedImports; - - override get parent() { - return super.parent as ImportClause; - } - override set parent(value) { - super.parent = value; - } - - get elements(): NodeArray { - return this.ast.data.elements.nodes; - } - set elements(value) { - this.ast.data.elements = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstNamedImportsData extends AstData { elements: AstNodeArray = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { let transformFlags = propagateChildrenFlags(this.elements); transformFlags &= ~TransformFlags.ContainsPossibleTopLevelAwait; // always parsed in an Await context return transformFlags; } } -/** @internal */ -export class NamedExports extends Node implements ts.NamedExports { - declare readonly ast: AstNamedExports; - - override get parent() { - return super.parent as ExportDeclaration; - } - override set parent(value) { - super.parent = value; - } - - get elements(): NodeArray { - return this.ast.data.elements.nodes; - } - set elements(value) { - this.ast.data.elements = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstNamedExportsData extends AstData { elements: AstNodeArray = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { let transformFlags = propagateChildrenFlags(this.elements); transformFlags &= ~TransformFlags.ContainsPossibleTopLevelAwait; // always parsed in an Await context return transformFlags; } } -/** @internal */ -export class ImportSpecifier extends Node implements Declaration, ts.ImportSpecifier { - declare readonly ast: AstImportSpecifier; - - declare _declarationBrand: any; - - override get parent() { - return super.parent as NamedImports; - } - override set parent(value) { - super.parent = value; - } - - get propertyName(): ModuleExportName | undefined { - return this.ast.data.propertyName?.node; - } - set propertyName(value) { - this.ast.data.propertyName = value?.ast; - } - get name(): Identifier { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } - get isTypeOnly(): boolean { - return this.ast.data.isTypeOnly; - } - set isTypeOnly(value) { - this.ast.data.isTypeOnly = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstImportSpecifierData extends AstData { propertyName: AstModuleExportName | undefined = undefined; name: AstIdentifier = undefined!; isTypeOnly = false; - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { let transformFlags = propagateChildFlags(this.propertyName) | propagateChildFlags(this.name); transformFlags &= ~TransformFlags.ContainsPossibleTopLevelAwait; // always parsed in an Await context @@ -11065,70 +3946,17 @@ export class AstImportSpecifierData extends AstData { } } -/** @internal */ -export class ExportSpecifier extends Node implements Declaration, JSDocContainer, ts.ExportSpecifier { - declare readonly ast: AstExportSpecifier; - - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - - override get parent() { - return super.parent as NamedExports; - } - override set parent(value) { - super.parent = value; - } - - get isTypeOnly(): boolean { - return this.ast.data.isTypeOnly; - } - set isTypeOnly(value) { - this.ast.data.isTypeOnly = value; - } - get propertyName(): ModuleExportName | undefined { - return this.ast.data.propertyName?.node; - } - set propertyName(value) { - this.ast.data.propertyName = value?.ast; - } - get name(): ModuleExportName { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstExportSpecifierData extends AstData { isTypeOnly = false; propertyName: AstModuleExportName | undefined = undefined; name: AstModuleExportName = undefined!; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { let transformFlags = propagateChildFlags(this.propertyName) | propagateChildFlags(this.name); transformFlags &= ~TransformFlags.ContainsPossibleTopLevelAwait; // always parsed in an Await context @@ -11136,2267 +3964,558 @@ export class AstExportSpecifierData extends AstData { } } -/** @internal */ -export type ModuleExportName = - | Identifier - | StringLiteral; - -/** @internal */ export type AstModuleExportName = AstNodeOneOf; -/** @internal */ -export class ExportAssignment extends Node implements JSDocContainer, Declaration, ts.ExportAssignment { - declare readonly ast: AstExportAssignment; - - declare _declarationBrand: any; - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - declare name: never; - - override get parent() { - return super.parent as SourceFile; - } - override set parent(value) { - super.parent = value; - } - - get modifiers(): NodeArray | undefined { - return this.ast.data.modifiers?.nodes; - } - set modifiers(value) { - this.ast.data.modifiers = value?.ast; - } - get isExportEquals(): boolean | undefined { - return this.ast.data.isExportEquals; - } - set isExportEquals(value) { - this.ast.data.isExportEquals = value; - } - get expression(): Expression { - return this.ast.data.expression.node; - } - set expression(value) { - this.ast.data.expression = value.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstExportAssignmentData extends AstData { modifiers: AstNodeArray | undefined = undefined; isExportEquals: boolean | undefined = undefined; expression: AstExpression = undefined!; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { let transformFlags = propagateChildrenFlags(this.modifiers) | propagateChildFlags(this.expression); transformFlags &= ~TransformFlags.ContainsPossibleTopLevelAwait; // always parsed in an Await context return transformFlags; } } -/** @internal */ -export class JSDocTypeExpression extends Node implements ts.JSDocTypeExpression { - declare readonly ast: AstJSDocTypeExpression; - - declare _typeNodeBrand: any; - - get type(): TypeNode { - return this.ast.data.type.node; - } - set type(value) { - this.ast.data.type = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocTypeExpressionData extends AstData { type: AstTypeNode = undefined!; } -/** @internal */ -export class JSDocNameReference extends Node implements ts.JSDocNameReference { - declare readonly ast: AstJSDocNameReference; - - get name(): EntityName | JSDocMemberName { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocNameReferenceData extends AstData { name: AstEntityName | AstJSDocMemberName = undefined!; } -/** @internal */ -export class JSDocMemberName extends Node implements ts.JSDocMemberName { - declare readonly ast: AstJSDocMemberName; - - get left(): EntityName | JSDocMemberName { - return this.ast.data.left.node; - } - set left(value) { - this.ast.data.left = value.ast; - } - get right(): Identifier { - return this.ast.data.right.node; - } - set right(value) { - this.ast.data.right = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocMemberNameData extends AstData { left: AstEntityName | AstJSDocMemberName = undefined!; right: AstIdentifier = undefined!; } -/** @internal */ -export type JSDocType = - | JSDocAllType - | JSDocUnknownType - | JSDocNonNullableType - | JSDocNullableType - | JSDocOptionalType - | JSDocFunctionType - | JSDocVariadicType - | JSDocNamepathType; - -/** @internal */ export type AstJSDocType = AstNodeOneOf; -/** @internal */ -export class JSDocAllType extends Node implements ts.JSDocAllType { - declare readonly ast: AstJSDocAllType; - - declare _jsDocTypeBrand: any; - declare _typeNodeBrand: any; -} - -/** @internal */ +// dprint-ignore export class AstJSDocAllTypeData extends AstData { } -/** @internal */ -export class JSDocUnknownType extends Node implements ts.JSDocUnknownType { - declare readonly ast: AstJSDocUnknownType; - - declare _jsDocTypeBrand: any; - declare _typeNodeBrand: any; -} - -/** @internal */ +// dprint-ignore export class AstJSDocUnknownTypeData extends AstData { } -/** @internal */ -export class JSDocNonNullableType extends Node implements ts.JSDocNonNullableType { - declare readonly ast: AstJSDocNonNullableType; - - declare _jsDocTypeBrand: any; - declare _typeNodeBrand: any; - - get type(): TypeNode { - return this.ast.data.type.node; - } - set type(value) { - this.ast.data.type = value.ast; - } - get postfix(): boolean { - return this.ast.data.postfix; - } - set postfix(value) { - this.ast.data.postfix = value; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocNonNullableTypeData extends AstData { type: AstTypeNode = undefined!; postfix = false; } -/** @internal */ -export class JSDocNullableType extends Node implements ts.JSDocNullableType { - declare readonly ast: AstJSDocNullableType; - - declare _jsDocTypeBrand: any; - declare _typeNodeBrand: any; - - get type(): TypeNode { - return this.ast.data.type.node; - } - set type(value) { - this.ast.data.type = value.ast; - } - get postfix(): boolean { - return this.ast.data.postfix; - } - set postfix(value) { - this.ast.data.postfix = value; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocNullableTypeData extends AstData { type: AstTypeNode = undefined!; postfix = false; } -/** @internal */ -export class JSDocOptionalType extends Node implements ts.JSDocOptionalType { - declare readonly ast: AstJSDocOptionalType; - - declare _jsDocTypeBrand: any; - declare _typeNodeBrand: any; - - get type(): TypeNode { - return this.ast.data.type.node; - } - set type(value) { - this.ast.data.type = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocOptionalTypeData extends AstData { type: AstTypeNode = undefined!; } -/** @internal */ -export class JSDocFunctionType extends Node implements Declaration, LocalsContainer, ts.JSDocFunctionType { - declare readonly ast: AstJSDocFunctionType; - - declare _jsDocTypeBrand: any; - declare _typeNodeBrand: any; - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - declare _localsContainerBrand: any; - declare name: never; - - get typeParameters(): NodeArray | undefined { - return this.ast.data.typeParameters?.nodes; - } - set typeParameters(value) { - this.ast.data.typeParameters = value?.ast; - } - get parameters(): NodeArray { - return this.ast.data.parameters.nodes; - } - set parameters(value) { - this.ast.data.parameters = value.ast; - } - get type(): TypeNode | undefined { - return this.ast.data.type?.node; - } - set type(value) { - this.ast.data.type = value?.ast; - } - get typeArguments(): NodeArray | undefined { - return this.ast.data.typeArguments?.nodes; - } - set typeArguments(value) { - this.ast.data.typeArguments = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocFunctionTypeData extends AstData { typeParameters: AstNodeArray | undefined = undefined; parameters: AstNodeArray = undefined!; type: AstTypeNode | undefined = undefined; - typeArguments: AstNodeArray | undefined = undefined; // quick info - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; + + /** @internal */ typeArguments: AstNodeArray | undefined = undefined; // quick info + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; } -/** @internal */ -export class JSDocVariadicType extends Node implements ts.JSDocVariadicType { - declare readonly ast: AstJSDocVariadicType; - - declare _jsDocTypeBrand: any; - declare _typeNodeBrand: any; - - get type(): TypeNode { - return this.ast.data.type.node; - } - set type(value) { - this.ast.data.type = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocVariadicTypeData extends AstData { type: AstTypeNode = undefined!; } -/** @internal */ -export class JSDocNamepathType extends Node implements ts.JSDocNamepathType { - declare readonly ast: AstJSDocNamepathType; - - declare _jsDocTypeBrand: any; - declare _typeNodeBrand: any; - - get type(): TypeNode { - return this.ast.data.type.node; - } - set type(value) { - this.ast.data.type = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocNamepathTypeData extends AstData { type: AstTypeNode = undefined!; } -/** @internal */ -export class JSDoc extends Node implements ts.JSDoc { - declare readonly ast: AstJSDoc; - - override get parent() { - return super.parent as HasJSDoc; - } - override set parent(value) { - super.parent = value; - } - - get tags(): NodeArray | undefined { - return this.ast.data.tags?.nodes; - } - set tags(value) { - this.ast.data.tags = value?.ast; - } - get comment(): string | NodeArray | undefined { - const comment = this.ast.data.comment; - return typeof comment === "string" ? comment : comment?.nodes; - } - set comment(value) { - this.ast.data.comment = typeof value === "string" ? value : value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocData extends AstData { comment: string | AstNodeArray | undefined = undefined; tags: AstNodeArray | undefined = undefined; } -/** @internal */ -export type HasJSDoc = - | AccessorDeclaration - | ArrowFunction - | BinaryExpression - | Block - | BreakStatement - | CallSignatureDeclaration - | CaseClause - | ClassLikeDeclaration - | ClassStaticBlockDeclaration - | ConstructorDeclaration - | ConstructorTypeNode - | ConstructSignatureDeclaration - | ContinueStatement - | DebuggerStatement - | DoStatement - | ElementAccessExpression - | EmptyStatement - | EndOfFileToken - | EnumDeclaration - | EnumMember - | ExportAssignment - | ExportDeclaration - | ExportSpecifier - | ExpressionStatement - | ForInStatement - | ForOfStatement - | ForStatement - | FunctionDeclaration - | FunctionExpression - | FunctionTypeNode - | Identifier - | IfStatement - | ImportDeclaration - | ImportEqualsDeclaration - | IndexSignatureDeclaration - | InterfaceDeclaration - | JSDocFunctionType - | JSDocSignature - | LabeledStatement - | MethodDeclaration - | MethodSignature - | ModuleDeclaration - | NamedTupleMember - | NamespaceExportDeclaration - | ObjectLiteralExpression - | ParameterDeclaration - | ParenthesizedExpression - | PropertyAccessExpression - | PropertyAssignment - | PropertyDeclaration - | PropertySignature - | ReturnStatement - | SemicolonClassElement - | ShorthandPropertyAssignment - | SpreadAssignment - | SwitchStatement - | ThrowStatement - | TryStatement - | TypeAliasDeclaration - | TypeParameterDeclaration - | VariableDeclaration - | VariableStatement - | WhileStatement - | WithStatement; - -/** @internal */ export type AstHasJSDoc = AstNodeOneOf; - -/** @internal */ -export type JSDocTag = - | JSDocUnknownTag - | JSDocAugmentsTag - | JSDocImplementsTag - | JSDocAuthorTag - | JSDocDeprecatedTag - | JSDocClassTag - | JSDocPublicTag - | JSDocPrivateTag - | JSDocProtectedTag - | JSDocReadonlyTag - | JSDocOverrideTag - | JSDocEnumTag - | JSDocThisTag - | JSDocTemplateTag - | JSDocSeeTag - | JSDocReturnTag - | JSDocTypeTag - | JSDocTypedefTag - | JSDocCallbackTag - | JSDocOverloadTag - | JSDocThrowsTag - | JSDocPropertyTag - | JSDocParameterTag - | JSDocSatisfiesTag - | JSDocImportTag; - -/** @internal */ export type AstJSDocTag = AstNodeOneOf; -/** @internal */ -export class JSDocLink extends Node implements ts.JSDocLink { - declare readonly ast: AstJSDocLink; - - get name(): EntityName | JSDocMemberName | undefined { - return this.ast.data.name?.node; - } - set name(value) { - this.ast.data.name = value?.ast; - } - get text(): string { - return this.ast.data.text; - } - set text(value) { - this.ast.data.text = value; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocLinkData extends AstData { name: AstEntityName | AstJSDocMemberName | undefined = undefined; text = ""; } -/** @internal */ -export class JSDocLinkCode extends Node implements ts.JSDocLinkCode { - declare readonly ast: AstJSDocLinkCode; - - get name(): EntityName | JSDocMemberName | undefined { - return this.ast.data.name?.node; - } - set name(value) { - this.ast.data.name = value?.ast; - } - get text(): string { - return this.ast.data.text; - } - set text(value) { - this.ast.data.text = value; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocLinkCodeData extends AstData { name: AstEntityName | AstJSDocMemberName | undefined = undefined; text = ""; } -/** @internal */ -export class JSDocLinkPlain extends Node implements ts.JSDocLinkPlain { - declare readonly ast: AstJSDocLinkPlain; - - get name(): EntityName | JSDocMemberName | undefined { - return this.ast.data.name?.node; - } - set name(value) { - this.ast.data.name = value?.ast; - } - get text(): string { - return this.ast.data.text; - } - set text(value) { - this.ast.data.text = value; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocLinkPlainData extends AstData { name: AstEntityName | AstJSDocMemberName | undefined = undefined; text = ""; } -/** @internal */ -export type JSDocComment = - | JSDocText - | JSDocLink - | JSDocLinkCode - | JSDocLinkPlain; - -/** @internal */ export type AstJSDocComment = AstNodeOneOf; -/** @internal */ -export class JSDocText extends Node implements ts.JSDocText { - declare readonly ast: AstJSDocText; - - get text(): string { - return this.ast.data.text; - } - set text(value) { - this.ast.data.text = value; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocTextData extends AstData { text = ""; } -/** @internal */ -export class BaseJSDocTag extends Node implements ts.JSDocTag { - declare readonly ast: AstBaseJSDocTag; +export type AstBaseJSDocTag = AstNode>; - override get parent() { - return super.parent as JSDoc | JSDocTypeLiteral; - } - override set parent(value) { - super.parent = value; - } - - get tagName(): Identifier { - return this.ast.data.tagName.node; - } - set tagName(value) { - this.ast.data.tagName = value.ast; - } - get comment(): string | NodeArray | undefined { - const comment = this.ast.data.comment; - return typeof comment === "string" ? comment : comment?.nodes; - } - set comment(value) { - this.ast.data.comment = typeof value === "string" ? value : value?.ast; - } -} - -/** @internal */ -export type AstBaseJSDocTag = AstNode>; - -/** @internal */ +// dprint-ignore export class AstJSDocTagData extends AstData { tagName: AstIdentifier = undefined!; comment: string | AstNodeArray | undefined = undefined; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return TransformFlags.None; } } -/** @internal */ -export class JSDocUnknownTag extends BaseJSDocTag implements ts.JSDocUnknownTag { - declare readonly ast: AstJSDocUnknownTag; -} - -/** @internal */ +// dprint-ignore export class AstJSDocUnknownTagData extends AstJSDocTagData { } -/** @internal */ -export interface JSDocClassReference extends ExpressionWithTypeArguments { - readonly ast: AstJSDocClassReference; - readonly data: AstJSDocClassReferenceData; - readonly expression: Identifier | PropertyAccessEntityNameExpression; -} - -/** @internal */ export type AstJSDocClassReference = AstNode; -/** @internal */ export interface AstJSDocClassReferenceData extends AstExpressionWithTypeArgumentsData { expression: AstIdentifier | AstPropertyAccessEntityNameExpression; } -/** @internal */ -export class JSDocAugmentsTag extends BaseJSDocTag implements ts.JSDocAugmentsTag { - declare readonly ast: AstJSDocAugmentsTag; - get class(): JSDocClassReference { - return this.ast.data.class.node; - } - set class(value) { - this.ast.data.class = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocAugmentsTagData extends AstJSDocTagData { class: AstJSDocClassReference = undefined!; } -/** @internal */ -export class JSDocImplementsTag extends BaseJSDocTag implements ts.JSDocImplementsTag { - declare readonly ast: AstJSDocImplementsTag; - get class(): JSDocClassReference { - return this.ast.data.class.node; - } - set class(value) { - this.ast.data.class = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocImplementsTagData extends AstJSDocTagData { class: AstJSDocClassReference = undefined!; } -/** @internal */ -export class JSDocAuthorTag extends BaseJSDocTag implements ts.JSDocAuthorTag { - declare readonly ast: AstJSDocAuthorTag; -} - -/** @internal */ +// dprint-ignore export class AstJSDocAuthorTagData extends AstJSDocTagData { } -/** @internal */ -export class JSDocDeprecatedTag extends BaseJSDocTag implements ts.JSDocDeprecatedTag { - declare readonly ast: AstJSDocDeprecatedTag; -} - -/** @internal */ +// dprint-ignore export class AstJSDocDeprecatedTagData extends AstJSDocTagData { } -/** @internal */ -export class JSDocClassTag extends BaseJSDocTag implements ts.JSDocClassTag { - declare readonly ast: AstJSDocClassTag; -} - -/** @internal */ +// dprint-ignore export class AstJSDocClassTagData extends AstJSDocTagData { } -/** @internal */ -export class JSDocPublicTag extends BaseJSDocTag implements ts.JSDocPublicTag { - declare readonly ast: AstJSDocPublicTag; -} - -/** @internal */ +// dprint-ignore export class AstJSDocPublicTagData extends AstJSDocTagData { } -/** @internal */ -export class JSDocPrivateTag extends BaseJSDocTag implements ts.JSDocPrivateTag { - declare readonly ast: AstJSDocPrivateTag; -} - -/** @internal */ +// dprint-ignore export class AstJSDocPrivateTagData extends AstJSDocTagData { } -/** @internal */ -export class JSDocProtectedTag extends BaseJSDocTag implements ts.JSDocProtectedTag { - declare readonly ast: AstJSDocProtectedTag; -} - -/** @internal */ +// dprint-ignore export class AstJSDocProtectedTagData extends AstJSDocTagData { } -/** @internal */ -export class JSDocReadonlyTag extends BaseJSDocTag implements ts.JSDocReadonlyTag { - declare readonly ast: AstJSDocReadonlyTag; -} - -/** @internal */ +// dprint-ignore export class AstJSDocReadonlyTagData extends AstJSDocTagData { } -/** @internal */ -export class JSDocOverrideTag extends BaseJSDocTag implements ts.JSDocOverrideTag { - declare readonly ast: AstJSDocOverrideTag; -} - -/** @internal */ +// dprint-ignore export class AstJSDocOverrideTagData extends AstJSDocTagData { } -/** @internal */ -export class JSDocEnumTag extends BaseJSDocTag implements Declaration, LocalsContainer, ts.JSDocEnumTag { - declare readonly ast: AstJSDocEnumTag; - declare _declarationBrand: any; - declare _localsContainerBrand: any; - - override get parent() { - return super.parent as JSDoc; - } - override set parent(value) { - super.parent = value; - } - - get typeExpression(): JSDocTypeExpression { - return this.ast.data.typeExpression.node; - } - set typeExpression(value) { - this.ast.data.typeExpression = value.ast; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocEnumTagData extends AstJSDocTagData { typeExpression: AstJSDocTypeExpression = undefined!; - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; } -/** @internal */ -export class JSDocThisTag extends BaseJSDocTag implements ts.JSDocThisTag { - declare readonly ast: AstJSDocThisTag; - get typeExpression(): JSDocTypeExpression { - return this.ast.data.typeExpression.node; - } - set typeExpression(value) { - this.ast.data.typeExpression = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocThisTagData extends AstJSDocTagData { typeExpression: AstJSDocTypeExpression = undefined!; } -/** @internal */ -export class JSDocTemplateTag extends BaseJSDocTag implements ts.JSDocTemplateTag { - declare readonly ast: AstJSDocTemplateTag; - get constraint(): JSDocTypeExpression | undefined { - return this.ast.data.constraint?.node; - } - set constraint(value) { - this.ast.data.constraint = value?.ast; - } - get typeParameters(): NodeArray { - return this.ast.data.typeParameters.nodes; - } - set typeParameters(value) { - this.ast.data.typeParameters = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocTemplateTagData extends AstJSDocTagData { constraint: AstJSDocTypeExpression | undefined = undefined; typeParameters: AstNodeArray = undefined!; } -/** @internal */ -export class JSDocSeeTag extends BaseJSDocTag implements ts.JSDocSeeTag { - declare readonly ast: AstJSDocSeeTag; - get name(): JSDocNameReference | undefined { - return this.ast.data.name?.node; - } - set name(value) { - this.ast.data.name = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocSeeTagData extends AstJSDocTagData { name: AstJSDocNameReference | undefined = undefined; } -/** @internal */ -export class JSDocReturnTag extends BaseJSDocTag implements ts.JSDocReturnTag { - declare readonly ast: AstJSDocReturnTag; - get typeExpression(): JSDocTypeExpression | undefined { - return this.ast.data.typeExpression?.node; - } - set typeExpression(value) { - this.ast.data.typeExpression = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocReturnTagData extends AstJSDocTagData { typeExpression: AstJSDocTypeExpression | undefined = undefined; } -/** @internal */ -export class JSDocTypeTag extends BaseJSDocTag implements ts.JSDocTypeTag { - declare readonly ast: AstJSDocTypeTag; - get typeExpression(): JSDocTypeExpression { - return this.ast.data.typeExpression.node; - } - set typeExpression(value) { - this.ast.data.typeExpression = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocTypeTagData extends AstJSDocTagData { typeExpression: AstJSDocTypeExpression = undefined!; } -/** @internal */ -export class JSDocTypedefTag extends BaseJSDocTag implements Declaration, LocalsContainer, ts.JSDocTypedefTag { - declare readonly ast: AstJSDocTypedefTag; - declare _declarationBrand: any; - declare _localsContainerBrand: any; - - override get parent() { - return super.parent as JSDoc; - } - override set parent(value) { - super.parent = value; - } - - get fullName(): Identifier | JSDocNamespaceDeclaration | undefined { - return this.ast.data.fullName?.node; - } - set fullName(value) { - this.ast.data.fullName = value?.ast; - } - get name(): Identifier | undefined { - return this.ast.data.name?.node; - } - set name(value) { - this.ast.data.name = value?.ast; - } - get typeExpression(): JSDocTypeLiteral | JSDocTypeExpression | undefined { - return this.ast.data.typeExpression?.node; - } - set typeExpression(value) { - this.ast.data.typeExpression = value?.ast; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocTypedefTagData extends AstJSDocTagData { typeExpression: AstJSDocTypeExpression | AstJSDocTypeLiteral | undefined = undefined; fullName: AstJSDocNamespaceDeclaration | AstIdentifier | undefined = undefined; name: AstIdentifier | undefined = undefined; - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; } -/** @internal */ -export class JSDocCallbackTag extends BaseJSDocTag implements Declaration, LocalsContainer, ts.JSDocCallbackTag { - declare readonly ast: AstJSDocCallbackTag; - declare _declarationBrand: any; - declare _localsContainerBrand: any; - - override get parent() { - return super.parent as JSDoc; - } - override set parent(value) { - super.parent = value; - } - - get fullName(): Identifier | JSDocNamespaceDeclaration | undefined { - return this.ast.data.fullName?.node; - } - set fullName(value) { - this.ast.data.fullName = value?.ast; - } - get name(): Identifier | undefined { - return this.ast.data.name?.node; - } - set name(value) { - this.ast.data.name = value?.ast; - } - get typeExpression(): JSDocSignature { - return this.ast.data.typeExpression.node; - } - set typeExpression(value) { - this.ast.data.typeExpression = value.ast; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocCallbackTagData extends AstJSDocTagData { fullName: AstJSDocNamespaceDeclaration | AstIdentifier | undefined = undefined; name: AstIdentifier | undefined = undefined; typeExpression: AstJSDocSignature = undefined!; - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; } -/** @internal */ -export class JSDocOverloadTag extends BaseJSDocTag implements ts.JSDocOverloadTag { - declare readonly ast: AstJSDocOverloadTag; - - override get parent() { - return super.parent as JSDoc; - } - override set parent(value) { - super.parent = value; - } - - get typeExpression(): JSDocSignature { - return this.ast.data.typeExpression.node; - } - set typeExpression(value) { - this.ast.data.typeExpression = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocOverloadTagData extends AstJSDocTagData { typeExpression: AstJSDocSignature = undefined!; } -/** @internal */ -export class JSDocThrowsTag extends BaseJSDocTag implements ts.JSDocThrowsTag { - declare readonly ast: AstJSDocThrowsTag; - get typeExpression(): JSDocTypeExpression | undefined { - return this.ast.data.typeExpression?.node; - } - set typeExpression(value) { - this.ast.data.typeExpression = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocThrowsTagData extends AstJSDocTagData { typeExpression: AstJSDocTypeExpression | undefined = undefined; } -/** @internal */ -export class JSDocSignature extends Node implements Declaration, LocalsContainer, ts.JSDocSignature { - declare readonly ast: AstJSDocSignature; - - declare _jsDocTypeBrand: any; - declare _typeNodeBrand: any; - declare _declarationBrand: any; - declare _jsdocContainerBrand: any; - declare _localsContainerBrand: any; - - get typeParameters(): NodeArray | undefined { - return this.ast.data.typeParameters?.nodes; - } - set typeParameters(value) { - this.ast.data.typeParameters = value?.ast; - } - get parameters(): NodeArray { - return this.ast.data.parameters.nodes; - } - set parameters(value) { - this.ast.data.parameters = value.ast; - } - get type(): JSDocReturnTag | undefined { - return this.ast.data.type?.node; - } - set type(value) { - this.ast.data.type = value?.ast; - } - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value) { - this.ast.data.jsDoc = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocSignatureData extends AstData { typeParameters: AstNodeArray | undefined = undefined; parameters: AstNodeArray = undefined!; type: AstJSDocReturnTag | undefined = undefined; - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; } -/** @internal */ -export class JSDocPropertyTag extends BaseJSDocTag implements Declaration, ts.JSDocPropertyTag { - declare readonly ast: AstJSDocPropertyTag; - declare _declarationBrand: any; - - override get parent() { - return super.parent as JSDoc; - } - override set parent(value) { - super.parent = value; - } - - get name(): Identifier | QualifiedName { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } - get typeExpression(): JSDocTypeExpression | undefined { - return this.ast.data.typeExpression?.node; - } - set typeExpression(value) { - this.ast.data.typeExpression = value?.ast; - } - get isNameFirst(): boolean { - return this.ast.data.isNameFirst; - } - set isNameFirst(value) { - this.ast.data.isNameFirst = value; - } - get isBracketed(): boolean { - return this.ast.data.isBracketed; - } - set isBracketed(value) { - this.ast.data.isBracketed = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocPropertyTagData extends AstJSDocTagData { typeExpression: AstJSDocTypeExpression | undefined = undefined; name: AstEntityName = undefined!; + /** Whether the property name came before the type -- non-standard for JSDoc, but Typescript-like */ isNameFirst = false; isBracketed = false; - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) } -/** @internal */ -export class JSDocParameterTag extends BaseJSDocTag implements Declaration, ts.JSDocParameterTag { - declare readonly ast: AstJSDocParameterTag; - declare _declarationBrand: any; - - override get parent() { - return super.parent as JSDoc; - } - override set parent(value) { - super.parent = value; - } - - get name(): Identifier | QualifiedName { - return this.ast.data.name.node; - } - set name(value) { - this.ast.data.name = value.ast; - } - get typeExpression(): JSDocTypeExpression | undefined { - return this.ast.data.typeExpression?.node; - } - set typeExpression(value) { - this.ast.data.typeExpression = value?.ast; - } - get isNameFirst(): boolean { - return this.ast.data.isNameFirst; - } - set isNameFirst(value) { - this.ast.data.isNameFirst = value; - } - get isBracketed(): boolean { - return this.ast.data.isBracketed; - } - set isBracketed(value) { - this.ast.data.isBracketed = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocParameterTagData extends AstJSDocTagData { typeExpression: AstJSDocTypeExpression | undefined = undefined; name: AstEntityName = undefined!; + /** Whether the property name came before the type -- non-standard for JSDoc, but Typescript-like */ isNameFirst = false; isBracketed = false; - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) } -/** @internal */ -export type JSDocPropertyLikeTag = - | JSDocPropertyTag - | JSDocParameterTag; - -/** @internal */ export type AstJSDocPropertyLikeTag = AstNodeOneOf; -/** @internal */ -export class JSDocTypeLiteral extends Node implements Declaration, ts.JSDocTypeLiteral { - declare readonly ast: AstJSDocTypeLiteral; - - declare _jsDocTypeBrand: any; - declare _typeNodeBrand: any; - declare _declarationBrand: any; - - get jsDocPropertyTags(): NodeArray | undefined { - return this.ast.data.jsDocPropertyTags?.nodes; - } - set jsDocPropertyTags(value) { - this.ast.data.jsDocPropertyTags = value?.ast; - } - get isArrayType(): boolean { - return this.ast.data.isArrayType; - } - set isArrayType(value) { - this.ast.data.isArrayType = value; - } - get symbol(): ts.Symbol { - return this.ast.data.symbol; - } - set symbol(value) { - this.ast.data.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocTypeLiteralData extends AstData { jsDocPropertyTags: AstNodeArray | undefined = undefined; + /** If true, then this type literal represents an *array* of its type. */ isArrayType = false; - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) } -/** @internal */ -export class JSDocSatisfiesTag extends BaseJSDocTag implements ts.JSDocSatisfiesTag { - declare readonly ast: AstJSDocSatisfiesTag; - get typeExpression(): JSDocTypeExpression { - return this.ast.data.typeExpression.node; - } - set typeExpression(value) { - this.ast.data.typeExpression = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocSatisfiesTagData extends AstJSDocTagData { typeExpression: AstJSDocTypeExpression = undefined!; } -/** @internal */ -export class JSDocImportTag extends BaseJSDocTag implements ts.JSDocImportTag { - declare readonly ast: AstJSDocImportTag; - - override get parent() { - return super.parent as JSDoc; - } - override set parent(value) { - super.parent = value; - } - - get importClause(): ImportClause | undefined { - return this.ast.data.importClause?.node; - } - set importClause(value) { - this.ast.data.importClause = value?.ast; - } - get moduleSpecifier(): Expression { - return this.ast.data.moduleSpecifier.node; - } - set moduleSpecifier(value) { - this.ast.data.moduleSpecifier = value.ast; - } - get attributes(): ImportAttributes | undefined { - return this.ast.data.attributes?.node; - } - set attributes(value) { - this.ast.data.attributes = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstJSDocImportTagData extends AstJSDocTagData { importClause: AstImportClause | undefined = undefined; moduleSpecifier: AstExpression = undefined!; attributes: AstImportAttributes | undefined = undefined; } -/** @internal */ -export class SyntheticExpression extends Node implements ts.SyntheticExpression { - declare readonly ast: AstSyntheticExpression; - declare _expressionBrand: any; - - get isSpread(): boolean { - return this.ast.data.isSpread; - } - set isSpread(value: boolean) { - this.ast.data.isSpread = value; - } - get type(): ts.Type { - return this.ast.data.type; - } - set type(value: ts.Type) { - this.ast.data.type = value; - } - get tupleNameSource(): ParameterDeclaration | NamedTupleMember | undefined { - return this.ast.data.tupleNameSource?.node; - } - set tupleNameSource(value: ParameterDeclaration | NamedTupleMember | undefined) { - this.ast.data.tupleNameSource = value?.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstSyntheticExpressionData extends AstData { isSpread = false; type: Type = undefined!; tupleNameSource: AstParameterDeclaration | AstNamedTupleMember | undefined = undefined; } -/** @internal */ -export class Bundle extends Node implements ts.Bundle { - declare readonly ast: AstBundle; - - get sourceFiles(): readonly SourceFile[] { - return this.ast.data.sourceFiles; - } - set sourceFiles(value: readonly SourceFile[]) { - this.ast.data.sourceFiles = value; - } - get syntheticFileReferences(): readonly FileReference[] | undefined { - return this.ast.data.syntheticFileReferences; - } - set syntheticFileReferences(value: readonly FileReference[] | undefined) { - this.ast.data.syntheticFileReferences = value; - } - get syntheticTypeReferences(): readonly FileReference[] | undefined { - return this.ast.data.syntheticTypeReferences; - } - set syntheticTypeReferences(value: readonly FileReference[] | undefined) { - this.ast.data.syntheticTypeReferences = value; - } - get syntheticLibReferences(): readonly FileReference[] | undefined { - return this.ast.data.syntheticLibReferences; - } - set syntheticLibReferences(value: readonly FileReference[] | undefined) { - this.ast.data.syntheticLibReferences = value; - } - get hasNoDefaultLib(): boolean | undefined { - return this.ast.data.hasNoDefaultLib; - } - set hasNoDefaultLib(value: boolean | undefined) { - this.ast.data.hasNoDefaultLib = value; - } -} - -/** @internal */ +// dprint-ignore export class AstBundleData extends AstData { sourceFiles: readonly SourceFile[] = undefined!; - syntheticFileReferences?: readonly FileReference[]; - syntheticTypeReferences?: readonly FileReference[]; - syntheticLibReferences?: readonly FileReference[]; - hasNoDefaultLib?: boolean; + /** @internal */ syntheticFileReferences?: readonly FileReference[]; + /** @internal */ syntheticTypeReferences?: readonly FileReference[]; + /** @internal */ syntheticLibReferences?: readonly FileReference[]; + /** @internal */ hasNoDefaultLib?: boolean; } -/** @internal */ -export class SyntaxList extends Node implements ts.SyntaxList { - get _children(): readonly Node[] { - return this.ast.data._children; - } - set _children(value: readonly Node[]) { - this.ast.data._children = value; - } -} - -/** @internal */ +// dprint-ignore export class AstSyntaxListData extends AstData { - _children!: readonly Node[]; + /** @internal */ _children!: readonly Node[]; } -/** @internal */ -export class NotEmittedStatement extends Node implements ts.NotEmittedStatement { - declare readonly ast: AstNotEmittedStatement; - - declare _statementBrand: any; - declare _jsdocContainerBrand: any; - - get jsDoc(): JSDocArray | undefined { - return this.ast.data.jsDoc; - } - set jsDoc(value: JSDocArray | undefined) { - this.ast.data.jsDoc = value; - } -} - -/** @internal */ +// dprint-ignore export class AstNotEmittedStatementData extends AstData { - jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) + /** @internal */ jsDoc: JSDocArray | undefined = undefined; // initialized by parser (JSDocContainer) } -/** @internal */ -export class NotEmittedTypeElement extends Node implements ts.NotEmittedTypeElement { - declare readonly ast: AstNotEmittedTypeElement; - - declare _typeElementBrand: any; - declare _declarationBrand: any; - - get name(): PropertyName | undefined { - return this.ast.data.name?.node; - } - set name(value: PropertyName | undefined) { - this.ast.data.name = value?.ast; - } - get questionToken(): QuestionToken | undefined { - return this.ast.data.questionToken?.node; - } - set questionToken(value: QuestionToken | undefined) { - this.ast.data.questionToken = value?.ast; - } - get symbol(): Symbol { - return this.ast.data.symbol; - } - set symbol(value: Symbol) { - this.ast.data.symbol = value; - } - get localSymbol(): Symbol | undefined { - return this.ast.data.localSymbol; - } - set localSymbol(value: Symbol | undefined) { - this.ast.data.localSymbol = value; - } -} - -/** @internal */ +// dprint-ignore export class AstNotEmittedTypeElementData extends AstData { - name: AstPropertyName | undefined = undefined; - questionToken: AstQuestionToken | undefined = undefined; - symbol: Symbol = undefined!; - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ symbol: Symbol = undefined!; + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) } -/** @internal */ -export class PartiallyEmittedExpression extends Node implements ts.PartiallyEmittedExpression { - declare readonly ast: AstPartiallyEmittedExpression; - - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - - get expression(): Expression { - return this.ast.data.expression.node; - } - set expression(value: Expression) { - this.ast.data.expression = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstPartiallyEmittedExpressionData extends AstData { expression: AstExpression = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.expression); } } -/** @internal */ -export class CommaListExpression extends Node implements ts.CommaListExpression { - declare readonly ast: AstCommaListExpression; - - declare _expressionBrand: any; - - get elements(): NodeArray { - return this.ast.data.elements.nodes; - } - set elements(value: NodeArray) { - this.ast.data.elements = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstCommaListExpressionData extends AstData { elements: AstNodeArray = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildrenFlags(this.elements); } } /** @internal */ -export class SyntheticReferenceExpression extends Node implements ts.SyntheticReferenceExpression { - declare readonly ast: AstSyntheticReferenceExpression; - - declare _leftHandSideExpressionBrand: any; - declare _updateExpressionBrand: any; - declare _unaryExpressionBrand: any; - declare _expressionBrand: any; - - get expression(): Expression { - return this.ast.data.expression.node; - } - set expression(value: Expression) { - this.ast.data.expression = value.ast; - } - get thisArg(): Expression { - return this.ast.data.thisArg.node; - } - set thisArg(value: Expression) { - this.ast.data.thisArg = value.ast; - } -} - -/** @internal */ +// dprint-ignore export class AstSyntheticReferenceExpressionData extends AstData { expression: AstExpression = undefined!; thisArg: AstExpression = undefined!; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildFlags(this.expression) | propagateChildFlags(this.thisArg); } } -/** @internal */ -export class SourceFile extends Node implements Declaration, LocalsContainer, ts.SourceFile { - declare readonly ast: AstSourceFile; - - declare _declarationBrand: any; - declare _localsContainerBrand: any; - - get statements(): NodeArray { - return this.ast.data.statements.nodes; - } - set statements(value) { - this.ast.data.statements = value.ast; - } - get endOfFileToken(): EndOfFileToken { - return this.ast.data.endOfFileToken.node; - } - set endOfFileToken(value) { - this.ast.data.endOfFileToken = value.ast; - } - get fileName(): string { - return this.ast.data.fileName; - } - set fileName(value) { - this.ast.data.fileName = value; - } - - get path(): ts.Path { - return this.ast.data.path; - } - set path(value) { - this.ast.data.path = value; - } - get text(): string { - return this.ast.data.text; - } - set text(value) { - this.ast.data.text = value; - } - get resolvedPath(): ts.Path { - return this.ast.data.resolvedPath; - } - set resolvedPath(value) { - this.ast.data.resolvedPath = value; - } - get originalFileName(): string { - return this.ast.data.originalFileName; - } - set originalFileName(value) { - this.ast.data.originalFileName = value; - } - get amdDependencies(): ts.AmdDependency[] { - return this.ast.data.amdDependencies; - } - set amdDependencies(value) { - this.ast.data.amdDependencies = value; - } - get moduleName(): string | undefined { - return this.ast.data.moduleName; - } - set moduleName(value) { - this.ast.data.moduleName = value; - } - get referencedFiles(): readonly ts.FileReference[] { - return this.ast.data.referencedFiles; - } - set referencedFiles(value) { - this.ast.data.referencedFiles = value; - } - get typeReferenceDirectives(): readonly ts.FileReference[] { - return this.ast.data.typeReferenceDirectives; - } - set typeReferenceDirectives(value) { - this.ast.data.typeReferenceDirectives = value; - } - get libReferenceDirectives(): readonly ts.FileReference[] { - return this.ast.data.libReferenceDirectives; - } - set libReferenceDirectives(value) { - this.ast.data.libReferenceDirectives = value; - } - get languageVariant(): ts.LanguageVariant { - return this.ast.data.languageVariant; - } - set languageVariant(value) { - this.ast.data.languageVariant = value; - } - get isDeclarationFile(): boolean { - return this.ast.data.isDeclarationFile; - } - set isDeclarationFile(value) { - this.ast.data.isDeclarationFile = value; - } - get renamedDependencies(): Map { - return this.ast.data.renamedDependencies; - } - set renamedDependencies(value) { - this.ast.data.renamedDependencies = value; - } - get hasNoDefaultLib(): boolean { - return this.ast.data.hasNoDefaultLib; - } - set hasNoDefaultLib(value) { - this.ast.data.hasNoDefaultLib = value; - } - get languageVersion(): ts.ScriptTarget { - return this.ast.data.languageVersion; - } - set languageVersion(value) { - this.ast.data.languageVersion = value; - } - get impliedNodeFormat(): ts.ResolutionMode { - return this.ast.data.impliedNodeFormat; - } - set impliedNodeFormat(value) { - this.ast.data.impliedNodeFormat = value; - } - get scriptKind(): ts.ScriptKind { - return this.ast.data.scriptKind; - } - set scriptKind(value) { - this.ast.data.scriptKind = value; - } - get pragmas(): ts.ReadonlyPragmaMap { - return this.ast.data.pragmas; - } - set pragmas(value) { - this.ast.data.pragmas = value; - } - get externalModuleIndicator(): true | Node | undefined { - return this.ast.data.externalModuleIndicator; - } - set externalModuleIndicator(value) { - this.ast.data.externalModuleIndicator = value; - } - get commonJsModuleIndicator(): Node | undefined { - return this.ast.data.commonJsModuleIndicator; - } - set commonJsModuleIndicator(value) { - this.ast.data.commonJsModuleIndicator = value; - } - get identifiers(): Map { - return this.ast.data.identifiers; - } - set identifiers(value) { - this.ast.data.identifiers = value; - } - get parseDiagnostics(): ts.DiagnosticWithLocation[] { - return this.ast.data.parseDiagnostics; - } - set parseDiagnostics(value) { - this.ast.data.parseDiagnostics = value; - } - get bindDiagnostics(): ts.DiagnosticWithLocation[] { - return this.ast.data.bindDiagnostics; - } - set bindDiagnostics(value) { - this.ast.data.bindDiagnostics = value; - } - get bindSuggestionDiagnostics(): ts.DiagnosticWithLocation[] | undefined { - return this.ast.data.bindSuggestionDiagnostics; - } - set bindSuggestionDiagnostics(value) { - this.ast.data.bindSuggestionDiagnostics = value; - } - get lineMap(): readonly number[] { - return this.ast.data.lineMap; - } - set lineMap(value) { - this.ast.data.lineMap = value; - } - get jsDocDiagnostics(): ts.DiagnosticWithLocation[] | undefined { - return this.ast.data.jsDocDiagnostics; - } - set jsDocDiagnostics(value) { - this.ast.data.jsDocDiagnostics = value; - } - get commentDirectives(): ts.CommentDirective[] | undefined { - return this.ast.data.commentDirectives; - } - set commentDirectives(value) { - this.ast.data.commentDirectives = value; - } - get checkJsDirective(): ts.CheckJsDirective | undefined { - return this.ast.data.checkJsDirective; - } - set checkJsDirective(value) { - this.ast.data.checkJsDirective = value; - } - get version(): string { - return this.ast.data.version; - } - set version(value) { - this.ast.data.version = value; - } - get symbol(): ts.Symbol { - return this.ast.data.declaration.symbol; - } - set symbol(value) { - this.ast.data.declaration.symbol = value; - } - get localSymbol(): ts.Symbol | undefined { - return this.ast.data.declaration.localSymbol; - } - set localSymbol(value) { - this.ast.data.declaration.localSymbol = value; - } - get locals(): ts.SymbolTable | undefined { - return this.ast.data.locals; - } - set locals(value) { - this.ast.data.locals = value; - } - get redirectInfo(): ts.RedirectInfo | undefined { - return this.ast.data.redirectInfo; - } - set redirectInfo(value) { - this.ast.data.redirectInfo = value; - } - get packageJsonLocations(): readonly string[] | undefined { - return this.ast.data.packageJsonLocations; - } - set packageJsonLocations(value) { - this.ast.data.packageJsonLocations = value; - } - get packageJsonScope(): ts.PackageJsonInfo | undefined { - return this.ast.data.packageJsonScope; - } - set packageJsonScope(value) { - this.ast.data.packageJsonScope = value; - } - get setExternalModuleIndicator(): ((file: ts.SourceFile) => void) | undefined { - return this.ast.data.setExternalModuleIndicator; - } - set setExternalModuleIndicator(value) { - this.ast.data.setExternalModuleIndicator = value; - } - get jsGlobalAugmentations(): ts.SymbolTable | undefined { - return this.ast.data.jsGlobalAugmentations; - } - set jsGlobalAugmentations(value) { - this.ast.data.jsGlobalAugmentations = value; - } - get nodeCount(): number { - return this.ast.data.nodeCount; - } - set nodeCount(value) { - this.ast.data.nodeCount = value; - } - get identifierCount(): number { - return this.ast.data.identifierCount; - } - set identifierCount(value) { - this.ast.data.identifierCount = value; - } - get symbolCount(): number { - return this.ast.data.symbolCount; - } - set symbolCount(value) { - this.ast.data.symbolCount = value; - } - get additionalSyntacticDiagnostics(): readonly ts.DiagnosticWithLocation[] | undefined { - return this.ast.data.additionalSyntacticDiagnostics; - } - set additionalSyntacticDiagnostics(value) { - this.ast.data.additionalSyntacticDiagnostics = value; - } - get classifiableNames(): ReadonlySet | undefined { - return this.ast.data.classifiableNames; - } - set classifiableNames(value) { - this.ast.data.classifiableNames = value; - } - get imports(): readonly ts.StringLiteralLike[] { - return this.ast.data.imports; - } - set imports(value) { - this.ast.data.imports = value; - } - get moduleAugmentations(): readonly (ts.Identifier | ts.StringLiteral)[] { - return this.ast.data.moduleAugmentations; - } - set moduleAugmentations(value) { - this.ast.data.moduleAugmentations = value; - } - get patternAmbientModules(): ts.PatternAmbientModule[] | undefined { - return this.ast.data.patternAmbientModules; - } - set patternAmbientModules(value) { - this.ast.data.patternAmbientModules = value; - } - get ambientModuleNames(): readonly string[] { - return this.ast.data.ambientModuleNames; - } - set ambientModuleNames(value) { - this.ast.data.ambientModuleNames = value; - } - get localJsxNamespace(): ts.__String | undefined { - return this.ast.data.localJsxNamespace; - } - set localJsxNamespace(value) { - this.ast.data.localJsxNamespace = value; - } - get localJsxFragmentNamespace(): ts.__String | undefined { - return this.ast.data.localJsxFragmentNamespace; - } - set localJsxFragmentNamespace(value) { - this.ast.data.localJsxFragmentNamespace = value; - } - get localJsxFactory(): ts.EntityName | undefined { - return this.ast.data.localJsxFactory; - } - set localJsxFactory(value) { - this.ast.data.localJsxFactory = value; - } - get localJsxFragmentFactory(): ts.EntityName | undefined { - return this.ast.data.localJsxFragmentFactory; - } - set localJsxFragmentFactory(value) { - this.ast.data.localJsxFragmentFactory = value; - } - get endFlowNode(): ts.FlowNode | undefined { - return this.ast.data.endFlowNode; - } - set endFlowNode(value) { - this.ast.data.endFlowNode = value; - } - get jsDocParsingMode(): ts.JSDocParsingMode | undefined { - return this.ast.data.jsDocParsingMode; - } - set jsDocParsingMode(value) { - this.ast.data.jsDocParsingMode = value; - } - - get scriptSnapshot(): any { - return this.ast.data.scriptSnapshot; - } - set scriptSnapshot(value) { - this.ast.data.scriptSnapshot = value; - } - get nameTable(): Map | undefined { - return this.ast.data.nameTable; - } - set nameTable(value) { - this.ast.data.nameTable = value; - } - - get nextContainer(): HasLocals | undefined { - return this.ast.data.nextContainer?.node; - } - set nextContainer(value) { - this.ast.data.nextContainer = value?.ast; - } - - get extendedSourceFiles(): string[] | undefined { - return this.ast.data.extendedSourceFiles; - } - set extendedSourceFiles(value) { - this.ast.data.extendedSourceFiles = value; - } - get configFileSpecs(): ts.ConfigFileSpecs | undefined { - return this.ast.data.configFileSpecs; - } - set configFileSpecs(value) { - this.ast.data.configFileSpecs = value; - } - - public update(newText: string, textChangeRange: ts.TextChangeRange): ts.SourceFile { - return updateSourceFile(this, newText, textChangeRange); - } - - public getLineAndCharacterOfPosition(position: number): ts.LineAndCharacter { - return getLineAndCharacterOfPosition(this, position); - } - - public getLineStarts(): readonly number[] { - return getLineStarts(this); - } - - public getPositionOfLineAndCharacter(line: number, character: number, allowEdits?: true): number { - return computePositionOfLineAndCharacter(getLineStarts(this), line, character, this.text, allowEdits); - } - - public getLineEndOfPosition(pos: number): number { - const { line } = this.getLineAndCharacterOfPosition(pos); - const lineStarts = this.getLineStarts(); - - let lastCharPos: number | undefined; - if (line + 1 >= lineStarts.length) { - lastCharPos = this.getEnd(); - } - if (!lastCharPos) { - lastCharPos = lineStarts[line + 1] - 1; - } - - const fullText = this.getFullText(); - // if the new line is "\r\n", we should return the last non-new-line-character position - return fullText[lastCharPos] === "\n" && fullText[lastCharPos - 1] === "\r" ? lastCharPos - 1 : lastCharPos; - } - - public getNamedDeclarations(): Map { - if (!this.ast.data.namedDeclarations) { - this.ast.data.namedDeclarations = this.computeNamedDeclarations(); - } - - return this.ast.data.namedDeclarations; - } - - private computeNamedDeclarations(): Map { - const result = createMultiMap(); - - this.forEachChild(visit); - - return result; - - function addDeclaration(declaration: ts.Declaration) { - const name = getDeclarationName(declaration); - if (name) { - result.add(name, declaration); - } - } - - function getDeclarations(name: string) { - let declarations = result.get(name); - if (!declarations) { - result.set(name, declarations = []); - } - return declarations; - } - - function getDeclarationName(declaration: ts.Declaration) { - const name = getNonAssignedNameOfDeclaration(declaration); - return name && (isComputedPropertyName(name) && isPropertyAccessExpression(name.expression) ? (name.expression.name as MemberName).text - : isPropertyName(name) ? getNameFromPropertyName(name) : undefined); - } - - function visit(node: ts.Node): void { - switch (node.kind) { - case SyntaxKind.FunctionDeclaration: - case SyntaxKind.FunctionExpression: - case SyntaxKind.MethodDeclaration: - case SyntaxKind.MethodSignature: - const functionDeclaration = node as ts.FunctionLikeDeclaration; - const declarationName = getDeclarationName(functionDeclaration); - - if (declarationName) { - const declarations = getDeclarations(declarationName); - const lastDeclaration = lastOrUndefined(declarations); - - // Check whether this declaration belongs to an "overload group". - if (lastDeclaration && functionDeclaration.parent === lastDeclaration.parent && functionDeclaration.symbol === lastDeclaration.symbol) { - // Overwrite the last declaration if it was an overload - // and this one is an implementation. - if (functionDeclaration.body && !(lastDeclaration as ts.FunctionLikeDeclaration).body) { - declarations[declarations.length - 1] = functionDeclaration; - } - } - else { - declarations.push(functionDeclaration); - } - } - forEachChild(node, visit); - break; - - case SyntaxKind.ClassDeclaration: - case SyntaxKind.ClassExpression: - case SyntaxKind.InterfaceDeclaration: - case SyntaxKind.TypeAliasDeclaration: - case SyntaxKind.EnumDeclaration: - case SyntaxKind.ModuleDeclaration: - case SyntaxKind.ImportEqualsDeclaration: - case SyntaxKind.ExportSpecifier: - case SyntaxKind.ImportSpecifier: - case SyntaxKind.ImportClause: - case SyntaxKind.NamespaceImport: - case SyntaxKind.GetAccessor: - case SyntaxKind.SetAccessor: - case SyntaxKind.TypeLiteral: - addDeclaration(node as ts.Declaration); - forEachChild(node, visit); - break; - - case SyntaxKind.Parameter: - // Only consider parameter properties - if (!hasSyntacticModifier(node, ModifierFlags.ParameterPropertyModifier)) { - break; - } - // falls through - - case SyntaxKind.VariableDeclaration: - case SyntaxKind.BindingElement: { - const decl = node as ts.VariableDeclaration; - if (isBindingPattern(decl.name)) { - forEachChild(decl.name, visit); - break; - } - if (decl.initializer) { - visit(decl.initializer); - } - } - // falls through - case SyntaxKind.EnumMember: - case SyntaxKind.PropertyDeclaration: - case SyntaxKind.PropertySignature: - addDeclaration(node as ts.Declaration); - break; - - case SyntaxKind.ExportDeclaration: - // Handle named exports case e.g.: - // export {a, b as B} from "mod"; - const exportDeclaration = node as ts.ExportDeclaration; - if (exportDeclaration.exportClause) { - if (isNamedExports(exportDeclaration.exportClause)) { - forEach(exportDeclaration.exportClause.elements, visit); - } - else { - visit(exportDeclaration.exportClause.name); - } - } - break; - - case SyntaxKind.ImportDeclaration: - const importClause = (node as ImportDeclaration).importClause; - if (importClause) { - // Handle default import case e.g.: - // import d from "mod"; - if (importClause.name) { - addDeclaration(importClause.name); - } - - // Handle named bindings in imports e.g.: - // import * as NS from "mod"; - // import {a, b as B} from "mod"; - if (importClause.namedBindings) { - if (importClause.namedBindings.kind === SyntaxKind.NamespaceImport) { - addDeclaration(importClause.namedBindings); - } - else { - forEach(importClause.namedBindings.elements, visit); - } - } - } - break; - - case SyntaxKind.BinaryExpression: - if (getAssignmentDeclarationKind(node as ts.BinaryExpression) !== ts.AssignmentDeclarationKind.None) { - addDeclaration(node as ts.BinaryExpression); - } - // falls through - - default: - forEachChild(node, visit); - } - } - } -} - -/** @internal */ +// dprint-ignore export class AstDeclarationData { - symbol: Symbol = undefined!; // initialized by binder (Declaration) - localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) + /** @internal */ symbol: Symbol = undefined!; // initialized by binder (Declaration) + /** @internal */ localSymbol: Symbol | undefined = undefined; // initialized by binder (Declaration) } -/** @internal */ +// dprint-ignore export class AstSourceFileData extends AstData { declaration: AstDeclarationData = new AstDeclarationData(); statements: AstNodeArray = undefined!; endOfFileToken: AstEndOfFileToken = undefined!; text = ""; fileName = ""; - path = "" as Path; + /** @internal */ path = "" as Path; + /** + * Resolved path can be different from path property, + * when file is included through project reference is mapped to its output instead of source + * in that case resolvedPath = path to output file + * path = input file's path + * + * @internal + */ resolvedPath = "" as Path; + /** + * Original file name that can be different from fileName, + * when file is included through project reference is mapped to its output instead of source + * in that case originalFileName = name of input file + * fileName = output file's name + * + * @internal + */ originalFileName = ""; - languageVersion: ts.ScriptTarget = ScriptTarget.ES5; + languageVersion: ScriptTarget = ScriptTarget.ES5; languageVariant: LanguageVariant = 0; - scriptKind: ScriptKind = 0; + /** @internal */ scriptKind: ScriptKind = 0; isDeclarationFile = false; + /** + * lib.d.ts should have a reference comment like + * + * /// + * + * If any other file has this comment, it signals not to include lib.d.ts + * because this containing file is intended to act as a default library. + */ hasNoDefaultLib = false; - locals: SymbolTable | undefined = undefined; - nextContainer: AstNextContainer | undefined = undefined; - endFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) - nodeCount = 0; - identifierCount = 0; - symbolCount = 0; + /** @internal */ locals: SymbolTable | undefined = undefined; + /** @internal */ nextContainer: AstHasLocals | undefined = undefined; + /** @internal */ endFlowNode: FlowNode | undefined = undefined; // initialized by checker (FlowContainer) + /** @internal */ nodeCount = 0; + /** @internal */ identifierCount = 0; + /** @internal */ symbolCount = 0; + /** + * File-level diagnostics reported by the parser (includes diagnostics about /// references + * as well as code diagnostics). + * @internal + */ parseDiagnostics: DiagnosticWithLocation[] = undefined!; + /** + * File-level diagnostics reported by the binder. + * @internal + */ bindDiagnostics: DiagnosticWithLocation[] = undefined!; - bindSuggestionDiagnostics: DiagnosticWithLocation[] | undefined = undefined; - lineMap: readonly number[] = undefined!; + /** @internal */ bindSuggestionDiagnostics: DiagnosticWithLocation[] | undefined = undefined; + // Stores a line map for the file. + // This field should never be used directly to obtain line map, use getLineMap function instead. + /** @internal */ lineMap: readonly number[] = undefined!; + /** + * The first "most obvious" node that makes a file an external module. + * This is intended to be the first top-level import/export, + * but could be arbitrarily nested (e.g. `import.meta`). + * + * @internal + */ externalModuleIndicator: Node | true | undefined = undefined; - setExternalModuleIndicator?: ((file: ts.SourceFile) => void) | undefined = undefined; - pragmas: ReadonlyPragmaMap = undefined!; - checkJsDirective: CheckJsDirective | undefined = undefined; + /** + * The callback used to set the external module indicator - this is saved to + * be later reused during incremental reparsing, which otherwise lacks the information + * to set this field + * + * @internal + */ + setExternalModuleIndicator?: ((file: SourceFile) => void) | undefined = undefined; + /** @internal */ pragmas: ReadonlyPragmaMap = undefined!; + /** @internal */ checkJsDirective: CheckJsDirective | undefined = undefined; referencedFiles: readonly FileReference[] = undefined!; typeReferenceDirectives: readonly FileReference[] = undefined!; libReferenceDirectives: readonly FileReference[] = undefined!; amdDependencies: AmdDependency[] = undefined!; - commentDirectives: CommentDirective[] | undefined = undefined; + // Comments containing @ts-* directives, in order. + /** @internal */ commentDirectives: CommentDirective[] | undefined = undefined; + /** + * Map from a string to an interned string + * @internal + */ identifiers: Map = undefined!; - packageJsonLocations?: readonly string[] | undefined = undefined; - packageJsonScope?: PackageJsonInfo | undefined = undefined; - imports: readonly ts.StringLiteralLike[] = undefined!; - moduleAugmentations: readonly (ts.Identifier | ts.StringLiteral)[] = undefined!; - ambientModuleNames: readonly string[] = undefined!; - classifiableNames?: ReadonlySet<__String> | undefined = undefined; + /** @internal */ packageJsonLocations?: readonly string[] | undefined = undefined; + /** @internal */ packageJsonScope?: PackageJsonInfo | undefined = undefined; + /** @internal */ imports: readonly StringLiteralLike[] = undefined!; + // Identifier only if `declare global` + /** @internal */ moduleAugmentations: readonly (Identifier | StringLiteral)[] = undefined!; + /** @internal */ ambientModuleNames: readonly string[] = undefined!; + /** @internal */ classifiableNames?: ReadonlySet<__String> | undefined = undefined; + /** + * When `module` is `Node16` or `NodeNext`, this field controls whether the + * source file in question is an ESNext-output-format file, or a CommonJS-output-format + * module. This is derived by the module resolver as it looks up the file, since + * it is derived from either the file extension of the module, or the containing + * `package.json` context, and affects both checking and emit. + * + * It is _public_ so that (pre)transformers can set this field, + * since it switches the builtin `node` module transform. Generally speaking, if unset, + * the field is treated as though it is `ModuleKind.CommonJS`. + * + * Note that this field is only set by the module resolution process when + * `moduleResolution` is `Node16` or `NodeNext`, which is implied by the `module` setting + * of `Node16` or `NodeNext`, respectively, but may be overriden (eg, by a `moduleResolution` + * of `node`). If so, this field will be unset and source files will be considered to be + * CommonJS-output-format by the node module transformer and type checker, regardless of extension or context. + */ impliedNodeFormat: ResolutionMode | undefined = undefined; moduleName: string | undefined = undefined; + /** + * this map is used by transpiler to supply alternative names for dependencies (i.e. in case of bundling) + * @internal + */ renamedDependencies: Map = undefined!; + /** + * The first node that causes this file to be a CommonJS module + * @internal + */ commonJsModuleIndicator: Node | undefined = undefined; - version: string = undefined!; - redirectInfo?: ts.RedirectInfo | undefined = undefined; + /** @internal */ version: string = undefined!; + /** + * If two source files are for the same version of the same package, one will redirect to the other. + * (See `createRedirectSourceFile` in program.ts.) + * The redirect will have this set. The redirected-to source file will be in `redirectTargetsMap`. + * + * @internal + */ + redirectInfo?: RedirectInfo | undefined = undefined; + /** + * JS identifier-declarations that are intended to merge with globals + * @internal + */ jsGlobalAugmentations?: SymbolTable | undefined = undefined; - additionalSyntacticDiagnostics?: readonly DiagnosticWithLocation[] | undefined = undefined; - patternAmbientModules?: ts.PatternAmbientModule[] | undefined = undefined; - localJsxNamespace?: __String | undefined = undefined; - localJsxFragmentNamespace?: __String | undefined = undefined; - localJsxFactory?: ts.EntityName | undefined = undefined; - localJsxFragmentFactory?: ts.EntityName | undefined = undefined; - jsDocParsingMode?: ts.JSDocParsingMode | undefined = undefined; + // Stores additional file-level diagnostics reported by the program + /** @internal */ additionalSyntacticDiagnostics?: readonly DiagnosticWithLocation[] | undefined = undefined; + /** @internal */ patternAmbientModules?: PatternAmbientModule[] | undefined = undefined; + /** @internal */ localJsxNamespace?: __String | undefined = undefined; + /** @internal */ localJsxFragmentNamespace?: __String | undefined = undefined; + /** @internal */ localJsxFactory?: EntityName | undefined = undefined; + /** @internal */ localJsxFragmentFactory?: EntityName | undefined = undefined; + /** @internal */ jsDocParsingMode?: JSDocParsingMode | undefined = undefined; + /** + * File-level JSDoc diagnostics reported by the JSDoc parser + * @internal + */ jsDocDiagnostics: DiagnosticWithLocation[] | undefined = undefined; - namedDeclarations: Map | undefined = undefined; + namedDeclarations: Map | undefined = undefined; - // TODO: fix type - scriptSnapshot: any = undefined; - nameTable: Map<__String, number> | undefined = undefined; + /** @internal */ scriptSnapshot: IScriptSnapshot | undefined = undefined; + /** @internal */ nameTable: Map<__String, number> | undefined = undefined; // TsConfigSourceFile - extendedSourceFiles?: string[]; - configFileSpecs?: ts.ConfigFileSpecs; + /** @internal */ extendedSourceFiles?: string[]; + /** @internal */ configFileSpecs?: ConfigFileSpecs; - override computeTransformFlags(_: AstNode): TransformFlags { + /** @internal */ override computeTransformFlags(_: AstNode): TransformFlags { return propagateChildrenFlags(this.statements) | propagateChildFlags(this.endOfFileToken); } override cloneNode(node: AstNode): AstNode { if (this.redirectInfo) { - const clone = (this.redirectInfo.redirectTarget as SourceFile).ast.shadow() as AstSourceFile; + const clone = this.redirectInfo.redirectTarget.ast.shadow() as AstSourceFile; this.copyProperties(clone.data); clone.emitNode = undefined; return clone; @@ -13405,486 +4524,237 @@ export class AstSourceFileData extends AstData { } } -/** @internal */ export type AstToken = AstNode>; -/** @internal */ export type AstEndOfFileToken = AstNode; -/** @internal */ export type AstThisExpression = AstNode; -/** @internal */ export type AstSuperExpression = AstNode; -/** @internal */ export type AstImportExpression = AstNode; -/** @internal */ export type AstNullLiteral = AstNode; -/** @internal */ export type AstTrueLiteral = AstNode; -/** @internal */ export type AstFalseLiteral = AstNode; -/** @internal */ export type AstIdentifier = AstNode; -/** @internal */ export type AstQualifiedName = AstNode; -/** @internal */ export type AstComputedPropertyName = AstNode; -/** @internal */ export type AstPrivateIdentifier = AstNode; -/** @internal */ export type AstTypeParameterDeclaration = AstNode; -/** @internal */ export type AstParameterDeclaration = AstNode; -/** @internal */ export type AstDecorator = AstNode; -/** @internal */ export type AstPropertySignature = AstNode; -/** @internal */ export type AstCallSignatureDeclaration = AstNode; -/** @internal */ export type AstConstructSignatureDeclaration = AstNode; -/** @internal */ export type AstVariableDeclaration = AstNode; -/** @internal */ export type AstVariableDeclarationList = AstNode; -/** @internal */ export type AstBindingElement = AstNode; -/** @internal */ export type AstPropertyDeclaration = AstNode; -/** @internal */ export type AstPropertyAssignment = AstNode; -/** @internal */ export type AstShorthandPropertyAssignment = AstNode; -/** @internal */ export type AstSpreadAssignment = AstNode; -/** @internal */ export type AstObjectBindingPattern = AstNode; -/** @internal */ export type AstArrayBindingPattern = AstNode; -/** @internal */ export type AstFunctionDeclaration = AstNode; -/** @internal */ export type AstMethodSignature = AstNode; -/** @internal */ export type AstMethodDeclaration = AstNode; -/** @internal */ export type AstConstructorDeclaration = AstNode; -/** @internal */ export type AstSemicolonClassElement = AstNode; -/** @internal */ export type AstGetAccessorDeclaration = AstNode; -/** @internal */ export type AstSetAccessorDeclaration = AstNode; -/** @internal */ export type AstIndexSignatureDeclaration = AstNode; -/** @internal */ export type AstClassStaticBlockDeclaration = AstNode; -/** @internal */ export type AstImportTypeNode = AstNode; -/** @internal */ export type AstThisTypeNode = AstNode; -/** @internal */ export type AstFunctionTypeNode = AstNode; -/** @internal */ export type AstConstructorTypeNode = AstNode; -/** @internal */ export type AstTypeReferenceNode = AstNode; -/** @internal */ export type AstTypePredicateNode = AstNode; -/** @internal */ export type AstTypeQueryNode = AstNode; -/** @internal */ export type AstTypeLiteralNode = AstNode; -/** @internal */ export type AstArrayTypeNode = AstNode; -/** @internal */ export type AstTupleTypeNode = AstNode; -/** @internal */ export type AstNamedTupleMember = AstNode; -/** @internal */ export type AstOptionalTypeNode = AstNode; -/** @internal */ export type AstRestTypeNode = AstNode; -/** @internal */ export type AstUnionTypeNode = AstNode; -/** @internal */ export type AstIntersectionTypeNode = AstNode; -/** @internal */ export type AstConditionalTypeNode = AstNode; -/** @internal */ export type AstInferTypeNode = AstNode; -/** @internal */ export type AstParenthesizedTypeNode = AstNode; -/** @internal */ export type AstTypeOperatorNode = AstNode; -/** @internal */ export type AstIndexedAccessTypeNode = AstNode; -/** @internal */ export type AstMappedTypeNode = AstNode; -/** @internal */ export type AstLiteralTypeNode = AstNode; -/** @internal */ export type AstStringLiteral = AstNode; -/** @internal */ export type AstTemplateLiteralTypeNode = AstNode; -/** @internal */ export type AstTemplateLiteralTypeSpan = AstNode; -/** @internal */ export type AstOmittedExpression = AstNode; -/** @internal */ export type AstPrefixUnaryExpression = AstNode; -/** @internal */ export type AstPostfixUnaryExpression = AstNode; -/** @internal */ export type AstDeleteExpression = AstNode; -/** @internal */ export type AstTypeOfExpression = AstNode; -/** @internal */ export type AstVoidExpression = AstNode; -/** @internal */ export type AstAwaitExpression = AstNode; -/** @internal */ export type AstYieldExpression = AstNode; -/** @internal */ export type AstBinaryExpression = AstNode; -/** @internal */ export type AstConditionalExpression = AstNode; -/** @internal */ export type AstFunctionExpression = AstNode; -/** @internal */ export type AstArrowFunction = AstNode; -/** @internal */ export type AstRegularExpressionLiteral = AstNode; -/** @internal */ export type AstNoSubstitutionTemplateLiteral = AstNode; -/** @internal */ export type AstNumericLiteral = AstNode; -/** @internal */ export type AstBigIntLiteral = AstNode; -/** @internal */ export type AstTemplateHead = AstNode; -/** @internal */ export type AstTemplateMiddle = AstNode; -/** @internal */ export type AstTemplateTail = AstNode; -/** @internal */ export type AstTemplateExpression = AstNode; -/** @internal */ export type AstTemplateSpan = AstNode; -/** @internal */ export type AstParenthesizedExpression = AstNode; -/** @internal */ export type AstArrayLiteralExpression = AstNode; -/** @internal */ export type AstSpreadElement = AstNode; -/** @internal */ export type AstObjectLiteralExpression = AstNode; -/** @internal */ export type AstPropertyAccessExpression = AstNode; -/** @internal */ export type AstElementAccessExpression = AstNode; -/** @internal */ export type AstCallExpression = AstNode; -/** @internal */ export type AstExpressionWithTypeArguments = AstNode; -/** @internal */ export type AstNewExpression = AstNode; -/** @internal */ export type AstTaggedTemplateExpression = AstNode; -/** @internal */ export type AstAsExpression = AstNode; -/** @internal */ -export type AstTypeAssertion = AstNode; -/** @internal */ +export type AstTypeAssertion = AstNode; export type AstSatisfiesExpression = AstNode; -/** @internal */ export type AstNonNullExpression = AstNode; -/** @internal */ export type AstMetaProperty = AstNode; -/** @internal */ export type AstJsxElement = AstNode; -/** @internal */ export type AstJsxAttributes = AstNode; -/** @internal */ export type AstJsxNamespacedName = AstNode; -/** @internal */ export type AstJsxOpeningElement = AstNode; -/** @internal */ export type AstJsxSelfClosingElement = AstNode; -/** @internal */ export type AstJsxFragment = AstNode; -/** @internal */ export type AstJsxOpeningFragment = AstNode; -/** @internal */ export type AstJsxClosingFragment = AstNode; -/** @internal */ export type AstJsxAttribute = AstNode; -/** @internal */ export type AstJsxSpreadAttribute = AstNode; -/** @internal */ export type AstJsxClosingElement = AstNode; -/** @internal */ export type AstJsxExpression = AstNode; -/** @internal */ export type AstJsxText = AstNode; -/** @internal */ export type AstEmptyStatement = AstNode; -/** @internal */ export type AstDebuggerStatement = AstNode; -/** @internal */ export type AstMissingDeclaration = AstNode; -/** @internal */ export type AstBlock = AstNode; -/** @internal */ export type AstVariableStatement = AstNode; -/** @internal */ export type AstExpressionStatement = AstNode; -/** @internal */ export type AstIfStatement = AstNode; -/** @internal */ export type AstDoStatement = AstNode; -/** @internal */ export type AstWhileStatement = AstNode; -/** @internal */ export type AstForStatement = AstNode; -/** @internal */ export type AstForInStatement = AstNode; -/** @internal */ export type AstForOfStatement = AstNode; -/** @internal */ export type AstBreakStatement = AstNode; -/** @internal */ export type AstContinueStatement = AstNode; -/** @internal */ export type AstReturnStatement = AstNode; -/** @internal */ export type AstWithStatement = AstNode; -/** @internal */ export type AstSwitchStatement = AstNode; -/** @internal */ export type AstCaseBlock = AstNode; -/** @internal */ export type AstCaseClause = AstNode; -/** @internal */ export type AstDefaultClause = AstNode; -/** @internal */ export type AstLabeledStatement = AstNode; -/** @internal */ export type AstThrowStatement = AstNode; -/** @internal */ export type AstTryStatement = AstNode; -/** @internal */ export type AstCatchClause = AstNode; -/** @internal */ export type AstClassDeclaration = AstNode; -/** @internal */ export type AstClassExpression = AstNode; -/** @internal */ export type AstInterfaceDeclaration = AstNode; -/** @internal */ export type AstHeritageClause = AstNode; -/** @internal */ export type AstTypeAliasDeclaration = AstNode; -/** @internal */ export type AstEnumMember = AstNode; -/** @internal */ export type AstEnumDeclaration = AstNode; -/** @internal */ export type AstModuleDeclaration = AstNode; -/** @internal */ export type AstModuleBlock = AstNode; -/** @internal */ export type AstImportEqualsDeclaration = AstNode; -/** @internal */ export type AstExternalModuleReference = AstNode; -/** @internal */ export type AstImportDeclaration = AstNode; -/** @internal */ export type AstImportClause = AstNode; -/** @internal */ export type AstImportAttribute = AstNode; -/** @internal */ export type AstImportAttributes = AstNode; -/** @internal */ export type AstNamespaceImport = AstNode; -/** @internal */ export type AstNamespaceExport = AstNode; -/** @internal */ export type AstNamespaceExportDeclaration = AstNode; -/** @internal */ export type AstExportDeclaration = AstNode; -/** @internal */ export type AstNamedImports = AstNode; -/** @internal */ export type AstNamedExports = AstNode; -/** @internal */ export type AstImportSpecifier = AstNode; -/** @internal */ export type AstExportSpecifier = AstNode; -/** @internal */ export type AstExportAssignment = AstNode; -/** @internal */ export type AstJSDocTypeExpression = AstNode; -/** @internal */ export type AstJSDocNameReference = AstNode; -/** @internal */ export type AstJSDocMemberName = AstNode; -/** @internal */ export type AstJSDocAllType = AstNode; -/** @internal */ export type AstJSDocUnknownType = AstNode; -/** @internal */ export type AstJSDocNonNullableType = AstNode; -/** @internal */ export type AstJSDocNullableType = AstNode; -/** @internal */ export type AstJSDocOptionalType = AstNode; -/** @internal */ export type AstJSDocFunctionType = AstNode; -/** @internal */ export type AstJSDocVariadicType = AstNode; -/** @internal */ export type AstJSDocNamepathType = AstNode; -/** @internal */ export type AstJSDoc = AstNode; -/** @internal */ export type AstJSDocLink = AstNode; -/** @internal */ export type AstJSDocLinkCode = AstNode; -/** @internal */ export type AstJSDocLinkPlain = AstNode; -/** @internal */ export type AstJSDocText = AstNode; -/** @internal */ export type AstJSDocUnknownTag = AstNode; -/** @internal */ export type AstJSDocAugmentsTag = AstNode; -/** @internal */ export type AstJSDocImplementsTag = AstNode; -/** @internal */ export type AstJSDocAuthorTag = AstNode; -/** @internal */ export type AstJSDocDeprecatedTag = AstNode; -/** @internal */ export type AstJSDocClassTag = AstNode; -/** @internal */ export type AstJSDocPublicTag = AstNode; -/** @internal */ export type AstJSDocPrivateTag = AstNode; -/** @internal */ export type AstJSDocProtectedTag = AstNode; -/** @internal */ export type AstJSDocReadonlyTag = AstNode; -/** @internal */ export type AstJSDocOverrideTag = AstNode; -/** @internal */ export type AstJSDocEnumTag = AstNode; -/** @internal */ export type AstJSDocThisTag = AstNode; -/** @internal */ export type AstJSDocTemplateTag = AstNode; -/** @internal */ export type AstJSDocSeeTag = AstNode; -/** @internal */ export type AstJSDocReturnTag = AstNode; -/** @internal */ export type AstJSDocTypeTag = AstNode; -/** @internal */ export type AstJSDocTypedefTag = AstNode; -/** @internal */ export type AstJSDocCallbackTag = AstNode; -/** @internal */ export type AstJSDocOverloadTag = AstNode; -/** @internal */ export type AstJSDocThrowsTag = AstNode; -/** @internal */ export type AstJSDocSignature = AstNode; -/** @internal */ export type AstJSDocPropertyTag = AstNode; -/** @internal */ export type AstJSDocParameterTag = AstNode; -/** @internal */ export type AstJSDocTypeLiteral = AstNode; -/** @internal */ export type AstJSDocSatisfiesTag = AstNode; -/** @internal */ export type AstJSDocImportTag = AstNode; -/** @internal */ export type AstSourceFile = AstNode; -/** @internal */ export type AstSyntheticExpression = AstNode; -/** @internal */ export type AstBundle = AstNode; -/** @internal */ export type AstSyntaxList = AstNode; -/** @internal */ export type AstNotEmittedStatement = AstNode; -/** @internal */ export type AstNotEmittedTypeElement = AstNode; -/** @internal */ export type AstPartiallyEmittedExpression = AstNode; -/** @internal */ export type AstCommaListExpression = AstNode; /** @internal */ export type AstSyntheticReferenceExpression = AstNode; // JSON -/** @internal */ -export interface JsonMinusNumericLiteral extends PrefixUnaryExpression { - readonly ast: AstJsonMinusNumericLiteral; - readonly data: AstJsonMinusNumericLiteralData; - - readonly operator: SyntaxKind.MinusToken; - readonly operand: NumericLiteral; -} - -/** @internal */ export interface AstJsonMinusNumericLiteralData extends AstPrefixUnaryExpressionData { operator: SyntaxKind.MinusToken; operand: AstNumericLiteral; } -/** @internal */ export type AstJsonMinusNumericLiteral = AstNode; -/** @internal */ -export type JsonObjectExpression = - | ObjectLiteralExpression - | ArrayLiteralExpression - | JsonMinusNumericLiteral - | NumericLiteral - | StringLiteral - | BooleanLiteral - | NullLiteral; - -/** @internal */ export type AstJsonObjectExpression = AstNodeOneOf; -/** @internal */ -export interface JsonObjectExpressionStatement extends ExpressionStatement { - readonly ast: AstJsonObjectExpressionStatement; - readonly data: AstJsonObjectExpressionStatementData; - readonly expression: JsonObjectExpression; -} - -/** @internal */ export type AstJsonObjectExpressionStatement = AstNode; -/** @internal */ export interface AstJsonObjectExpressionStatementData extends AstExpressionStatementData { expression: AstJsonObjectExpression; } -/** @internal */ -export interface JsonSourceFile extends SourceFile { - readonly ast: AstJsonSourceFile; - readonly data: AstJsonSourceFileData; - readonly statements: NodeArray; -} - -/** @internal */ export type AstJsonSourceFile = AstNode; -/** @internal */ export interface AstJsonSourceFileData extends AstSourceFileData { statements: AstNodeArray; } @@ -13905,7 +4775,7 @@ function propagatePropertyNameFlagsOfChild(node: AstPropertyName, transformFlags function propagateChildFlags(child: AstNode | undefined): TransformFlags { if (!child) return TransformFlags.None; const childFlags = child.transformFlags & ~getTransformFlagsSubtreeExclusions(child.kind); - return isNamedDeclaration(child) && child.data.name && isAstPropertyName(child.data.name) ? propagatePropertyNameFlagsOfChild(child.data.name, childFlags) : childFlags; + return astCanHaveName(child) && child.data.name && isAstPropertyName(child.data.name) ? propagatePropertyNameFlagsOfChild(child.data.name, childFlags) : childFlags; } function propagateChildrenFlags(children: AstNodeArray | undefined): TransformFlags { @@ -13925,70 +4795,58 @@ function getTransformFlagsOfTemplateLiteralLike(templateFlags: TokenFlags) { return transformFlags; } -/** @internal */ -export type NamedDeclaration = - | FunctionDeclaration - | FunctionExpression - | ClassExpression - | ClassDeclaration - | MethodDeclaration - | GetAccessorDeclaration - | SetAccessorDeclaration - | PropertyDeclaration - | InterfaceDeclaration - | MethodSignature - | PropertySignature - | TypeAliasDeclaration - | EnumDeclaration - | EnumMember - | ModuleDeclaration - | VariableDeclaration - | ParameterDeclaration - | BindingElement - | TypeParameterDeclaration - | ImportEqualsDeclaration - | NamespaceExportDeclaration - | ImportClause - | NamespaceImport - | NamespaceExport - | ImportSpecifier - | ExportSpecifier - | JSDocTypedefTag - | JSDocCallbackTag; - /** @internal */ export type AstNamedDeclaration = AstNodeOneOf; -function isNamedDeclaration(node: AstNode): node is AstNamedDeclaration { +/** @internal */ +export type AstHasName = AstNodeOneOf; + +function astCanHaveName(node: AstNode): node is AstHasName { switch (node.kind) { - case SyntaxKind.FunctionDeclaration: - case SyntaxKind.FunctionExpression: - case SyntaxKind.ClassExpression: + case SyntaxKind.BindingElement: case SyntaxKind.ClassDeclaration: - case SyntaxKind.MethodDeclaration: - case SyntaxKind.GetAccessor: - case SyntaxKind.SetAccessor: - case SyntaxKind.PropertyDeclaration: - case SyntaxKind.InterfaceDeclaration: - case SyntaxKind.MethodSignature: - case SyntaxKind.PropertySignature: - case SyntaxKind.TypeAliasDeclaration: + case SyntaxKind.ClassExpression: case SyntaxKind.EnumDeclaration: case SyntaxKind.EnumMember: - case SyntaxKind.ModuleDeclaration: - case SyntaxKind.VariableDeclaration: - case SyntaxKind.Parameter: - case SyntaxKind.BindingElement: - case SyntaxKind.TypeParameter: - case SyntaxKind.ImportEqualsDeclaration: - case SyntaxKind.NamespaceExportDeclaration: - case SyntaxKind.ImportClause: - case SyntaxKind.NamespaceImport: - case SyntaxKind.NamespaceExport: - case SyntaxKind.ImportSpecifier: case SyntaxKind.ExportSpecifier: - case SyntaxKind.JSDocTypedefTag: + case SyntaxKind.FunctionDeclaration: + case SyntaxKind.FunctionExpression: + case SyntaxKind.GetAccessor: + case SyntaxKind.ImportAttribute: + case SyntaxKind.ImportClause: + case SyntaxKind.ImportEqualsDeclaration: + case SyntaxKind.ImportSpecifier: + case SyntaxKind.InterfaceDeclaration: case SyntaxKind.JSDocCallbackTag: + case SyntaxKind.JSDocLink: + case SyntaxKind.JSDocLinkCode: + case SyntaxKind.JSDocLinkPlain: + case SyntaxKind.JSDocNameReference: + case SyntaxKind.JSDocParameterTag: + case SyntaxKind.JSDocPropertyTag: + case SyntaxKind.JSDocSeeTag: + case SyntaxKind.JSDocTypedefTag: + case SyntaxKind.JsxAttribute: + case SyntaxKind.JsxNamespacedName: + case SyntaxKind.MetaProperty: + case SyntaxKind.MethodDeclaration: + case SyntaxKind.MethodSignature: + case SyntaxKind.MissingDeclaration: + case SyntaxKind.ModuleDeclaration: + case SyntaxKind.NamedTupleMember: + case SyntaxKind.NamespaceExport: + case SyntaxKind.NamespaceExportDeclaration: + case SyntaxKind.NamespaceImport: + case SyntaxKind.Parameter: + case SyntaxKind.PropertyAccessExpression: + case SyntaxKind.PropertyAssignment: + case SyntaxKind.PropertyDeclaration: + case SyntaxKind.PropertySignature: + case SyntaxKind.SetAccessor: + case SyntaxKind.ShorthandPropertyAssignment: + case SyntaxKind.TypeAliasDeclaration: + case SyntaxKind.TypeParameter: + case SyntaxKind.VariableDeclaration: return true; } return false; @@ -14029,105 +4887,6 @@ function isNoSubstitutionTemplateLiteral(template: AstTemplateLiteral): template return template.kind === SyntaxKind.NoSubstitutionTemplateLiteral; } -// copied from services/utilities.ts -function getNameFromPropertyName(name: ts.PropertyName): string | undefined { - return name.kind === SyntaxKind.ComputedPropertyName - // treat computed property names where expression is string/numeric literal as just string/numeric literal - ? isStringOrNumericLiteralLike(name.expression) ? name.expression.text : undefined - : isPrivateIdentifier(name) ? idText(name) : getTextOfIdentifierOrLiteral(name); -} - -// copied form services/services.ts -let _scanner: Scanner | undefined; - -function scanner() { - _scanner ??= createScanner(ScriptTarget.Latest, /*skipTrivia*/ true); - return _scanner; -} - -function createChildren(node: Node, sourceFile: ts.SourceFileLike | undefined): readonly ts.Node[] { - const children: ts.Node[] = []; - - if (isJSDocCommentContainingNode(node)) { - /** Don't add trivia for "tokens" since this is in a comment. */ - node.forEachChild(child => { - children.push(child); - }); - return children; - } - - scanner().setText((sourceFile || node.getSourceFile()).text); - let pos = node.pos; - const processNode = (child: ts.Node) => { - addSyntheticNodes(children, pos, child.pos, node); - children.push(child); - pos = child.end; - }; - const processNodes = (nodes: ts.NodeArray) => { - addSyntheticNodes(children, pos, nodes.pos, node); - children.push(createSyntaxList(nodes, node)); - pos = nodes.end; - }; - // jsDocComments need to be the first children - forEach((node as ts.Node as ts.JSDocContainer).jsDoc, processNode); - // For syntactic classifications, all trivia are classified together, including jsdoc comments. - // For that to work, the jsdoc comments should still be the leading trivia of the first child. - // Restoring the scanner position ensures that. - pos = node.pos; - node.forEachChild(processNode, processNodes); - addSyntheticNodes(children, pos, node.end, node); - scanner().setText(undefined); - return children; -} - -function createNode(kind: TKind, pos: number, end: number, parent: ts.Node): ts.Node { - const astNode = kind === SyntaxKind.StringLiteral ? AstNode.StringLiteral() : AstNode.Token(kind); - astNode.pos = pos; - astNode.end = end; - astNode.parent = (parent as Node).ast; - astNode.flags = parent.flags & NodeFlags.ContextFlags; - return astNode.node; -} - -function addSyntheticNodes(nodes: ts.Node[], pos: number, end: number, parent: ts.Node): void { - scanner().resetTokenState(pos); - while (pos < end) { - const token = scanner().scan(); - const textPos = scanner().getTokenEnd(); - if (textPos <= end) { - Debug.assert(ts.isTokenKind(token)); - if (token === SyntaxKind.Identifier) { - if (hasTabstop(parent)) { - continue; - } - Debug.fail(`Did not expect ${Debug.formatSyntaxKind(parent.kind)} to have an ${Debug.formatSyntaxKind(token)} in its trivia`); - } - nodes.push(createNode(token as TokenSyntaxKind, pos, textPos, parent)); - } - pos = textPos; - if (token === SyntaxKind.EndOfFileToken) { - break; - } - } -} - -function createSyntaxList(nodes: ts.NodeArray, parent: ts.Node): ts.Node { - const list = AstNode.SyntaxList(); - list.pos = nodes.pos; - list.end = nodes.end; - list.parent = (parent as Node).ast; - const children: ts.Node[] = []; - let pos = nodes.pos; - for (const node of nodes) { - addSyntheticNodes(children, pos, node.pos, parent); - children.push(node); - pos = node.end; - } - addSyntheticNodes(children, pos, nodes.end, parent); - list.data._children = children as Node[]; - return list.node; -} - /** @internal */ export function getAstSourceFileNodeOfNode(node: AstNode | undefined): AstSourceFile | undefined { while (node && node.kind !== SyntaxKind.SourceFile) { @@ -14142,7 +4901,7 @@ export function getAstParseTreeNode(node: AstNode | undefined, nodeTest?: (node: return node; } while (node) { - if (ts.isParseTreeNode(node)) { + if (isParseTreeNode(node)) { return !nodeTest || nodeTest(node) ? node : undefined; } node = node.original; @@ -14154,776 +4913,38 @@ export function getAstParseTreeNode(node: AstNode | undefined, nodeTest?: (node: export function isAstJSDocTypeAssertion(node: AstNode): node is AstJSDocTypeAssertion { return isAstParenthesizedExpression(node) && !!(node.flags & NodeFlags.JavaScriptFile) - && !!ts.getJSDocTypeTag(node.node); // TODO: don't invoke node + && !!getJSDocTypeTag(node.node); // TODO: don't invoke node } -/** @internal */ -export type OuterExpression = - | ParenthesizedExpression - | TypeAssertion - | SatisfiesExpression - | AsExpression - | NonNullExpression - | ExpressionWithTypeArguments - | PartiallyEmittedExpression; - /** @internal */ export type AstOuterExpression = AstNodeOneOf; /** @internal */ -export function isAstOuterExpression(node: AstNode, kinds: ts.OuterExpressionKinds = ts.OuterExpressionKinds.All): node is AstOuterExpression { +export function isAstOuterExpression(node: AstNode, kinds: OuterExpressionKinds = OuterExpressionKinds.All): node is AstOuterExpression { switch (node.kind) { case SyntaxKind.ParenthesizedExpression: - if (kinds & ts.OuterExpressionKinds.ExcludeJSDocTypeAssertion && isAstJSDocTypeAssertion(node)) { + if (kinds & OuterExpressionKinds.ExcludeJSDocTypeAssertion && isAstJSDocTypeAssertion(node)) { return false; } - return (kinds & ts.OuterExpressionKinds.Parentheses) !== 0; + return (kinds & OuterExpressionKinds.Parentheses) !== 0; case SyntaxKind.TypeAssertionExpression: case SyntaxKind.AsExpression: case SyntaxKind.SatisfiesExpression: - return (kinds & ts.OuterExpressionKinds.TypeAssertions) !== 0; + return (kinds & OuterExpressionKinds.TypeAssertions) !== 0; case SyntaxKind.ExpressionWithTypeArguments: - return (kinds & ts.OuterExpressionKinds.ExpressionsWithTypeArguments) !== 0; + return (kinds & OuterExpressionKinds.ExpressionsWithTypeArguments) !== 0; case SyntaxKind.NonNullExpression: - return (kinds & ts.OuterExpressionKinds.NonNullAssertions) !== 0; + return (kinds & OuterExpressionKinds.NonNullAssertions) !== 0; case SyntaxKind.PartiallyEmittedExpression: - return (kinds & ts.OuterExpressionKinds.PartiallyEmittedExpressions) !== 0; + return (kinds & OuterExpressionKinds.PartiallyEmittedExpressions) !== 0; } return false; } /** @internal */ -export function skipAstOuterExpressions(node: AstNode, kinds: ts.OuterExpressionKinds = ts.OuterExpressionKinds.All): AstNode { +export function skipAstOuterExpressions(node: AstNode, kinds: OuterExpressionKinds = OuterExpressionKinds.All): AstNode { while (isAstOuterExpression(node, kinds)) { node = node.data.expression; } return node; } - -/** @internal */ -export interface NodeType { - [SyntaxKind.Unknown]: Token; - [SyntaxKind.EndOfFileToken]: EndOfFileToken; - [SyntaxKind.SingleLineCommentTrivia]: Token; - [SyntaxKind.MultiLineCommentTrivia]: Token; - [SyntaxKind.NewLineTrivia]: Token; - [SyntaxKind.WhitespaceTrivia]: Token; - [SyntaxKind.ShebangTrivia]: Token; - [SyntaxKind.ConflictMarkerTrivia]: Token; - [SyntaxKind.NonTextFileMarkerTrivia]: never; - [SyntaxKind.NumericLiteral]: NumericLiteral; - [SyntaxKind.BigIntLiteral]: BigIntLiteral; - [SyntaxKind.StringLiteral]: StringLiteral; - [SyntaxKind.JsxText]: JsxText; - [SyntaxKind.JsxTextAllWhiteSpaces]: never; - [SyntaxKind.RegularExpressionLiteral]: RegularExpressionLiteral; - [SyntaxKind.NoSubstitutionTemplateLiteral]: NoSubstitutionTemplateLiteral; - [SyntaxKind.TemplateHead]: TemplateHead; - [SyntaxKind.TemplateMiddle]: TemplateMiddle; - [SyntaxKind.TemplateTail]: TemplateTail; - [SyntaxKind.OpenBraceToken]: Token; - [SyntaxKind.CloseBraceToken]: Token; - [SyntaxKind.OpenParenToken]: Token; - [SyntaxKind.CloseParenToken]: Token; - [SyntaxKind.OpenBracketToken]: Token; - [SyntaxKind.CloseBracketToken]: Token; - [SyntaxKind.DotToken]: Token; - [SyntaxKind.DotDotDotToken]: Token; - [SyntaxKind.SemicolonToken]: Token; - [SyntaxKind.CommaToken]: Token; - [SyntaxKind.QuestionDotToken]: Token; - [SyntaxKind.LessThanToken]: Token; - [SyntaxKind.LessThanSlashToken]: Token; - [SyntaxKind.GreaterThanToken]: Token; - [SyntaxKind.LessThanEqualsToken]: Token; - [SyntaxKind.GreaterThanEqualsToken]: Token; - [SyntaxKind.EqualsEqualsToken]: Token; - [SyntaxKind.ExclamationEqualsToken]: Token; - [SyntaxKind.EqualsEqualsEqualsToken]: Token; - [SyntaxKind.ExclamationEqualsEqualsToken]: Token; - [SyntaxKind.EqualsGreaterThanToken]: Token; - [SyntaxKind.PlusToken]: Token; - [SyntaxKind.MinusToken]: Token; - [SyntaxKind.AsteriskToken]: Token; - [SyntaxKind.AsteriskAsteriskToken]: Token; - [SyntaxKind.SlashToken]: Token; - [SyntaxKind.PercentToken]: Token; - [SyntaxKind.PlusPlusToken]: Token; - [SyntaxKind.MinusMinusToken]: Token; - [SyntaxKind.LessThanLessThanToken]: Token; - [SyntaxKind.GreaterThanGreaterThanToken]: Token; - [SyntaxKind.GreaterThanGreaterThanGreaterThanToken]: Token; - [SyntaxKind.AmpersandToken]: Token; - [SyntaxKind.BarToken]: Token; - [SyntaxKind.CaretToken]: Token; - [SyntaxKind.ExclamationToken]: Token; - [SyntaxKind.TildeToken]: Token; - [SyntaxKind.AmpersandAmpersandToken]: Token; - [SyntaxKind.BarBarToken]: Token; - [SyntaxKind.QuestionToken]: Token; - [SyntaxKind.ColonToken]: Token; - [SyntaxKind.AtToken]: Token; - [SyntaxKind.QuestionQuestionToken]: Token; - [SyntaxKind.BacktickToken]: Token; - [SyntaxKind.HashToken]: Token; - [SyntaxKind.EqualsToken]: Token; - [SyntaxKind.PlusEqualsToken]: Token; - [SyntaxKind.MinusEqualsToken]: Token; - [SyntaxKind.AsteriskEqualsToken]: Token; - [SyntaxKind.AsteriskAsteriskEqualsToken]: Token; - [SyntaxKind.SlashEqualsToken]: Token; - [SyntaxKind.PercentEqualsToken]: Token; - [SyntaxKind.LessThanLessThanEqualsToken]: Token; - [SyntaxKind.GreaterThanGreaterThanEqualsToken]: Token; - [SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken]: Token; - [SyntaxKind.AmpersandEqualsToken]: Token; - [SyntaxKind.BarEqualsToken]: Token; - [SyntaxKind.BarBarEqualsToken]: Token; - [SyntaxKind.AmpersandAmpersandEqualsToken]: Token; - [SyntaxKind.QuestionQuestionEqualsToken]: Token; - [SyntaxKind.CaretEqualsToken]: Token; - [SyntaxKind.Identifier]: Identifier; - [SyntaxKind.PrivateIdentifier]: PrivateIdentifier; - [SyntaxKind.JSDocCommentTextToken]: never; - [SyntaxKind.BreakKeyword]: Token; - [SyntaxKind.CaseKeyword]: Token; - [SyntaxKind.CatchKeyword]: Token; - [SyntaxKind.ClassKeyword]: Token; - [SyntaxKind.ConstKeyword]: Token; - [SyntaxKind.ContinueKeyword]: Token; - [SyntaxKind.DebuggerKeyword]: Token; - [SyntaxKind.DefaultKeyword]: Token; - [SyntaxKind.DeleteKeyword]: Token; - [SyntaxKind.DoKeyword]: Token; - [SyntaxKind.ElseKeyword]: Token; - [SyntaxKind.EnumKeyword]: Token; - [SyntaxKind.ExportKeyword]: Token; - [SyntaxKind.ExtendsKeyword]: Token; - [SyntaxKind.FalseKeyword]: FalseLiteral; - [SyntaxKind.FinallyKeyword]: Token; - [SyntaxKind.ForKeyword]: Token; - [SyntaxKind.FunctionKeyword]: Token; - [SyntaxKind.IfKeyword]: Token; - [SyntaxKind.ImportKeyword]: ImportExpression; - [SyntaxKind.InKeyword]: Token; - [SyntaxKind.InstanceOfKeyword]: Token; - [SyntaxKind.NewKeyword]: Token; - [SyntaxKind.NullKeyword]: NullLiteral; - [SyntaxKind.ReturnKeyword]: Token; - [SyntaxKind.SuperKeyword]: SuperExpression; - [SyntaxKind.SwitchKeyword]: Token; - [SyntaxKind.ThisKeyword]: ThisExpression; - [SyntaxKind.ThrowKeyword]: Token; - [SyntaxKind.TrueKeyword]: TrueLiteral; - [SyntaxKind.TryKeyword]: Token; - [SyntaxKind.TypeOfKeyword]: Token; - [SyntaxKind.VarKeyword]: Token; - [SyntaxKind.VoidKeyword]: Token; - [SyntaxKind.WhileKeyword]: Token; - [SyntaxKind.WithKeyword]: Token; - [SyntaxKind.ImplementsKeyword]: Token; - [SyntaxKind.InterfaceKeyword]: Token; - [SyntaxKind.LetKeyword]: Token; - [SyntaxKind.PackageKeyword]: Token; - [SyntaxKind.PrivateKeyword]: Token; - [SyntaxKind.ProtectedKeyword]: Token; - [SyntaxKind.PublicKeyword]: Token; - [SyntaxKind.StaticKeyword]: Token; - [SyntaxKind.YieldKeyword]: Token; - [SyntaxKind.AbstractKeyword]: Token; - [SyntaxKind.AccessorKeyword]: Token; - [SyntaxKind.AsKeyword]: Token; - [SyntaxKind.AssertsKeyword]: Token; - [SyntaxKind.AssertKeyword]: Token; - [SyntaxKind.AnyKeyword]: Token; - [SyntaxKind.AsyncKeyword]: Token; - [SyntaxKind.AwaitKeyword]: Token; - [SyntaxKind.BooleanKeyword]: Token; - [SyntaxKind.ConstructorKeyword]: Token; - [SyntaxKind.DeclareKeyword]: Token; - [SyntaxKind.GetKeyword]: Token; - [SyntaxKind.InferKeyword]: Token; - [SyntaxKind.IntrinsicKeyword]: Token; - [SyntaxKind.IsKeyword]: Token; - [SyntaxKind.KeyOfKeyword]: Token; - [SyntaxKind.ModuleKeyword]: Token; - [SyntaxKind.NamespaceKeyword]: Token; - [SyntaxKind.NeverKeyword]: Token; - [SyntaxKind.OutKeyword]: Token; - [SyntaxKind.ReadonlyKeyword]: Token; - [SyntaxKind.RequireKeyword]: Token; - [SyntaxKind.NumberKeyword]: Token; - [SyntaxKind.ObjectKeyword]: Token; - [SyntaxKind.SatisfiesKeyword]: Token; - [SyntaxKind.SetKeyword]: Token; - [SyntaxKind.StringKeyword]: Token; - [SyntaxKind.SymbolKeyword]: Token; - [SyntaxKind.TypeKeyword]: Token; - [SyntaxKind.UndefinedKeyword]: Token; - [SyntaxKind.UniqueKeyword]: Token; - [SyntaxKind.UnknownKeyword]: Token; - [SyntaxKind.UsingKeyword]: Token; - [SyntaxKind.FromKeyword]: Token; - [SyntaxKind.GlobalKeyword]: Token; - [SyntaxKind.BigIntKeyword]: Token; - [SyntaxKind.OverrideKeyword]: Token; - [SyntaxKind.OfKeyword]: Token; - [SyntaxKind.QualifiedName]: QualifiedName; - [SyntaxKind.ComputedPropertyName]: ComputedPropertyName; - [SyntaxKind.Decorator]: Decorator; - [SyntaxKind.TypeParameter]: TypeParameterDeclaration; - [SyntaxKind.CallSignature]: CallSignatureDeclaration; - [SyntaxKind.ConstructSignature]: ConstructSignatureDeclaration; - [SyntaxKind.VariableDeclaration]: VariableDeclaration; - [SyntaxKind.VariableDeclarationList]: VariableDeclarationList; - [SyntaxKind.Parameter]: ParameterDeclaration; - [SyntaxKind.BindingElement]: BindingElement; - [SyntaxKind.PropertySignature]: PropertySignature; - [SyntaxKind.PropertyDeclaration]: PropertyDeclaration; - [SyntaxKind.PropertyAssignment]: PropertyAssignment; - [SyntaxKind.ShorthandPropertyAssignment]: ShorthandPropertyAssignment; - [SyntaxKind.SpreadAssignment]: SpreadAssignment; - [SyntaxKind.ObjectBindingPattern]: ObjectBindingPattern; - [SyntaxKind.ArrayBindingPattern]: ArrayBindingPattern; - [SyntaxKind.FunctionDeclaration]: FunctionDeclaration; - [SyntaxKind.MethodSignature]: MethodSignature; - [SyntaxKind.MethodDeclaration]: MethodDeclaration; - [SyntaxKind.Constructor]: ConstructorDeclaration; - [SyntaxKind.SemicolonClassElement]: SemicolonClassElement; - [SyntaxKind.GetAccessor]: GetAccessorDeclaration; - [SyntaxKind.SetAccessor]: SetAccessorDeclaration; - [SyntaxKind.IndexSignature]: IndexSignatureDeclaration; - [SyntaxKind.ClassStaticBlockDeclaration]: ClassStaticBlockDeclaration; - [SyntaxKind.ImportTypeAssertionContainer]: ImportTypeAssertionContainer; - [SyntaxKind.ImportType]: ImportTypeNode; - [SyntaxKind.ThisType]: ThisTypeNode; - [SyntaxKind.FunctionType]: FunctionTypeNode; - [SyntaxKind.ConstructorType]: ConstructorTypeNode; - [SyntaxKind.TypeReference]: TypeReferenceNode; - [SyntaxKind.TypePredicate]: TypePredicateNode; - [SyntaxKind.TypeQuery]: TypeQueryNode; - [SyntaxKind.TypeLiteral]: TypeLiteralNode; - [SyntaxKind.ArrayType]: ArrayTypeNode; - [SyntaxKind.TupleType]: TupleTypeNode; - [SyntaxKind.NamedTupleMember]: NamedTupleMember; - [SyntaxKind.OptionalType]: OptionalTypeNode; - [SyntaxKind.RestType]: RestTypeNode; - [SyntaxKind.UnionType]: UnionTypeNode; - [SyntaxKind.IntersectionType]: IntersectionTypeNode; - [SyntaxKind.ConditionalType]: ConditionalTypeNode; - [SyntaxKind.InferType]: InferTypeNode; - [SyntaxKind.ParenthesizedType]: ParenthesizedTypeNode; - [SyntaxKind.TypeOperator]: TypeOperatorNode; - [SyntaxKind.IndexedAccessType]: IndexedAccessTypeNode; - [SyntaxKind.MappedType]: MappedTypeNode; - [SyntaxKind.LiteralType]: LiteralTypeNode; - [SyntaxKind.TemplateLiteralType]: TemplateLiteralTypeNode; - [SyntaxKind.TemplateLiteralTypeSpan]: TemplateLiteralTypeSpan; - [SyntaxKind.OmittedExpression]: OmittedExpression; - [SyntaxKind.PrefixUnaryExpression]: PrefixUnaryExpression; - [SyntaxKind.PostfixUnaryExpression]: PostfixUnaryExpression; - [SyntaxKind.DeleteExpression]: DeleteExpression; - [SyntaxKind.TypeOfExpression]: TypeOfExpression; - [SyntaxKind.VoidExpression]: VoidExpression; - [SyntaxKind.AwaitExpression]: AwaitExpression; - [SyntaxKind.YieldExpression]: YieldExpression; - [SyntaxKind.BinaryExpression]: BinaryExpression; - [SyntaxKind.ConditionalExpression]: ConditionalExpression; - [SyntaxKind.FunctionExpression]: FunctionExpression; - [SyntaxKind.ArrowFunction]: ArrowFunction; - [SyntaxKind.TemplateExpression]: TemplateExpression; - [SyntaxKind.TemplateSpan]: TemplateSpan; - [SyntaxKind.ParenthesizedExpression]: ParenthesizedExpression; - [SyntaxKind.ArrayLiteralExpression]: ArrayLiteralExpression; - [SyntaxKind.SpreadElement]: SpreadElement; - [SyntaxKind.ObjectLiteralExpression]: ObjectLiteralExpression; - [SyntaxKind.PropertyAccessExpression]: PropertyAccessExpression; - [SyntaxKind.ElementAccessExpression]: ElementAccessExpression; - [SyntaxKind.CallExpression]: CallExpression; - [SyntaxKind.ExpressionWithTypeArguments]: ExpressionWithTypeArguments; - [SyntaxKind.NewExpression]: NewExpression; - [SyntaxKind.TaggedTemplateExpression]: TaggedTemplateExpression; - [SyntaxKind.AsExpression]: AsExpression; - [SyntaxKind.TypeAssertionExpression]: TypeAssertion; - [SyntaxKind.SyntheticExpression]: SyntheticExpression; - [SyntaxKind.SatisfiesExpression]: SatisfiesExpression; - [SyntaxKind.NonNullExpression]: NonNullExpression; - [SyntaxKind.MetaProperty]: MetaProperty; - [SyntaxKind.JsxElement]: JsxElement; - [SyntaxKind.JsxAttributes]: JsxAttributes; - [SyntaxKind.JsxNamespacedName]: JsxNamespacedName; - [SyntaxKind.JsxOpeningElement]: JsxOpeningElement; - [SyntaxKind.JsxSelfClosingElement]: JsxSelfClosingElement; - [SyntaxKind.JsxFragment]: JsxFragment; - [SyntaxKind.JsxOpeningFragment]: JsxOpeningFragment; - [SyntaxKind.JsxClosingFragment]: JsxClosingFragment; - [SyntaxKind.JsxAttribute]: JsxAttribute; - [SyntaxKind.JsxSpreadAttribute]: JsxSpreadAttribute; - [SyntaxKind.JsxClosingElement]: JsxClosingElement; - [SyntaxKind.JsxExpression]: JsxExpression; - [SyntaxKind.EmptyStatement]: EmptyStatement; - [SyntaxKind.DebuggerStatement]: DebuggerStatement; - [SyntaxKind.MissingDeclaration]: MissingDeclaration; - [SyntaxKind.Block]: Block; - [SyntaxKind.VariableStatement]: VariableStatement; - [SyntaxKind.ExpressionStatement]: ExpressionStatement; - [SyntaxKind.IfStatement]: IfStatement; - [SyntaxKind.DoStatement]: DoStatement; - [SyntaxKind.WhileStatement]: WhileStatement; - [SyntaxKind.ForStatement]: ForStatement; - [SyntaxKind.ForInStatement]: ForInStatement; - [SyntaxKind.ForOfStatement]: ForOfStatement; - [SyntaxKind.BreakStatement]: BreakStatement; - [SyntaxKind.ContinueStatement]: ContinueStatement; - [SyntaxKind.ReturnStatement]: ReturnStatement; - [SyntaxKind.WithStatement]: WithStatement; - [SyntaxKind.SwitchStatement]: SwitchStatement; - [SyntaxKind.CaseBlock]: CaseBlock; - [SyntaxKind.CaseClause]: CaseClause; - [SyntaxKind.DefaultClause]: DefaultClause; - [SyntaxKind.LabeledStatement]: LabeledStatement; - [SyntaxKind.ThrowStatement]: ThrowStatement; - [SyntaxKind.TryStatement]: TryStatement; - [SyntaxKind.CatchClause]: CatchClause; - [SyntaxKind.ClassDeclaration]: ClassDeclaration; - [SyntaxKind.ClassExpression]: ClassExpression; - [SyntaxKind.InterfaceDeclaration]: InterfaceDeclaration; - [SyntaxKind.HeritageClause]: HeritageClause; - [SyntaxKind.TypeAliasDeclaration]: TypeAliasDeclaration; - [SyntaxKind.EnumMember]: EnumMember; - [SyntaxKind.EnumDeclaration]: EnumDeclaration; - [SyntaxKind.ModuleDeclaration]: ModuleDeclaration; - [SyntaxKind.ModuleBlock]: ModuleBlock; - [SyntaxKind.ImportEqualsDeclaration]: ImportEqualsDeclaration; - [SyntaxKind.ExternalModuleReference]: ExternalModuleReference; - [SyntaxKind.ImportDeclaration]: ImportDeclaration; - [SyntaxKind.ImportClause]: ImportClause; - [SyntaxKind.ImportAttribute]: ImportAttribute; - [SyntaxKind.ImportAttributes]: ImportAttributes; - [SyntaxKind.NamespaceImport]: NamespaceImport; - [SyntaxKind.NamespaceExport]: NamespaceExport; - [SyntaxKind.NamespaceExportDeclaration]: NamespaceExportDeclaration; - [SyntaxKind.ExportDeclaration]: ExportDeclaration; - [SyntaxKind.NamedImports]: NamedImports; - [SyntaxKind.NamedExports]: NamedExports; - [SyntaxKind.ImportSpecifier]: ImportSpecifier; - [SyntaxKind.ExportSpecifier]: ExportSpecifier; - [SyntaxKind.ExportAssignment]: ExportAssignment; - [SyntaxKind.JSDocTypeExpression]: JSDocTypeExpression; - [SyntaxKind.JSDocNameReference]: JSDocNameReference; - [SyntaxKind.JSDocMemberName]: JSDocMemberName; - [SyntaxKind.JSDocAllType]: JSDocAllType; - [SyntaxKind.JSDocUnknownType]: JSDocUnknownType; - [SyntaxKind.JSDocNonNullableType]: JSDocNonNullableType; - [SyntaxKind.JSDocNullableType]: JSDocNullableType; - [SyntaxKind.JSDocOptionalType]: JSDocOptionalType; - [SyntaxKind.JSDocFunctionType]: JSDocFunctionType; - [SyntaxKind.JSDocVariadicType]: JSDocVariadicType; - [SyntaxKind.JSDocNamepathType]: JSDocNamepathType; - [SyntaxKind.JSDoc]: JSDoc; - [SyntaxKind.JSDocLink]: JSDocLink; - [SyntaxKind.JSDocLinkCode]: JSDocLinkCode; - [SyntaxKind.JSDocLinkPlain]: JSDocLinkPlain; - [SyntaxKind.JSDocText]: JSDocText; - [SyntaxKind.JSDocTag]: JSDocUnknownTag; - [SyntaxKind.JSDocAugmentsTag]: JSDocAugmentsTag; - [SyntaxKind.JSDocImplementsTag]: JSDocImplementsTag; - [SyntaxKind.JSDocAuthorTag]: JSDocAuthorTag; - [SyntaxKind.JSDocDeprecatedTag]: JSDocDeprecatedTag; - [SyntaxKind.JSDocClassTag]: JSDocClassTag; - [SyntaxKind.JSDocPublicTag]: JSDocPublicTag; - [SyntaxKind.JSDocPrivateTag]: JSDocPrivateTag; - [SyntaxKind.JSDocProtectedTag]: JSDocProtectedTag; - [SyntaxKind.JSDocReadonlyTag]: JSDocReadonlyTag; - [SyntaxKind.JSDocOverrideTag]: JSDocOverrideTag; - [SyntaxKind.JSDocEnumTag]: JSDocEnumTag; - [SyntaxKind.JSDocThisTag]: JSDocThisTag; - [SyntaxKind.JSDocTemplateTag]: JSDocTemplateTag; - [SyntaxKind.JSDocSeeTag]: JSDocSeeTag; - [SyntaxKind.JSDocReturnTag]: JSDocReturnTag; - [SyntaxKind.JSDocTypeTag]: JSDocTypeTag; - [SyntaxKind.JSDocTypedefTag]: JSDocTypedefTag; - [SyntaxKind.JSDocCallbackTag]: JSDocCallbackTag; - [SyntaxKind.JSDocOverloadTag]: JSDocOverloadTag; - [SyntaxKind.JSDocThrowsTag]: JSDocThrowsTag; - [SyntaxKind.JSDocSignature]: JSDocSignature; - [SyntaxKind.JSDocPropertyTag]: JSDocPropertyTag; - [SyntaxKind.JSDocParameterTag]: JSDocParameterTag; - [SyntaxKind.JSDocTypeLiteral]: JSDocTypeLiteral; - [SyntaxKind.JSDocSatisfiesTag]: JSDocSatisfiesTag; - [SyntaxKind.JSDocImportTag]: JSDocImportTag; - [SyntaxKind.SourceFile]: SourceFile; - [SyntaxKind.Bundle]: Bundle; - [SyntaxKind.SyntaxList]: SyntaxList; - [SyntaxKind.NotEmittedStatement]: NotEmittedStatement; - [SyntaxKind.NotEmittedTypeElement]: NotEmittedTypeElement; - [SyntaxKind.PartiallyEmittedExpression]: PartiallyEmittedExpression; - [SyntaxKind.CommaListExpression]: CommaListExpression; - [SyntaxKind.SyntheticReferenceExpression]: SyntheticReferenceExpression; - [SyntaxKind.Count]: never; - [SyntaxKind.NonTextFileMarkerTrivia]: never; -} - -/** @internal @knipignore */ -export interface AstNodeType { - [SyntaxKind.Unknown]: AstToken; - [SyntaxKind.EndOfFileToken]: AstEndOfFileToken; - [SyntaxKind.SingleLineCommentTrivia]: AstToken; - [SyntaxKind.MultiLineCommentTrivia]: AstToken; - [SyntaxKind.NewLineTrivia]: AstToken; - [SyntaxKind.WhitespaceTrivia]: AstToken; - [SyntaxKind.ShebangTrivia]: AstToken; - [SyntaxKind.ConflictMarkerTrivia]: AstToken; - [SyntaxKind.NonTextFileMarkerTrivia]: never; - [SyntaxKind.NumericLiteral]: AstNumericLiteral; - [SyntaxKind.BigIntLiteral]: AstBigIntLiteral; - [SyntaxKind.StringLiteral]: AstStringLiteral; - [SyntaxKind.JsxText]: AstJsxText; - [SyntaxKind.JsxTextAllWhiteSpaces]: never; - [SyntaxKind.RegularExpressionLiteral]: AstRegularExpressionLiteral; - [SyntaxKind.NoSubstitutionTemplateLiteral]: AstNoSubstitutionTemplateLiteral; - [SyntaxKind.TemplateHead]: AstTemplateHead; - [SyntaxKind.TemplateMiddle]: AstTemplateMiddle; - [SyntaxKind.TemplateTail]: AstTemplateTail; - [SyntaxKind.OpenBraceToken]: AstToken; - [SyntaxKind.CloseBraceToken]: AstToken; - [SyntaxKind.OpenParenToken]: AstToken; - [SyntaxKind.CloseParenToken]: AstToken; - [SyntaxKind.OpenBracketToken]: AstToken; - [SyntaxKind.CloseBracketToken]: AstToken; - [SyntaxKind.DotToken]: AstDotToken; - [SyntaxKind.DotDotDotToken]: AstDotDotDotToken; - [SyntaxKind.SemicolonToken]: AstToken; - [SyntaxKind.CommaToken]: AstToken; - [SyntaxKind.QuestionDotToken]: AstQuestionDotToken; - [SyntaxKind.LessThanToken]: AstToken; - [SyntaxKind.LessThanSlashToken]: AstToken; - [SyntaxKind.GreaterThanToken]: AstToken; - [SyntaxKind.LessThanEqualsToken]: AstToken; - [SyntaxKind.GreaterThanEqualsToken]: AstToken; - [SyntaxKind.EqualsEqualsToken]: AstToken; - [SyntaxKind.ExclamationEqualsToken]: AstToken; - [SyntaxKind.EqualsEqualsEqualsToken]: AstToken; - [SyntaxKind.ExclamationEqualsEqualsToken]: AstToken; - [SyntaxKind.EqualsGreaterThanToken]: AstEqualsGreaterThanToken; - [SyntaxKind.PlusToken]: AstPlusToken; - [SyntaxKind.MinusToken]: AstMinusToken; - [SyntaxKind.AsteriskToken]: AstAsteriskToken; - [SyntaxKind.AsteriskAsteriskToken]: AstToken; - [SyntaxKind.SlashToken]: AstToken; - [SyntaxKind.PercentToken]: AstToken; - [SyntaxKind.PlusPlusToken]: AstToken; - [SyntaxKind.MinusMinusToken]: AstToken; - [SyntaxKind.LessThanLessThanToken]: AstToken; - [SyntaxKind.GreaterThanGreaterThanToken]: AstToken; - [SyntaxKind.GreaterThanGreaterThanGreaterThanToken]: AstToken; - [SyntaxKind.AmpersandToken]: AstToken; - [SyntaxKind.BarToken]: AstToken; - [SyntaxKind.CaretToken]: AstToken; - [SyntaxKind.ExclamationToken]: AstExclamationToken; - [SyntaxKind.TildeToken]: AstToken; - [SyntaxKind.AmpersandAmpersandToken]: AstToken; - [SyntaxKind.BarBarToken]: AstToken; - [SyntaxKind.QuestionToken]: AstQuestionToken; - [SyntaxKind.ColonToken]: AstColonToken; - [SyntaxKind.AtToken]: AstToken; - [SyntaxKind.QuestionQuestionToken]: AstToken; - [SyntaxKind.BacktickToken]: AstToken; - [SyntaxKind.HashToken]: AstToken; - [SyntaxKind.EqualsToken]: AstEqualsToken; - [SyntaxKind.PlusEqualsToken]: AstToken; - [SyntaxKind.MinusEqualsToken]: AstToken; - [SyntaxKind.AsteriskEqualsToken]: AstToken; - [SyntaxKind.AsteriskAsteriskEqualsToken]: AstToken; - [SyntaxKind.SlashEqualsToken]: AstToken; - [SyntaxKind.PercentEqualsToken]: AstToken; - [SyntaxKind.LessThanLessThanEqualsToken]: AstToken; - [SyntaxKind.GreaterThanGreaterThanEqualsToken]: AstToken; - [SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken]: AstToken; - [SyntaxKind.AmpersandEqualsToken]: AstToken; - [SyntaxKind.BarEqualsToken]: AstToken; - [SyntaxKind.BarBarEqualsToken]: AstBarBarEqualsToken; - [SyntaxKind.AmpersandAmpersandEqualsToken]: AstAmpersandAmpersandEqualsToken; - [SyntaxKind.QuestionQuestionEqualsToken]: AstQuestionQuestionEqualsToken; - [SyntaxKind.CaretEqualsToken]: AstToken; - [SyntaxKind.Identifier]: AstIdentifier; - [SyntaxKind.PrivateIdentifier]: AstPrivateIdentifier; - [SyntaxKind.JSDocCommentTextToken]: never; - [SyntaxKind.BreakKeyword]: AstToken; - [SyntaxKind.CaseKeyword]: AstCaseKeyword; - [SyntaxKind.CatchKeyword]: AstToken; - [SyntaxKind.ClassKeyword]: AstToken; - [SyntaxKind.ConstKeyword]: AstToken; - [SyntaxKind.ContinueKeyword]: AstToken; - [SyntaxKind.DebuggerKeyword]: AstToken; - [SyntaxKind.DefaultKeyword]: AstDefaultKeyword; - [SyntaxKind.DeleteKeyword]: AstToken; - [SyntaxKind.DoKeyword]: AstToken; - [SyntaxKind.ElseKeyword]: AstToken; - [SyntaxKind.EnumKeyword]: AstToken; - [SyntaxKind.ExportKeyword]: AstExportKeyword; - [SyntaxKind.ExtendsKeyword]: AstToken; - [SyntaxKind.FalseKeyword]: AstFalseLiteral; - [SyntaxKind.FinallyKeyword]: AstToken; - [SyntaxKind.ForKeyword]: AstToken; - [SyntaxKind.FunctionKeyword]: AstToken; - [SyntaxKind.IfKeyword]: AstToken; - [SyntaxKind.ImportKeyword]: AstImportExpression; - [SyntaxKind.InKeyword]: AstInKeyword; - [SyntaxKind.InstanceOfKeyword]: AstToken; - [SyntaxKind.NewKeyword]: AstToken; - [SyntaxKind.NullKeyword]: AstNullLiteral; - [SyntaxKind.ReturnKeyword]: AstToken; - [SyntaxKind.SuperKeyword]: AstSuperExpression; - [SyntaxKind.SwitchKeyword]: AstToken; - [SyntaxKind.ThisKeyword]: AstThisExpression; - [SyntaxKind.ThrowKeyword]: AstToken; - [SyntaxKind.TrueKeyword]: AstTrueLiteral; - [SyntaxKind.TryKeyword]: AstToken; - [SyntaxKind.TypeOfKeyword]: AstToken; - [SyntaxKind.VarKeyword]: AstToken; - [SyntaxKind.VoidKeyword]: AstToken; - [SyntaxKind.WhileKeyword]: AstToken; - [SyntaxKind.WithKeyword]: AstToken; - [SyntaxKind.ImplementsKeyword]: AstToken; - [SyntaxKind.InterfaceKeyword]: AstToken; - [SyntaxKind.LetKeyword]: AstToken; - [SyntaxKind.PackageKeyword]: AstToken; - [SyntaxKind.PrivateKeyword]: AstPrivateKeyword; - [SyntaxKind.ProtectedKeyword]: AstProtectedKeyword; - [SyntaxKind.PublicKeyword]: AstPublicKeyword; - [SyntaxKind.StaticKeyword]: AstStaticKeyword; - [SyntaxKind.YieldKeyword]: AstToken; - [SyntaxKind.AbstractKeyword]: AstAbstractKeyword; - [SyntaxKind.AccessorKeyword]: AstAccessorKeyword; - [SyntaxKind.AsKeyword]: AstToken; - [SyntaxKind.AssertsKeyword]: AstAssertsKeyword; - [SyntaxKind.AssertKeyword]: AstAssertKeyword; - [SyntaxKind.AnyKeyword]: AstToken; - [SyntaxKind.AsyncKeyword]: AstAsyncKeyword; - [SyntaxKind.AwaitKeyword]: AstAwaitKeyword; - [SyntaxKind.BooleanKeyword]: AstToken; - [SyntaxKind.ConstructorKeyword]: AstToken; - [SyntaxKind.DeclareKeyword]: AstDeclareKeyword; - [SyntaxKind.GetKeyword]: AstToken; - [SyntaxKind.InferKeyword]: AstToken; - [SyntaxKind.IntrinsicKeyword]: AstToken; - [SyntaxKind.IsKeyword]: AstToken; - [SyntaxKind.KeyOfKeyword]: AstToken; - [SyntaxKind.ModuleKeyword]: AstToken; - [SyntaxKind.NamespaceKeyword]: AstToken; - [SyntaxKind.NeverKeyword]: AstToken; - [SyntaxKind.OutKeyword]: AstOutKeyword; - [SyntaxKind.ReadonlyKeyword]: AstReadonlyKeyword; - [SyntaxKind.RequireKeyword]: AstToken; - [SyntaxKind.NumberKeyword]: AstToken; - [SyntaxKind.ObjectKeyword]: AstToken; - [SyntaxKind.SatisfiesKeyword]: AstToken; - [SyntaxKind.SetKeyword]: AstToken; - [SyntaxKind.StringKeyword]: AstToken; - [SyntaxKind.SymbolKeyword]: AstToken; - [SyntaxKind.TypeKeyword]: AstToken; - [SyntaxKind.UndefinedKeyword]: AstToken; - [SyntaxKind.UniqueKeyword]: AstToken; - [SyntaxKind.UnknownKeyword]: AstToken; - [SyntaxKind.UsingKeyword]: AstToken; - [SyntaxKind.FromKeyword]: AstToken; - [SyntaxKind.GlobalKeyword]: AstToken; - [SyntaxKind.BigIntKeyword]: AstToken; - [SyntaxKind.OverrideKeyword]: AstOverrideKeyword; - [SyntaxKind.OfKeyword]: AstToken; - [SyntaxKind.QualifiedName]: AstQualifiedName; - [SyntaxKind.ComputedPropertyName]: AstComputedPropertyName; - [SyntaxKind.Decorator]: AstDecorator; - [SyntaxKind.TypeParameter]: AstTypeParameterDeclaration; - [SyntaxKind.CallSignature]: AstCallSignatureDeclaration; - [SyntaxKind.ConstructSignature]: AstConstructSignatureDeclaration; - [SyntaxKind.VariableDeclaration]: AstVariableDeclaration; - [SyntaxKind.VariableDeclarationList]: AstVariableDeclarationList; - [SyntaxKind.Parameter]: AstParameterDeclaration; - [SyntaxKind.BindingElement]: AstBindingElement; - [SyntaxKind.PropertySignature]: AstPropertySignature; - [SyntaxKind.PropertyDeclaration]: AstPropertyDeclaration; - [SyntaxKind.PropertyAssignment]: AstPropertyAssignment; - [SyntaxKind.ShorthandPropertyAssignment]: AstShorthandPropertyAssignment; - [SyntaxKind.SpreadAssignment]: AstSpreadAssignment; - [SyntaxKind.ObjectBindingPattern]: AstObjectBindingPattern; - [SyntaxKind.ArrayBindingPattern]: AstArrayBindingPattern; - [SyntaxKind.FunctionDeclaration]: AstFunctionDeclaration; - [SyntaxKind.MethodSignature]: AstMethodSignature; - [SyntaxKind.MethodDeclaration]: AstMethodDeclaration; - [SyntaxKind.Constructor]: AstConstructorDeclaration; - [SyntaxKind.SemicolonClassElement]: AstSemicolonClassElement; - [SyntaxKind.GetAccessor]: AstGetAccessorDeclaration; - [SyntaxKind.SetAccessor]: AstSetAccessorDeclaration; - [SyntaxKind.IndexSignature]: AstIndexSignatureDeclaration; - [SyntaxKind.ClassStaticBlockDeclaration]: AstClassStaticBlockDeclaration; - [SyntaxKind.ImportTypeAssertionContainer]: AstImportTypeAssertionContainer; - [SyntaxKind.ImportType]: AstImportTypeNode; - [SyntaxKind.ThisType]: AstThisTypeNode; - [SyntaxKind.FunctionType]: AstFunctionTypeNode; - [SyntaxKind.ConstructorType]: AstConstructorTypeNode; - [SyntaxKind.TypeReference]: AstTypeReferenceNode; - [SyntaxKind.TypePredicate]: AstTypePredicateNode; - [SyntaxKind.TypeQuery]: AstTypeQueryNode; - [SyntaxKind.TypeLiteral]: AstTypeLiteralNode; - [SyntaxKind.ArrayType]: AstArrayTypeNode; - [SyntaxKind.TupleType]: AstTupleTypeNode; - [SyntaxKind.NamedTupleMember]: AstNamedTupleMember; - [SyntaxKind.OptionalType]: AstOptionalTypeNode; - [SyntaxKind.RestType]: AstRestTypeNode; - [SyntaxKind.UnionType]: AstUnionTypeNode; - [SyntaxKind.IntersectionType]: AstIntersectionTypeNode; - [SyntaxKind.ConditionalType]: AstConditionalTypeNode; - [SyntaxKind.InferType]: AstInferTypeNode; - [SyntaxKind.ParenthesizedType]: AstParenthesizedTypeNode; - [SyntaxKind.TypeOperator]: AstTypeOperatorNode; - [SyntaxKind.IndexedAccessType]: AstIndexedAccessTypeNode; - [SyntaxKind.MappedType]: AstMappedTypeNode; - [SyntaxKind.LiteralType]: AstLiteralTypeNode; - [SyntaxKind.TemplateLiteralType]: AstTemplateLiteralTypeNode; - [SyntaxKind.TemplateLiteralTypeSpan]: AstTemplateLiteralTypeSpan; - [SyntaxKind.OmittedExpression]: AstOmittedExpression; - [SyntaxKind.PrefixUnaryExpression]: AstPrefixUnaryExpression; - [SyntaxKind.PostfixUnaryExpression]: AstPostfixUnaryExpression; - [SyntaxKind.DeleteExpression]: AstDeleteExpression; - [SyntaxKind.TypeOfExpression]: AstTypeOfExpression; - [SyntaxKind.VoidExpression]: AstVoidExpression; - [SyntaxKind.AwaitExpression]: AstAwaitExpression; - [SyntaxKind.YieldExpression]: AstYieldExpression; - [SyntaxKind.BinaryExpression]: AstBinaryExpression; - [SyntaxKind.ConditionalExpression]: AstConditionalExpression; - [SyntaxKind.FunctionExpression]: AstFunctionExpression; - [SyntaxKind.ArrowFunction]: AstArrowFunction; - [SyntaxKind.TemplateExpression]: AstTemplateExpression; - [SyntaxKind.TemplateSpan]: AstTemplateSpan; - [SyntaxKind.ParenthesizedExpression]: AstParenthesizedExpression; - [SyntaxKind.ArrayLiteralExpression]: AstArrayLiteralExpression; - [SyntaxKind.SpreadElement]: AstSpreadElement; - [SyntaxKind.ObjectLiteralExpression]: AstObjectLiteralExpression; - [SyntaxKind.PropertyAccessExpression]: AstPropertyAccessExpression; - [SyntaxKind.ElementAccessExpression]: AstElementAccessExpression; - [SyntaxKind.CallExpression]: AstCallExpression; - [SyntaxKind.ExpressionWithTypeArguments]: AstExpressionWithTypeArguments; - [SyntaxKind.NewExpression]: AstNewExpression; - [SyntaxKind.TaggedTemplateExpression]: AstTaggedTemplateExpression; - [SyntaxKind.AsExpression]: AstAsExpression; - [SyntaxKind.TypeAssertionExpression]: AstTypeAssertion; - [SyntaxKind.SyntheticExpression]: AstSyntheticExpression; - [SyntaxKind.SatisfiesExpression]: AstSatisfiesExpression; - [SyntaxKind.NonNullExpression]: AstNonNullExpression; - [SyntaxKind.MetaProperty]: AstMetaProperty; - [SyntaxKind.JsxElement]: AstJsxElement; - [SyntaxKind.JsxAttributes]: AstJsxAttributes; - [SyntaxKind.JsxNamespacedName]: AstJsxNamespacedName; - [SyntaxKind.JsxOpeningElement]: AstJsxOpeningElement; - [SyntaxKind.JsxSelfClosingElement]: AstJsxSelfClosingElement; - [SyntaxKind.JsxFragment]: AstJsxFragment; - [SyntaxKind.JsxOpeningFragment]: AstJsxOpeningFragment; - [SyntaxKind.JsxClosingFragment]: AstJsxClosingFragment; - [SyntaxKind.JsxAttribute]: AstJsxAttribute; - [SyntaxKind.JsxSpreadAttribute]: AstJsxSpreadAttribute; - [SyntaxKind.JsxClosingElement]: AstJsxClosingElement; - [SyntaxKind.JsxExpression]: AstJsxExpression; - [SyntaxKind.EmptyStatement]: AstEmptyStatement; - [SyntaxKind.DebuggerStatement]: AstDebuggerStatement; - [SyntaxKind.MissingDeclaration]: AstMissingDeclaration; - [SyntaxKind.Block]: AstBlock; - [SyntaxKind.VariableStatement]: AstVariableStatement; - [SyntaxKind.ExpressionStatement]: AstExpressionStatement; - [SyntaxKind.IfStatement]: AstIfStatement; - [SyntaxKind.DoStatement]: AstDoStatement; - [SyntaxKind.WhileStatement]: AstWhileStatement; - [SyntaxKind.ForStatement]: AstForStatement; - [SyntaxKind.ForInStatement]: AstForInStatement; - [SyntaxKind.ForOfStatement]: AstForOfStatement; - [SyntaxKind.BreakStatement]: AstBreakStatement; - [SyntaxKind.ContinueStatement]: AstContinueStatement; - [SyntaxKind.ReturnStatement]: AstReturnStatement; - [SyntaxKind.WithStatement]: AstWithStatement; - [SyntaxKind.SwitchStatement]: AstSwitchStatement; - [SyntaxKind.CaseBlock]: AstCaseBlock; - [SyntaxKind.CaseClause]: AstCaseClause; - [SyntaxKind.DefaultClause]: AstDefaultClause; - [SyntaxKind.LabeledStatement]: AstLabeledStatement; - [SyntaxKind.ThrowStatement]: AstThrowStatement; - [SyntaxKind.TryStatement]: AstTryStatement; - [SyntaxKind.CatchClause]: AstCatchClause; - [SyntaxKind.ClassDeclaration]: AstClassDeclaration; - [SyntaxKind.ClassExpression]: AstClassExpression; - [SyntaxKind.InterfaceDeclaration]: AstInterfaceDeclaration; - [SyntaxKind.HeritageClause]: AstHeritageClause; - [SyntaxKind.TypeAliasDeclaration]: AstTypeAliasDeclaration; - [SyntaxKind.EnumMember]: AstEnumMember; - [SyntaxKind.EnumDeclaration]: AstEnumDeclaration; - [SyntaxKind.ModuleDeclaration]: AstModuleDeclaration; - [SyntaxKind.ModuleBlock]: AstModuleBlock; - [SyntaxKind.ImportEqualsDeclaration]: AstImportEqualsDeclaration; - [SyntaxKind.ExternalModuleReference]: AstExternalModuleReference; - [SyntaxKind.ImportDeclaration]: AstImportDeclaration; - [SyntaxKind.ImportClause]: AstImportClause; - [SyntaxKind.ImportAttribute]: AstImportAttribute; - [SyntaxKind.ImportAttributes]: AstImportAttributes; - [SyntaxKind.NamespaceImport]: AstNamespaceImport; - [SyntaxKind.NamespaceExport]: AstNamespaceExport; - [SyntaxKind.NamespaceExportDeclaration]: AstNamespaceExportDeclaration; - [SyntaxKind.ExportDeclaration]: AstExportDeclaration; - [SyntaxKind.NamedImports]: AstNamedImports; - [SyntaxKind.NamedExports]: AstNamedExports; - [SyntaxKind.ImportSpecifier]: AstImportSpecifier; - [SyntaxKind.ExportSpecifier]: AstExportSpecifier; - [SyntaxKind.ExportAssignment]: AstExportAssignment; - [SyntaxKind.JSDocTypeExpression]: AstJSDocTypeExpression; - [SyntaxKind.JSDocNameReference]: AstJSDocNameReference; - [SyntaxKind.JSDocMemberName]: AstJSDocMemberName; - [SyntaxKind.JSDocAllType]: AstJSDocAllType; - [SyntaxKind.JSDocUnknownType]: AstJSDocUnknownType; - [SyntaxKind.JSDocNonNullableType]: AstJSDocNonNullableType; - [SyntaxKind.JSDocNullableType]: AstJSDocNullableType; - [SyntaxKind.JSDocOptionalType]: AstJSDocOptionalType; - [SyntaxKind.JSDocFunctionType]: AstJSDocFunctionType; - [SyntaxKind.JSDocVariadicType]: AstJSDocVariadicType; - [SyntaxKind.JSDocNamepathType]: AstJSDocNamepathType; - [SyntaxKind.JSDoc]: AstJSDoc; - [SyntaxKind.JSDocLink]: AstJSDocLink; - [SyntaxKind.JSDocLinkCode]: AstJSDocLinkCode; - [SyntaxKind.JSDocLinkPlain]: AstJSDocLinkPlain; - [SyntaxKind.JSDocText]: AstJSDocText; - [SyntaxKind.JSDocTag]: AstJSDocUnknownTag; - [SyntaxKind.JSDocAugmentsTag]: AstJSDocAugmentsTag; - [SyntaxKind.JSDocImplementsTag]: AstJSDocImplementsTag; - [SyntaxKind.JSDocAuthorTag]: AstJSDocAuthorTag; - [SyntaxKind.JSDocDeprecatedTag]: AstJSDocDeprecatedTag; - [SyntaxKind.JSDocClassTag]: AstJSDocClassTag; - [SyntaxKind.JSDocPublicTag]: AstJSDocPublicTag; - [SyntaxKind.JSDocPrivateTag]: AstJSDocPrivateTag; - [SyntaxKind.JSDocProtectedTag]: AstJSDocProtectedTag; - [SyntaxKind.JSDocReadonlyTag]: AstJSDocReadonlyTag; - [SyntaxKind.JSDocOverrideTag]: AstJSDocOverrideTag; - [SyntaxKind.JSDocEnumTag]: AstJSDocEnumTag; - [SyntaxKind.JSDocThisTag]: AstJSDocThisTag; - [SyntaxKind.JSDocTemplateTag]: AstJSDocTemplateTag; - [SyntaxKind.JSDocSeeTag]: AstJSDocSeeTag; - [SyntaxKind.JSDocReturnTag]: AstJSDocReturnTag; - [SyntaxKind.JSDocTypeTag]: AstJSDocTypeTag; - [SyntaxKind.JSDocTypedefTag]: AstJSDocTypedefTag; - [SyntaxKind.JSDocCallbackTag]: AstJSDocCallbackTag; - [SyntaxKind.JSDocOverloadTag]: AstJSDocOverloadTag; - [SyntaxKind.JSDocThrowsTag]: AstJSDocThrowsTag; - [SyntaxKind.JSDocSignature]: AstJSDocSignature; - [SyntaxKind.JSDocPropertyTag]: AstJSDocPropertyTag; - [SyntaxKind.JSDocParameterTag]: AstJSDocParameterTag; - [SyntaxKind.JSDocTypeLiteral]: AstJSDocTypeLiteral; - [SyntaxKind.JSDocSatisfiesTag]: AstJSDocSatisfiesTag; - [SyntaxKind.JSDocImportTag]: AstJSDocImportTag; - [SyntaxKind.SourceFile]: AstSourceFile; - [SyntaxKind.Bundle]: AstBundle; - [SyntaxKind.SyntaxList]: AstSyntaxList; - [SyntaxKind.NotEmittedStatement]: AstNotEmittedStatement; - [SyntaxKind.NotEmittedTypeElement]: AstNotEmittedTypeElement; - [SyntaxKind.PartiallyEmittedExpression]: AstPartiallyEmittedExpression; - [SyntaxKind.CommaListExpression]: AstCommaListExpression; - [SyntaxKind.SyntheticReferenceExpression]: AstSyntheticReferenceExpression; - [SyntaxKind.Count]: never; - [SyntaxKind.NonTextFileMarkerTrivia]: never; -} diff --git a/src/compiler/astForEachChild.ts b/src/compiler/astForEachChild.ts index 3bc5a3fa76a..f182752c23f 100644 --- a/src/compiler/astForEachChild.ts +++ b/src/compiler/astForEachChild.ts @@ -38,6 +38,7 @@ import { AstExpressionStatement, AstExpressionWithTypeArguments, AstExternalModuleReference, + AstForEachChildNodes, AstForInStatement, AstForOfStatement, AstForStatement, @@ -174,12 +175,8 @@ import { AstWhileStatement, AstWithStatement, AstYieldExpression, - AstForEachChildNodes -} from "./_namespaces/ts.ast.js"; -import { forEach, SyntaxKind, - isArray, } from "./_namespaces/ts.js"; function visitNode(cbNode: (node: AstNode) => T, node: AstNode | undefined): T | undefined { diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index 7f61986a80f..347970f24f5 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -120,6 +120,7 @@ import { HasFlowNode, hasJSDocNodes, HasLocals, + hasName, hasSyntacticModifier, Identifier, identifierToKeywordKind, @@ -1012,7 +1013,8 @@ function createBinder(): (file: SourceFile, options: CompilerOptions) => void { const isImmediatelyInvoked = ( containerFlags & ContainerFlags.IsFunctionExpression && !hasSyntacticModifier(node, ModifierFlags.Async) && - !(node as FunctionLikeDeclaration).asteriskToken && + // TODO(rbuckton): unchecked cast can result in wrong map deopt due to missing `asteriskToken` property + !(node as Extract).asteriskToken && !!getImmediatelyInvokedFunctionExpression(node) ) || node.kind === SyntaxKind.ClassStaticBlockDeclaration; // A non-async, non-generator IIFE is considered part of the containing control flow. Return statements behave @@ -2646,7 +2648,7 @@ function createBinder(): (file: SourceFile, options: CompilerOptions) => void { function checkStrictModeFunctionName(node: FunctionLikeDeclaration) { if (inStrictMode && !(node.flags & NodeFlags.Ambient)) { // It is a SyntaxError if the identifier eval or arguments appears within a FormalParameterList of a strict mode FunctionDeclaration or FunctionExpression (13.1)) - checkStrictModeEvalOrArguments(node, node.name); + checkStrictModeEvalOrArguments(node, isNamedDeclaration(node) ? node.name : undefined); } } @@ -3720,7 +3722,7 @@ function createBinder(): (file: SourceFile, options: CompilerOptions) => void { node.flowNode = currentFlow; } checkStrictModeFunctionName(node); - const bindingName = node.name ? node.name.escapedText : InternalSymbolName.Function; + const bindingName = hasName(node) ? node.name.escapedText : InternalSymbolName.Function; return bindAnonymousDeclaration(node, SymbolFlags.Function, bindingName); } diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 438e46eca11..47c09f9814c 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -1065,7 +1065,7 @@ import { TupleTypeReference, Type, TypeAliasDeclaration, - TypeAssertion, + TypeAssertionExpression, TypeChecker, TypeCheckerHost, TypeComparer, @@ -1121,6 +1121,10 @@ import { WideningContext, WithStatement, YieldExpression, + canHaveName, + hasName, + canHaveQuestionToken, + hasAsteriskToken, } from "./_namespaces/ts.js"; import * as moduleSpecifiers from "./_namespaces/ts.moduleSpecifiers.js"; import * as performance from "./_namespaces/ts.performance.js"; @@ -14639,7 +14643,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { function isTypeInvalidDueToUnionDiscriminant(contextualType: Type, obj: ObjectLiteralExpression | JsxAttributes): boolean { const list = obj.properties as NodeArray; return list.some(property => { - const nameType = property.name && (isJsxNamespacedName(property.name) ? getStringLiteralType(getTextOfJsxAttributeName(property.name)) : getLiteralTypeFromPropertyName(property.name)); + const nameType = !isSpreadAssignment(property) && !isJsxSpreadAttribute(property) && (isJsxNamespacedName(property.name) ? getStringLiteralType(getTextOfJsxAttributeName(property.name)) : getLiteralTypeFromPropertyName(property.name)); const name = nameType && isTypeUsableAsPropertyName(nameType) ? getPropertyNameFromType(nameType) : undefined; const expected = name === undefined ? undefined : getTypeOfPropertyOfType(contextualType, name); return !!expected && isLiteralType(expected) && !isTypeAssignableTo(getTypeOfNode(property), expected); @@ -22477,8 +22481,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { if (prop.valueDeclaration && findAncestor(prop.valueDeclaration, d => d === objectLiteralDeclaration) && getSourceFileOfNode(objectLiteralDeclaration) === getSourceFileOfNode(errorNode)) { const propDeclaration = prop.valueDeclaration as ObjectLiteralElementLike; Debug.assertNode(propDeclaration, isObjectLiteralElementLike); + Debug.assertNotNode(propDeclaration, isSpreadAssignment); + Debug.assertNotNode(propDeclaration, isJsxSpreadAttribute); - const name = propDeclaration.name!; + const name = propDeclaration.name; errorNode = name; if (isIdentifier(name)) { @@ -31852,7 +31858,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { } } } - if (element.name) { + if (!isSpreadAssignment(element) && !isJsxSpreadAttribute(element)) { const nameType = getLiteralTypeFromPropertyName(element.name); // We avoid calling getApplicableIndexInfo here because it performs potentially expensive intersection reduction. return mapType(type, t => findApplicableIndexInfo(getIndexInfosOfStructuredType(t), nameType)?.type, /*noReductions*/ true); @@ -32847,7 +32853,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { // As otherwise they may not be checked until exports for the type at this position are retrieved, // which may never occur. for (const elem of node.properties) { - if (elem.name && isComputedPropertyName(elem.name)) { + if (canHaveName(elem) && isComputedPropertyName(elem.name)) { checkComputedPropertyName(elem.name); } } @@ -32855,7 +32861,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { let offset = 0; for (const memberDecl of node.properties) { let member = getSymbolOfDeclaration(memberDecl); - const computedNameType = memberDecl.name && memberDecl.name.kind === SyntaxKind.ComputedPropertyName ? + const computedNameType = canHaveName(memberDecl) && memberDecl.name.kind === SyntaxKind.ComputedPropertyName ? checkComputedPropertyName(memberDecl.name) : undefined; if ( memberDecl.kind === SyntaxKind.PropertyAssignment || @@ -34980,9 +34986,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { // If the template didn't end in a backtick, or its beginning occurred right prior to EOF, // then this might actually turn out to be a TemplateHead in the future; // so we consider the call to be incomplete. - const templateLiteral = node.template as LiteralExpression; - Debug.assert(templateLiteral.kind === SyntaxKind.NoSubstitutionTemplateLiteral); - callIsIncomplete = !!templateLiteral.isUnterminated; + Debug.assert(node.template.kind === SyntaxKind.NoSubstitutionTemplateLiteral); + callIsIncomplete = !!node.template.isUnterminated; } } else if (node.kind === SyntaxKind.Decorator) { @@ -37989,9 +37994,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { } function createClassMemberDecoratorContextTypeForNode(node: MethodDeclaration | AccessorDeclaration | PropertyDeclaration, thisType: Type, valueType: Type) { + const name = node.name; const isStatic = hasStaticModifier(node); - const isPrivate = isPrivateIdentifier(node.name); - const nameType = isPrivate ? getStringLiteralType(idText(node.name)) : getLiteralTypeFromPropertyName(node.name); + const isPrivate = isPrivateIdentifier(name); + const nameType = isPrivate ? getStringLiteralType(idText(name)) : getLiteralTypeFromPropertyName(name); const contextType = isMethodDeclaration(node) ? createClassMethodDecoratorContextType(thisType, valueType) : isGetAccessorDeclaration(node) ? createClassGetterDecoratorContextType(thisType, valueType) : isSetAccessorDeclaration(node) ? createClassSetterDecoratorContextType(thisType, valueType) : @@ -40901,7 +40907,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { getReturnTypeOfSingleNonGenericCallSignature(checkNonNullExpression(expr.expression)); } else if (isAssertionExpression(expr) && !isConstTypeReference(expr.type)) { - return getTypeFromTypeNode((expr as TypeAssertion).type); + return getTypeFromTypeNode((expr as TypeAssertionExpression).type); } else if (isLiteralExpression(node) || isBooleanLiteral(node)) { return checkExpression(node); @@ -42241,7 +42247,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { const isConstructor = (symbol.flags & SymbolFlags.Constructor) !== 0; function reportImplementationExpectedError(node: SignatureDeclaration): void { - if (node.name && nodeIsMissing(node.name)) { + if (canHaveName(node) && node.name && nodeIsMissing(node.name)) { return; } @@ -42258,10 +42264,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { // In this case the subsequent node is not really consecutive (.pos !== node.end), and we must ignore it here. if (subsequentNode && subsequentNode.pos === node.end) { if (subsequentNode.kind === node.kind) { - const errorNode: Node = (subsequentNode as FunctionLikeDeclaration).name || subsequentNode; - const subsequentName = (subsequentNode as FunctionLikeDeclaration).name; + const subsequentName = tryCast(subsequentNode, canHaveName)?.name; + const errorNode: Node = subsequentName ?? subsequentNode; if ( - node.name && subsequentName && ( + hasName(node) && subsequentName && ( // both are private identifiers isPrivateIdentifier(node.name) && isPrivateIdentifier(subsequentName) && node.name.escapedText === subsequentName.escapedText || // Both are computed property names @@ -42284,12 +42290,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { return; } if (nodeIsPresent((subsequentNode as FunctionLikeDeclaration).body)) { - error(errorNode, Diagnostics.Function_implementation_name_must_be_0, declarationNameToString(node.name)); + error(errorNode, Diagnostics.Function_implementation_name_must_be_0, declarationNameToString(canHaveName(node) ? node.name : undefined)); return; } } } - const errorNode: Node = node.name || node; + const errorNode: Node = tryCast(node, canHaveName)?.name ?? node; if (isConstructor) { error(errorNode, Diagnostics.Constructor_implementation_is_missing); } @@ -42405,7 +42411,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { // Abstract methods can't have an implementation -- in particular, they don't need one. if ( lastSeenNonAmbientDeclaration && !lastSeenNonAmbientDeclaration.body && - !hasSyntacticModifier(lastSeenNonAmbientDeclaration, ModifierFlags.Abstract) && !lastSeenNonAmbientDeclaration.questionToken + !hasSyntacticModifier(lastSeenNonAmbientDeclaration, ModifierFlags.Abstract) && + !(canHaveQuestionToken(lastSeenNonAmbientDeclaration) && lastSeenNonAmbientDeclaration.questionToken) ) { reportImplementationExpectedError(lastSeenNonAmbientDeclaration); } @@ -44221,7 +44228,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { // Don't validate for-in initializer as it is already an error const widenedType = getWidenedTypeForVariableLikeDeclaration(node); if (needCheckInitializer) { - const initializerType = checkExpressionCached(node.initializer); + const initializerType = checkExpressionCached(node.initializer!); if (strictNullChecks && needCheckWidenedType) { checkNonNullNonVoidType(initializerType, node); } @@ -47634,7 +47641,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { const validForTypeAttributes = isExclusivelyTypeOnlyImportOrExport(declaration); const override = getResolutionModeOverride(node, validForTypeAttributes ? grammarErrorOnNode : undefined); - const isImportAttributes = declaration.attributes.token === SyntaxKind.WithKeyword; + const isImportAttributes = node.token === SyntaxKind.WithKeyword; if (validForTypeAttributes && override) { return; // Other grammar checks do not apply to type-only imports with resolution mode assertions } @@ -51477,7 +51484,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { } function checkGrammarForGenerator(node: FunctionLikeDeclaration) { - if (node.asteriskToken) { + if (hasAsteriskToken(node)) { Debug.assert( node.kind === SyntaxKind.FunctionDeclaration || node.kind === SyntaxKind.FunctionExpression || diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index e63bfd783ce..095951ee357 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -401,7 +401,7 @@ import { TryStatement, TupleTypeNode, TypeAliasDeclaration, - TypeAssertion, + TypeAssertionExpression, TypeLiteralNode, TypeNode, TypeOfExpression, @@ -1935,7 +1935,7 @@ export function createPrinter(printerOptions: PrinterOptions = {}, handlers: Pri case SyntaxKind.TaggedTemplateExpression: return emitTaggedTemplateExpression(node as TaggedTemplateExpression); case SyntaxKind.TypeAssertionExpression: - return emitTypeAssertionExpression(node as TypeAssertion); + return emitTypeAssertionExpression(node as TypeAssertionExpression); case SyntaxKind.ParenthesizedExpression: return emitParenthesizedExpression(node as ParenthesizedExpression); case SyntaxKind.FunctionExpression: @@ -2718,7 +2718,7 @@ export function createPrinter(printerOptions: PrinterOptions = {}, handlers: Pri emitExpression(node.template); } - function emitTypeAssertionExpression(node: TypeAssertion) { + function emitTypeAssertionExpression(node: TypeAssertionExpression) { writePunctuation("<"); emit(node.type); writePunctuation(">"); diff --git a/src/compiler/expressionToTypeNode.ts b/src/compiler/expressionToTypeNode.ts index 1c6e045f0f0..44cda61b999 100644 --- a/src/compiler/expressionToTypeNode.ts +++ b/src/compiler/expressionToTypeNode.ts @@ -59,7 +59,7 @@ import { SyntacticTypeNodeBuilderContext, SyntacticTypeNodeBuilderResolver, SyntaxKind, - TypeAssertion, + TypeAssertionExpression, TypeNode, TypeParameterDeclaration, UnionTypeNode, @@ -263,7 +263,7 @@ export function createSyntacticTypeNodeBuilder( return typeFromFunctionLikeExpression(node as ArrowFunction | FunctionExpression, context); case SyntaxKind.TypeAssertionExpression: case SyntaxKind.AsExpression: - const asExpression = node as AsExpression | TypeAssertion; + const asExpression = node as AsExpression | TypeAssertionExpression; return typeFromTypeAssertion(asExpression.expression, asExpression.type, context, requiresAddingUndefined); case SyntaxKind.PrefixUnaryExpression: const unaryExpression = node as PrefixUnaryExpression; diff --git a/src/compiler/factory/astNodeFactory.ts b/src/compiler/factory/astNodeFactory.ts index a86985a64cc..6a532abf960 100644 --- a/src/compiler/factory/astNodeFactory.ts +++ b/src/compiler/factory/astNodeFactory.ts @@ -92,6 +92,7 @@ import { AstInferTypeNode, AstInterfaceDeclaration, AstIntersectionTypeNode, + AstJSDoc, AstJSDocAllType, AstJSDocAugmentsTag, AstJSDocAuthorTag, @@ -111,7 +112,6 @@ import { AstJSDocNameReference, AstJSDocNamespaceBody, AstJSDocNamespaceDeclaration, - AstJSDoc, AstJSDocNonNullableType, AstJSDocNullableType, AstJSDocOptionalType, @@ -277,7 +277,22 @@ import { AstWhileStatement, AstWithStatement, AstYieldExpression, + BinaryOperator, + cast, + CharacterCodes, createAstParenthesizerRules, + createScanner, + Debug, + EmitFlags, + escapeLeadingUnderscores, + FileReference, + getCommentRange, + getIdentifierAutoGenerate, + getIdentifierTypeArguments, + getSourceMapRange, + getSyntheticLeadingComments, + getSyntheticTrailingComments, + identity, isAstBinaryExpression, isAstCallChain, isAstCommaListExpression, @@ -294,40 +309,22 @@ import { isAstPropertyAccessChain, isAstQuestionToken, isAstVariableDeclaration, - LiteralToken, - MetaProperty, - Node, - nullAstParenthesizerRules, - SourceFile, -} from "../_namespaces/ts.ast.js"; -import { - BinaryOperator, - cast, - CharacterCodes, - createScanner, - Debug, - EmitFlags, - escapeLeadingUnderscores, - FileReference, - getCommentRange, - getIdentifierAutoGenerate, - getIdentifierTypeArguments, - getSourceMapRange, - getSyntheticLeadingComments, - getSyntheticTrailingComments, - identity, isParseTreeNode, KeywordSyntaxKind, KeywordTypeSyntaxKind, LanguageVariant, lastOrUndefined, + LiteralToken, memoize, mergeEmitNode, + MetaProperty, ModifierFlags, ModifierSyntaxKind, + Node, NodeFactoryFlags, NodeFlags, nodeIsSynthesized, + nullAstParenthesizerRules, OuterExpressionKinds, PostfixUnaryOperator, PrefixUnaryOperator, @@ -343,6 +340,7 @@ import { setIdentifierTypeArguments, setTextRange, some, + SourceFile, startsWith, SyntaxKind, TokenFlags, diff --git a/src/compiler/factory/astNodeTests.ts b/src/compiler/factory/astNodeTests.ts index 1abb9fbfcd6..6a891f0b8b4 100644 --- a/src/compiler/factory/astNodeTests.ts +++ b/src/compiler/factory/astNodeTests.ts @@ -13,7 +13,9 @@ import { AstDeclareKeyword, AstElementAccessChain, AsteriskToken, + AstHasDecorators, AstHasJSDoc, + AstHasModifiers, AstLeftHandSideExpression, AstNode, AstNonNullChain, @@ -33,6 +35,7 @@ import { Bundle, CallExpression, CallSignatureDeclaration, + canHaveJSDoc, CaseBlock, CaseClause, CaseKeyword, @@ -93,6 +96,8 @@ import { InferTypeNode, InterfaceDeclaration, IntersectionTypeNode, + isLeftHandSideExpressionKind, + JSDoc, JSDocAllType, JSDocAugmentsTag, JSDocAuthorTag, @@ -109,7 +114,6 @@ import { JSDocMemberName, JSDocNamepathType, JSDocNameReference, - JSDoc, JSDocNonNullableType, JSDocNullableType, JSDocOptionalType, @@ -167,6 +171,7 @@ import { NamespaceImport, NewExpression, Node, + NodeFlags, NonNullExpression, NoSubstitutionTemplateLiteral, NotEmittedStatement, @@ -175,6 +180,7 @@ import { ObjectLiteralExpression, OmittedExpression, OptionalTypeNode, + OuterExpressionKinds, OverrideKeyword, ParameterDeclaration, ParenthesizedExpression, @@ -207,6 +213,7 @@ import { StringLiteral, SuperExpression, SwitchStatement, + SyntaxKind, SyntaxList, SyntheticExpression, SyntheticReferenceExpression, @@ -224,7 +231,7 @@ import { TryStatement, TupleTypeNode, TypeAliasDeclaration, - TypeAssertion, + TypeAssertionExpression, TypeLiteralNode, TypeOfExpression, TypeOperatorNode, @@ -240,15 +247,6 @@ import { WhileStatement, WithStatement, YieldExpression, - AstHasModifiers, - AstHasDecorators, -} from "../_namespaces/ts.ast.js"; -import { - canHaveJSDoc, - isLeftHandSideExpressionKind, - NodeFlags, - OuterExpressionKinds, - SyntaxKind, } from "../_namespaces/ts.js"; // Literals @@ -700,7 +698,7 @@ export function isAstTaggedTemplateExpression(node: AstNode): node is AstNode { +export function isAstTypeAssertionExpression(node: AstNode): node is AstNode { return node.kind === SyntaxKind.TypeAssertionExpression; } diff --git a/src/compiler/factory/astParenthesizerRules.ts b/src/compiler/factory/astParenthesizerRules.ts index 1fa10e23920..a57fd4bfdf8 100644 --- a/src/compiler/factory/astParenthesizerRules.ts +++ b/src/compiler/factory/astParenthesizerRules.ts @@ -36,10 +36,7 @@ import { isAstTypeOperatorNode, isAstUnionTypeNode, skipAstOuterExpressions, -} from "../_namespaces/ts.ast.js"; -import { Associativity, - ast, BinaryOperator, compareValues, Comparison, @@ -75,7 +72,7 @@ export interface AstParenthesizerRules { parenthesizeLeftSideOfAccess(expression: AstExpression, optionalChain?: boolean): AstLeftHandSideExpression; parenthesizeOperandOfPostfixUnary(operand: AstExpression): AstLeftHandSideExpression; parenthesizeOperandOfPrefixUnary(operand: AstExpression): AstUnaryExpression; - parenthesizeExpressionsOfCommaDelimitedList(elements: AstNodeArrayLike): AstNodeArray; + parenthesizeExpressionsOfCommaDelimitedList(elements: AstNodeArrayLike): AstNodeArray; parenthesizeExpressionForDisallowedComma(expression: AstExpression): AstExpression; parenthesizeExpressionOfExpressionStatement(expression: AstExpression): AstExpression; parenthesizeConciseBodyOfArrowFunction(body: AstExpression): AstExpression; @@ -487,7 +484,7 @@ export function createAstParenthesizerRules(factory: AstNodeFactory): AstParenth emittedExpression, setTextRange(factory.createParenthesizedExpression(callee), callee), emittedExpression.data.typeArguments, - emittedExpression.data.arguments!, + emittedExpression.data.arguments, ); return factory.restoreOuterExpressions(expression, updated, OuterExpressionKinds.PartiallyEmittedExpressions); } @@ -667,8 +664,8 @@ export function createAstParenthesizerRules(factory: AstNodeFactory): AstParenth if (isAstNamedTupleMember(type)) return hasJSDocPostfixQuestion(type.data.type); if (isAstFunctionTypeNode(type) || isAstConstructorTypeNode(type) || isAstTypeOperatorNode(type)) return hasJSDocPostfixQuestion(type.data.type); if (isAstConditionalTypeNode(type)) return hasJSDocPostfixQuestion(type.data.falseType); - if (isAstUnionTypeNode(type)) return hasJSDocPostfixQuestion(last(type.data.types!.items)); - if (isAstIntersectionTypeNode(type)) return hasJSDocPostfixQuestion(last(type.data.types!.items)); + if (isAstUnionTypeNode(type)) return hasJSDocPostfixQuestion(last(type.data.types.items)); + if (isAstIntersectionTypeNode(type)) return hasJSDocPostfixQuestion(last(type.data.types.items)); if (isAstInferTypeNode(type)) return !!type.data.typeParameter.data.constraint && hasJSDocPostfixQuestion(type.data.typeParameter.data.constraint); return false; } diff --git a/src/compiler/factory/emitNode.ts b/src/compiler/factory/emitNode.ts index 303deef85f0..bc9b6a8af6c 100644 --- a/src/compiler/factory/emitNode.ts +++ b/src/compiler/factory/emitNode.ts @@ -2,12 +2,16 @@ import { AccessExpression, append, appendIfUnique, - ast, + AstIdentifier, + AstNode, + AstPrivateIdentifier, AutoGenerateInfo, Debug, EmitFlags, EmitHelper, EmitNode, + getAstParseTreeNode, + getAstSourceFileNodeOfNode, getParseTreeNode, getSourceFileOfNode, Identifier, @@ -34,7 +38,7 @@ import { * various transient transformation properties. * @internal */ -export function getOrCreateEmitNode(node: Node | ast.AstNode): EmitNode { +export function getOrCreateEmitNode(node: Node | AstNode): EmitNode { if (!node.emitNode) { if (isParseTreeNode(node)) { // To avoid holding onto transformation artifacts, we keep track of any @@ -44,8 +48,8 @@ export function getOrCreateEmitNode(node: Node | ast.AstNode): EmitNod return node.emitNode = { annotatedNodes: [node] } as EmitNode; } - if (node instanceof ast.AstNode) { - const sourceFile = ast.getAstSourceFileNodeOfNode(ast.getAstParseTreeNode(ast.getAstSourceFileNodeOfNode(node))) ?? Debug.fail("Could not determine parsed source file."); + if (node instanceof AstNode) { + const sourceFile = getAstSourceFileNodeOfNode(getAstParseTreeNode(getAstSourceFileNodeOfNode(node))) ?? Debug.fail("Could not determine parsed source file."); getOrCreateEmitNode(sourceFile).annotatedNodes!.push(node.node); } else { @@ -98,8 +102,8 @@ export function removeAllComments(node: T): T { */ export function setEmitFlags(node: T, emitFlags: EmitFlags): T; /** @internal */ -export function setEmitFlags>(node: T, emitFlags: EmitFlags): T; -export function setEmitFlags>(node: T, emitFlags: EmitFlags) { +export function setEmitFlags(node: T, emitFlags: EmitFlags): T; +export function setEmitFlags(node: T, emitFlags: EmitFlags) { getOrCreateEmitNode(node).flags = emitFlags; return node; } @@ -141,8 +145,8 @@ export function addInternalEmitFlags(node: T, emitFlags: Interna */ export function getSourceMapRange(node: Node): SourceMapRange; /** @internal */ -export function getSourceMapRange(node: Node | ast.AstNode): SourceMapRange; // eslint-disable-line @typescript-eslint/unified-signatures -export function getSourceMapRange(node: Node | ast.AstNode): SourceMapRange { +export function getSourceMapRange(node: Node | AstNode): SourceMapRange; // eslint-disable-line @typescript-eslint/unified-signatures +export function getSourceMapRange(node: Node | AstNode): SourceMapRange { return node.emitNode?.sourceMapRange ?? node; } @@ -195,8 +199,8 @@ export function setStartsOnNewLine(node: T, newLine: boolean): T */ export function getCommentRange(node: Node): TextRange; /** @internal */ -export function getCommentRange(node: Node | ast.AstNode): TextRange; // eslint-disable-line @typescript-eslint/unified-signatures -export function getCommentRange(node: Node | ast.AstNode): TextRange { +export function getCommentRange(node: Node | AstNode): TextRange; // eslint-disable-line @typescript-eslint/unified-signatures +export function getCommentRange(node: Node | AstNode): TextRange { return node.emitNode?.commentRange ?? node; } @@ -210,8 +214,8 @@ export function setCommentRange(node: T, range: TextRange): T { export function getSyntheticLeadingComments(node: Node): SynthesizedComment[] | undefined; /** @internal */ -export function getSyntheticLeadingComments(node: Node | ast.AstNode): SynthesizedComment[] | undefined; // eslint-disable-line @typescript-eslint/unified-signatures -export function getSyntheticLeadingComments(node: Node | ast.AstNode): SynthesizedComment[] | undefined { +export function getSyntheticLeadingComments(node: Node | AstNode): SynthesizedComment[] | undefined; // eslint-disable-line @typescript-eslint/unified-signatures +export function getSyntheticLeadingComments(node: Node | AstNode): SynthesizedComment[] | undefined { return node.emitNode?.leadingComments; } @@ -226,8 +230,8 @@ export function addSyntheticLeadingComment(node: T, kind: Syntax export function getSyntheticTrailingComments(node: Node): SynthesizedComment[] | undefined; /** @internal */ -export function getSyntheticTrailingComments(node: Node | ast.AstNode): SynthesizedComment[] | undefined; // eslint-disable-line @typescript-eslint/unified-signatures -export function getSyntheticTrailingComments(node: Node | ast.AstNode): SynthesizedComment[] | undefined { +export function getSyntheticTrailingComments(node: Node | AstNode): SynthesizedComment[] | undefined; // eslint-disable-line @typescript-eslint/unified-signatures +export function getSyntheticTrailingComments(node: Node | AstNode): SynthesizedComment[] | undefined { return node.emitNode?.trailingComments; } @@ -370,24 +374,24 @@ export function getTypeNode(node: T): TypeNode | undefined { } /** @internal */ -export function setIdentifierTypeArguments(node: T, typeArguments: NodeArray | undefined): T { +export function setIdentifierTypeArguments(node: T, typeArguments: NodeArray | undefined): T { getOrCreateEmitNode(node).identifierTypeArguments = typeArguments; return node; } /** @internal */ -export function getIdentifierTypeArguments(node: Identifier | ast.AstIdentifier): NodeArray | undefined { +export function getIdentifierTypeArguments(node: Identifier | AstIdentifier): NodeArray | undefined { return node.emitNode?.identifierTypeArguments; } /** @internal */ -export function setIdentifierAutoGenerate(node: T, autoGenerate: AutoGenerateInfo | undefined): T { +export function setIdentifierAutoGenerate(node: T, autoGenerate: AutoGenerateInfo | undefined): T { getOrCreateEmitNode(node).autoGenerate = autoGenerate; return node; } /** @internal @knipignore */ -export function getIdentifierAutoGenerate(node: Identifier | PrivateIdentifier | ast.AstIdentifier | ast.AstPrivateIdentifier): AutoGenerateInfo | undefined { +export function getIdentifierAutoGenerate(node: Identifier | PrivateIdentifier | AstIdentifier | AstPrivateIdentifier): AutoGenerateInfo | undefined { return node.emitNode?.autoGenerate; } diff --git a/src/compiler/factory/nodeChildren.ts b/src/compiler/factory/nodeChildren.ts index da8e074415e..3751851f763 100644 --- a/src/compiler/factory/nodeChildren.ts +++ b/src/compiler/factory/nodeChildren.ts @@ -1,11 +1,25 @@ import { + AstNode, + createScanner, Debug, emptyArray, + forEach, + forEachChild, + getSourceFileOfNode, + hasTabstop, + isJSDocCommentContainingNode, isNodeKind, + isTokenKind, + JSDocContainer, Node, + NodeArray, + NodeFlags, + Scanner, + ScriptTarget, SourceFileLike, SyntaxKind, SyntaxList, + TokenSyntaxKind, } from "../_namespaces/ts.js"; const sourceFileToNodeChildren = new WeakMap>(); @@ -59,3 +73,96 @@ export function transferSourceFileChildren(sourceFile: SourceFileLike, targetSou sourceFileToNodeChildren.set(targetSourceFile, map); } } + + +// copied form services/services.ts +let _scanner: Scanner | undefined; + +function scanner() { + _scanner ??= createScanner(ScriptTarget.Latest, /*skipTrivia*/ true); + return _scanner; +} + +/** @internal */ +export function createChildren(node: Node, sourceFile: SourceFileLike | undefined): readonly Node[] { + const children: Node[] = []; + + if (isJSDocCommentContainingNode(node)) { + /** Don't add trivia for "tokens" since this is in a comment. */ + forEachChild(node, child => { + children.push(child); + }); + return children; + } + + scanner().setText((sourceFile || getSourceFileOfNode(node)).text); + let pos = node.pos; + const processNode = (child: Node) => { + addSyntheticNodes(children, pos, child.pos, node); + children.push(child); + pos = child.end; + }; + const processNodes = (nodes: NodeArray) => { + addSyntheticNodes(children, pos, nodes.pos, node); + children.push(createSyntaxList(nodes, node)); + pos = nodes.end; + }; + // jsDocComments need to be the first children + forEach((node as JSDocContainer).jsDoc, processNode); + // For syntactic classifications, all trivia are classified together, including jsdoc comments. + // For that to work, the jsdoc comments should still be the leading trivia of the first child. + // Restoring the scanner position ensures that. + pos = node.pos; + forEachChild(node, processNode, processNodes); + addSyntheticNodes(children, pos, node.end, node); + scanner().setText(undefined); + return children; +} + +function createNode(kind: TKind, pos: number, end: number, parent: Node): Node { + const astNode = kind === SyntaxKind.StringLiteral ? AstNode.StringLiteral() : AstNode.Token(kind); + astNode.pos = pos; + astNode.end = end; + astNode.parent = parent.ast; + astNode.flags = parent.flags & NodeFlags.ContextFlags; + return astNode.node; +} + +function addSyntheticNodes(nodes: Node[], pos: number, end: number, parent: Node): void { + scanner().resetTokenState(pos); + while (pos < end) { + const token = scanner().scan(); + const textPos = scanner().getTokenEnd(); + if (textPos <= end) { + Debug.assert(isTokenKind(token)); + if (token === SyntaxKind.Identifier) { + if (hasTabstop(parent)) { + continue; + } + Debug.fail(`Did not expect ${Debug.formatSyntaxKind(parent.kind)} to have an ${Debug.formatSyntaxKind(token)} in its trivia`); + } + nodes.push(createNode(token as TokenSyntaxKind, pos, textPos, parent)); + } + pos = textPos; + if (token === SyntaxKind.EndOfFileToken) { + break; + } + } +} + +function createSyntaxList(nodes: NodeArray, parent: Node): Node { + const list = AstNode.SyntaxList(); + list.pos = nodes.pos; + list.end = nodes.end; + list.parent = parent.ast; + const children: Node[] = []; + let pos = nodes.pos; + for (const node of nodes) { + addSyntheticNodes(children, pos, node.pos, parent); + children.push(node); + pos = node.end; + } + addSyntheticNodes(children, pos, nodes.end, parent); + list.data._children = children; + return list.node; +} diff --git a/src/compiler/factory/nodeFactory.ts b/src/compiler/factory/nodeFactory.ts index d5d2079d4e9..4e7d4c35487 100644 --- a/src/compiler/factory/nodeFactory.ts +++ b/src/compiler/factory/nodeFactory.ts @@ -1,4 +1,3 @@ -import * as ast from "../_namespaces/ts.ast.js"; import { AccessorDeclaration, addRange, @@ -15,6 +14,7 @@ import { AssertionKey, AssertsKeyword, AsteriskToken, + AstNodeArray, AwaitExpression, AwaitKeyword, BigIntLiteral, @@ -24,6 +24,7 @@ import { BindingElement, BindingName, Block, + BooleanLiteral, BreakStatement, Bundle, CallBinding, @@ -48,6 +49,7 @@ import { ConstructorTypeNode, ConstructSignatureDeclaration, ContinueStatement, + createAstNodeFactory, createNodeConverters, createParenthesizerRules, Debug, @@ -245,7 +247,6 @@ import { KeywordTypeSyntaxKind, LabeledStatement, LeftHandSideExpression, - LiteralExpression, LiteralToken, LiteralTypeNode, MappedTypeNode, @@ -292,7 +293,6 @@ import { NumericLiteral, objectAllocator, ObjectBindingPattern, - ObjectLiteralElement, ObjectLiteralElementLike, ObjectLiteralExpression, OmittedExpression, @@ -382,7 +382,7 @@ import { TupleTypeNode, Type, TypeAliasDeclaration, - TypeAssertion, + TypeAssertionExpression, TypeElement, TypeLiteralNode, TypeNode, @@ -436,7 +436,7 @@ export function addNodeFactoryPatcher(fn: (factory: NodeFactory) => void): void * @internal */ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: Node) => void): NodeFactory { - const astFactory = ast.createAstNodeFactory(flags, onFinishNode && (ast => onFinishNode(ast.node))); + const astFactory = createAstNodeFactory(flags, onFinishNode && (ast => onFinishNode(ast.node))); // Lazily load the parenthesizer, node converters, and some factory methods until they are used. const parenthesizerRules = memoize(() => flags & NodeFactoryFlags.NoParenthesizerRules ? nullParenthesizerRules : createParenthesizerRules(factory)); @@ -1023,11 +1023,11 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function createNodeArray(elements?: readonly T[], hasTrailingComma?: boolean): NodeArray { - if (elements instanceof ast.NodeArray) { + if (elements instanceof NodeArray) { return elements; } - return new ast.AstNodeArray(elements?.map(element => (element as Node as ast.Node).ast) ?? [], hasTrailingComma).nodes as readonly Node[] as NodeArray; + return new AstNodeArray(elements?.map(element => element.ast) ?? [], hasTrailingComma).nodes as NodeArray; } // @@ -1052,7 +1052,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function createStringLiteralFromNode(sourceNode: PropertyNameLiteral | PrivateIdentifier): StringLiteral { const node = astFactory.createStringLiteral(getTextOfIdentifierOrLiteral(sourceNode), /*isSingleQuote*/ undefined).node; - node.textSourceNode = sourceNode as ast.PropertyNameLiteral | ast.PrivateIdentifier; + node.textSourceNode = sourceNode; return node; } @@ -1264,22 +1264,22 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function createQualifiedName(left: EntityName, right: string | Identifier): QualifiedName { - return astFactory.createQualifiedName(asNode(left).ast, typeof right === "string" ? right : asNode(right).ast).node; + return astFactory.createQualifiedName(left.ast, typeof right === "string" ? right : right.ast).node; } // @api function updateQualifiedName(node: QualifiedName, left: EntityName, right: Identifier): QualifiedName { - return astFactory.updateQualifiedName(asNode(node).ast, asNode(left).ast, asNode(right).ast).node; + return astFactory.updateQualifiedName(node.ast, left.ast, right.ast).node; } // @api function createComputedPropertyName(expression: Expression): ComputedPropertyName { - return astFactory.createComputedPropertyName(asNode(expression).ast).node; + return astFactory.createComputedPropertyName(expression.ast).node; } // @api function updateComputedPropertyName(node: ComputedPropertyName, expression: Expression): ComputedPropertyName { - return astFactory.updateComputedPropertyName(asNode(node).ast, asNode(expression).ast).node; + return astFactory.updateComputedPropertyName(node.ast, expression.ast).node; } // @@ -1288,12 +1288,12 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function createTypeParameterDeclaration(modifiers: readonly Modifier[] | undefined, name: string | Identifier, constraint?: TypeNode, defaultType?: TypeNode): TypeParameterDeclaration { - return astFactory.createTypeParameterDeclaration(asNodeArray(modifiers)?.ast, asName(name).ast, asNode(constraint)?.ast, asNode(defaultType)?.ast).node; + return astFactory.createTypeParameterDeclaration(asNodeArray(modifiers)?.ast, asName(name).ast, constraint?.ast, defaultType?.ast).node; } // @api function updateTypeParameterDeclaration(node: TypeParameterDeclaration, modifiers: readonly Modifier[] | undefined, name: Identifier, constraint: TypeNode | undefined, defaultType: TypeNode | undefined): TypeParameterDeclaration { - return astFactory.updateTypeParameterDeclaration(asNode(node).ast, asNodeArray(modifiers)?.ast, asNode(name).ast, asNode(constraint)?.ast, asNode(defaultType)?.ast).node; + return astFactory.updateTypeParameterDeclaration(node.ast, asNodeArray(modifiers)?.ast, name.ast, constraint?.ast, defaultType?.ast).node; } // @api @@ -1306,7 +1306,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: initializer?: Expression, ): ParameterDeclaration { // NOTE: JSDoc parameters don't have names and we currently passed `undefined!` - return astFactory.createParameterDeclaration(asNodeArray(modifiers)?.ast, asNode(dotDotDotToken)?.ast, asName(name)?.ast, asNode(questionToken)?.ast, asNode(type)?.ast, asNode(initializer)?.ast).node; + return astFactory.createParameterDeclaration(asNodeArray(modifiers)?.ast, dotDotDotToken?.ast, asName(name)?.ast, questionToken?.ast, type?.ast, initializer?.ast).node; } // @api @@ -1319,17 +1319,17 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: type: TypeNode | undefined, initializer: Expression | undefined, ): ParameterDeclaration { - return astFactory.updateParameterDeclaration(asNode(node).ast, asNodeArray(modifiers)?.ast, asNode(dotDotDotToken)?.ast, asName(name)?.ast, asNode(questionToken)?.ast, asNode(type)?.ast, asNode(initializer)?.ast).node; + return astFactory.updateParameterDeclaration(node.ast, asNodeArray(modifiers)?.ast, dotDotDotToken?.ast, asName(name)?.ast, questionToken?.ast, type?.ast, initializer?.ast).node; } // @api function createDecorator(expression: Expression): Decorator { - return astFactory.createDecorator(asNode(expression).ast).node; + return astFactory.createDecorator(expression.ast).node; } // @api function updateDecorator(node: Decorator, expression: Expression): Decorator { - return astFactory.updateDecorator((node as ast.Decorator).ast, asNode(expression).ast).node; + return astFactory.updateDecorator(node.ast, expression.ast).node; } // @@ -1343,7 +1343,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: questionToken: QuestionToken | undefined, type: TypeNode | undefined, ): PropertySignature { - return astFactory.createPropertySignature(asNodeArray(modifiers)?.ast, asName(name).ast, asNode(questionToken)?.ast, asNode(type)?.ast).node; + return astFactory.createPropertySignature(asNodeArray(modifiers)?.ast, asName(name).ast, questionToken?.ast, type?.ast).node; } // @api @@ -1354,7 +1354,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: questionToken: QuestionToken | undefined, type: TypeNode | undefined, ): PropertySignature { - return astFactory.updatePropertySignature(asNode(node).ast, asNodeArray(modifiers)?.ast, asNode(name).ast, asNode(questionToken)?.ast, asNode(type)?.ast).node; + return astFactory.updatePropertySignature(node.ast, asNodeArray(modifiers)?.ast, name.ast, questionToken?.ast, type?.ast).node; } // @api @@ -1365,7 +1365,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: type: TypeNode | undefined, initializer: Expression | undefined, ): PropertyDeclaration { - return astFactory.createPropertyDeclaration(asNodeArray(modifiers)?.ast, asName(name).ast, asNode(questionOrExclamationToken)?.ast, asNode(type)?.ast, asNode(initializer)?.ast).node; + return astFactory.createPropertyDeclaration(asNodeArray(modifiers)?.ast, asName(name).ast, questionOrExclamationToken?.ast, type?.ast, initializer?.ast).node; } // @api @@ -1377,7 +1377,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: type: TypeNode | undefined, initializer: Expression | undefined, ): PropertyDeclaration { - return astFactory.updatePropertyDeclaration(asNode(node).ast, asNodeArray(modifiers)?.ast, asName(name).ast, asNode(questionOrExclamationToken)?.ast, asNode(type)?.ast, asNode(initializer)?.ast).node; + return astFactory.updatePropertyDeclaration(node.ast, asNodeArray(modifiers)?.ast, asName(name).ast, questionOrExclamationToken?.ast, type?.ast, initializer?.ast).node; } // @api @@ -1389,7 +1389,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, ): MethodSignature { - return astFactory.createMethodSignature(asNodeArray(modifiers)?.ast, asName(name).ast, asNode(questionToken)?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, asNode(type)?.ast).node; + return astFactory.createMethodSignature(asNodeArray(modifiers)?.ast, asName(name).ast, questionToken?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, type?.ast).node; } // @api @@ -1402,7 +1402,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: parameters: NodeArray, type: TypeNode | undefined, ): MethodSignature { - return astFactory.updateMethodSignature(asNode(node).ast, asNodeArray(modifiers)?.ast, asNode(name).ast, asNode(questionToken)?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, asNode(type)?.ast).node; + return astFactory.updateMethodSignature(node.ast, asNodeArray(modifiers)?.ast, name.ast, questionToken?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, type?.ast).node; } // @api @@ -1416,7 +1416,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: type: TypeNode | undefined, body: Block | undefined, ): MethodDeclaration { - return astFactory.createMethodDeclaration(asNodeArray(modifiers)?.ast, asNode(asteriskToken)?.ast, asName(name).ast, asNode(questionToken)?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, asNode(type)?.ast, asNode(body)?.ast).node; + return astFactory.createMethodDeclaration(asNodeArray(modifiers)?.ast, asteriskToken?.ast, asName(name).ast, questionToken?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, type?.ast, body?.ast).node; } // @api @@ -1431,14 +1431,14 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: type: TypeNode | undefined, body: Block | undefined, ): MethodDeclaration { - return astFactory.updateMethodDeclaration(asNode(node).ast, asNodeArray(modifiers)?.ast, asNode(asteriskToken)?.ast, asNode(name).ast, asNode(questionToken)?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, asNode(type)?.ast, asNode(body)?.ast).node; + return astFactory.updateMethodDeclaration(node.ast, asNodeArray(modifiers)?.ast, asteriskToken?.ast, name.ast, questionToken?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, type?.ast, body?.ast).node; } // @api function createClassStaticBlockDeclaration( body: Block, ): ClassStaticBlockDeclaration { - return astFactory.createClassStaticBlockDeclaration(asNode(body).ast).node; + return astFactory.createClassStaticBlockDeclaration(body.ast).node; } // @api @@ -1446,7 +1446,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: node: ClassStaticBlockDeclaration, body: Block, ): ClassStaticBlockDeclaration { - return astFactory.updateClassStaticBlockDeclaration(asNode(node).ast, asNode(body).ast).node; + return astFactory.updateClassStaticBlockDeclaration(node.ast, body.ast).node; } // @api @@ -1455,7 +1455,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: parameters: readonly ParameterDeclaration[], body: Block | undefined, ): ConstructorDeclaration { - return astFactory.createConstructorDeclaration(asNodeArray(modifiers)?.ast, asNodeArray(parameters).ast, asNode(body)?.ast).node; + return astFactory.createConstructorDeclaration(asNodeArray(modifiers)?.ast, asNodeArray(parameters).ast, body?.ast).node; } // @api @@ -1465,7 +1465,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: parameters: readonly ParameterDeclaration[], body: Block | undefined, ): ConstructorDeclaration { - return astFactory.updateConstructorDeclaration(asNode(node).ast, asNodeArray(modifiers)?.ast, asNodeArray(parameters).ast, asNode(body)?.ast).node; + return astFactory.updateConstructorDeclaration(node.ast, asNodeArray(modifiers)?.ast, asNodeArray(parameters).ast, body?.ast).node; } // @api @@ -1476,7 +1476,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: type: TypeNode | undefined, body: Block | undefined, ): GetAccessorDeclaration { - return astFactory.createGetAccessorDeclaration(asNodeArray(modifiers)?.ast, asName(name)?.ast, asNodeArray(parameters).ast, asNode(type)?.ast, asNode(body)?.ast).node; + return astFactory.createGetAccessorDeclaration(asNodeArray(modifiers)?.ast, asName(name)?.ast, asNodeArray(parameters).ast, type?.ast, body?.ast).node; } // @api @@ -1488,7 +1488,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: type: TypeNode | undefined, body: Block | undefined, ): GetAccessorDeclaration { - return astFactory.updateGetAccessorDeclaration(asNode(node).ast, asNodeArray(modifiers)?.ast, asNode(name).ast, asNodeArray(parameters).ast, asNode(type)?.ast, asNode(body)?.ast).node; + return astFactory.updateGetAccessorDeclaration(node.ast, asNodeArray(modifiers)?.ast, name.ast, asNodeArray(parameters).ast, type?.ast, body?.ast).node; } // @api @@ -1498,7 +1498,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: parameters: readonly ParameterDeclaration[], body: Block | undefined, ): SetAccessorDeclaration { - return astFactory.createSetAccessorDeclaration(asNodeArray(modifiers)?.ast, asName(name)?.ast, asNodeArray(parameters).ast, asNode(body)?.ast).node; + return astFactory.createSetAccessorDeclaration(asNodeArray(modifiers)?.ast, asName(name)?.ast, asNodeArray(parameters).ast, body?.ast).node; } // @api @@ -1509,7 +1509,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: parameters: readonly ParameterDeclaration[], body: Block | undefined, ): SetAccessorDeclaration { - return astFactory.updateSetAccessorDeclaration(asNode(node).ast, asNodeArray(modifiers)?.ast, asNode(name).ast, asNodeArray(parameters).ast, asNode(body)?.ast).node; + return astFactory.updateSetAccessorDeclaration(node.ast, asNodeArray(modifiers)?.ast, name.ast, asNodeArray(parameters).ast, body?.ast).node; } // @api @@ -1518,7 +1518,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, ): CallSignatureDeclaration { - return astFactory.createCallSignature(asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, asNode(type)?.ast).node; + return astFactory.createCallSignature(asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, type?.ast).node; } // @api @@ -1528,7 +1528,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: parameters: NodeArray, type: TypeNode | undefined, ): CallSignatureDeclaration { - return astFactory.updateCallSignature(asNode(node).ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, asNode(type)?.ast).node; + return astFactory.updateCallSignature(node.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, type?.ast).node; } // @api @@ -1537,7 +1537,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, ): ConstructSignatureDeclaration { - return astFactory.createConstructSignature(asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, asNode(type)?.ast).node; + return astFactory.createConstructSignature(asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, type?.ast).node; } // @api @@ -1547,7 +1547,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: parameters: NodeArray, type: TypeNode | undefined, ): ConstructSignatureDeclaration { - return astFactory.updateConstructSignature(asNode(node).ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, asNode(type)?.ast).node; + return astFactory.updateConstructSignature(node.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, type?.ast).node; } // @api @@ -1556,7 +1556,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, ): IndexSignatureDeclaration { - return astFactory.createIndexSignature(asNodeArray(modifiers)?.ast, asNodeArray(parameters).ast, asNode(type)?.ast).node; + return astFactory.createIndexSignature(asNodeArray(modifiers)?.ast, asNodeArray(parameters).ast, type?.ast).node; } // @api @@ -1566,17 +1566,17 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: parameters: readonly ParameterDeclaration[], type: TypeNode, ): IndexSignatureDeclaration { - return astFactory.updateIndexSignature(asNode(node).ast, asNodeArray(modifiers)?.ast, asNodeArray(parameters).ast, asNode(type).ast).node; + return astFactory.updateIndexSignature(node.ast, asNodeArray(modifiers)?.ast, asNodeArray(parameters).ast, type.ast).node; } // @api function createTemplateLiteralTypeSpan(type: TypeNode, literal: TemplateMiddle | TemplateTail): TemplateLiteralTypeSpan { - return astFactory.createTemplateLiteralTypeSpan(asNode(type).ast, asNode(literal).ast).node; + return astFactory.createTemplateLiteralTypeSpan(type.ast, literal.ast).node; } // @api function updateTemplateLiteralTypeSpan(node: TemplateLiteralTypeSpan, type: TypeNode, literal: TemplateMiddle | TemplateTail): TemplateLiteralTypeSpan { - return astFactory.updateTemplateLiteralTypeSpan(asNode(node).ast, asNode(type).ast, asNode(literal).ast).node; + return astFactory.updateTemplateLiteralTypeSpan(node.ast, type.ast, literal.ast).node; } // @@ -1590,12 +1590,12 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function createTypePredicateNode(assertsModifier: AssertsKeyword | undefined, parameterName: Identifier | ThisTypeNode | string, type: TypeNode | undefined): TypePredicateNode { - return astFactory.createTypePredicateNode(asNode(assertsModifier)?.ast, asName(parameterName).ast, asNode(type)?.ast).node; + return astFactory.createTypePredicateNode(assertsModifier?.ast, asName(parameterName).ast, type?.ast).node; } // @api function updateTypePredicateNode(node: TypePredicateNode, assertsModifier: AssertsKeyword | undefined, parameterName: Identifier | ThisTypeNode, type: TypeNode | undefined): TypePredicateNode { - return astFactory.updateTypePredicateNode(asNode(node).ast, asNode(assertsModifier)?.ast, asName(parameterName).ast, asNode(type)?.ast).node; + return astFactory.updateTypePredicateNode(node.ast, assertsModifier?.ast, asName(parameterName).ast, type?.ast).node; } // @api @@ -1605,7 +1605,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateTypeReferenceNode(node: TypeReferenceNode, typeName: EntityName, typeArguments: NodeArray | undefined): TypeReferenceNode { - return astFactory.updateTypeReferenceNode(asNode(node).ast, asNode(typeName).ast, asNodeArray(typeArguments)?.ast).node; + return astFactory.updateTypeReferenceNode(node.ast, typeName.ast, asNodeArray(typeArguments)?.ast).node; } // @api @@ -1614,7 +1614,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: parameters: readonly ParameterDeclaration[], type: TypeNode, ): FunctionTypeNode { - return astFactory.createFunctionTypeNode(asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, asNode(type).ast).node; + return astFactory.createFunctionTypeNode(asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, type.ast).node; } // @api @@ -1624,7 +1624,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: parameters: NodeArray, type: TypeNode, ): FunctionTypeNode { - return astFactory.updateFunctionTypeNode(asNode(node).ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, asNode(type).ast).node; + return astFactory.updateFunctionTypeNode(node.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, type.ast).node; } // @api @@ -1640,7 +1640,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: parameters: readonly ParameterDeclaration[], type: TypeNode, ): ConstructorTypeNode { - return astFactory.createConstructorTypeNode(asNodeArray(modifiers)?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, asNode(type).ast).node; + return astFactory.createConstructorTypeNode(asNodeArray(modifiers)?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, type.ast).node; } /** @deprecated */ @@ -1666,7 +1666,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: parameters: NodeArray, type: TypeNode, ): ConstructorTypeNode { - return astFactory.updateConstructorTypeNode(asNode(node).ast, asNodeArray(modifiers)?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, asNode(type).ast).node; + return astFactory.updateConstructorTypeNode(node.ast, asNodeArray(modifiers)?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, type.ast).node; } /** @deprecated */ @@ -1681,12 +1681,12 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function createTypeQueryNode(exprName: EntityName, typeArguments?: readonly TypeNode[]): TypeQueryNode { - return astFactory.createTypeQueryNode(asNode(exprName).ast, asNodeArray(typeArguments)?.ast).node; + return astFactory.createTypeQueryNode(exprName.ast, asNodeArray(typeArguments)?.ast).node; } // @api function updateTypeQueryNode(node: TypeQueryNode, exprName: EntityName, typeArguments?: readonly TypeNode[]): TypeQueryNode { - return astFactory.updateTypeQueryNode(asNode(node).ast, asNode(exprName).ast, asNodeArray(typeArguments)?.ast).node; + return astFactory.updateTypeQueryNode(node.ast, exprName.ast, asNodeArray(typeArguments)?.ast).node; } // @api @@ -1696,17 +1696,17 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateTypeLiteralNode(node: TypeLiteralNode, members: NodeArray): TypeLiteralNode { - return astFactory.updateTypeLiteralNode(asNode(node).ast, asNodeArray(members).ast).node; + return astFactory.updateTypeLiteralNode(node.ast, asNodeArray(members).ast).node; } // @api function createArrayTypeNode(elementType: TypeNode): ArrayTypeNode { - return astFactory.createArrayTypeNode(asNode(elementType).ast).node; + return astFactory.createArrayTypeNode(elementType.ast).node; } // @api function updateArrayTypeNode(node: ArrayTypeNode, elementType: TypeNode): ArrayTypeNode { - return astFactory.updateArrayTypeNode(asNode(node).ast, asNode(elementType).ast).node; + return astFactory.updateArrayTypeNode(node.ast, elementType.ast).node; } // @api @@ -1716,37 +1716,37 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateTupleTypeNode(node: TupleTypeNode, elements: readonly (TypeNode | NamedTupleMember)[]): TupleTypeNode { - return astFactory.updateTupleTypeNode(asNode(node).ast, asNodeArray(elements).ast).node; + return astFactory.updateTupleTypeNode(node.ast, asNodeArray(elements).ast).node; } // @api function createNamedTupleMember(dotDotDotToken: DotDotDotToken | undefined, name: Identifier, questionToken: QuestionToken | undefined, type: TypeNode): NamedTupleMember { - return astFactory.createNamedTupleMember(asNode(dotDotDotToken)?.ast, asNode(name).ast, asNode(questionToken)?.ast, asNode(type).ast).node; + return astFactory.createNamedTupleMember(dotDotDotToken?.ast, name.ast, questionToken?.ast, type.ast).node; } // @api function updateNamedTupleMember(node: NamedTupleMember, dotDotDotToken: DotDotDotToken | undefined, name: Identifier, questionToken: QuestionToken | undefined, type: TypeNode): NamedTupleMember { - return astFactory.updateNamedTupleMember(asNode(node).ast, asNode(dotDotDotToken)?.ast, asNode(name).ast, asNode(questionToken)?.ast, asNode(type).ast).node; + return astFactory.updateNamedTupleMember(node.ast, dotDotDotToken?.ast, name.ast, questionToken?.ast, type.ast).node; } // @api function createOptionalTypeNode(type: TypeNode): OptionalTypeNode { - return astFactory.createOptionalTypeNode(asNode(type).ast).node; + return astFactory.createOptionalTypeNode(type.ast).node; } // @api function updateOptionalTypeNode(node: OptionalTypeNode, type: TypeNode): OptionalTypeNode { - return astFactory.updateOptionalTypeNode(asNode(node).ast, asNode(type).ast).node; + return astFactory.updateOptionalTypeNode(node.ast, type.ast).node; } // @api function createRestTypeNode(type: TypeNode): RestTypeNode { - return astFactory.createRestTypeNode(asNode(type).ast).node; + return astFactory.createRestTypeNode(type.ast).node; } // @api function updateRestTypeNode(node: RestTypeNode, type: TypeNode): RestTypeNode { - return astFactory.updateRestTypeNode(asNode(node).ast, asNode(type).ast).node; + return astFactory.updateRestTypeNode(node.ast, type.ast).node; } // @api @@ -1756,7 +1756,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateUnionTypeNode(node: UnionTypeNode, types: NodeArray): UnionTypeNode { - return astFactory.updateUnionTypeNode(asNode(node).ast, asNodeArray(types).ast).node; + return astFactory.updateUnionTypeNode(node.ast, asNodeArray(types).ast).node; } // @api @@ -1766,37 +1766,37 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateIntersectionTypeNode(node: IntersectionTypeNode, types: NodeArray): IntersectionTypeNode { - return astFactory.updateIntersectionTypeNode(asNode(node).ast, asNodeArray(types).ast).node; + return astFactory.updateIntersectionTypeNode(node.ast, asNodeArray(types).ast).node; } // @api function createConditionalTypeNode(checkType: TypeNode, extendsType: TypeNode, trueType: TypeNode, falseType: TypeNode): ConditionalTypeNode { - return astFactory.createConditionalTypeNode(asNode(checkType).ast, asNode(extendsType).ast, asNode(trueType).ast, asNode(falseType).ast).node; + return astFactory.createConditionalTypeNode(checkType.ast, extendsType.ast, trueType.ast, falseType.ast).node; } // @api function updateConditionalTypeNode(node: ConditionalTypeNode, checkType: TypeNode, extendsType: TypeNode, trueType: TypeNode, falseType: TypeNode): ConditionalTypeNode { - return astFactory.updateConditionalTypeNode(asNode(node).ast, asNode(checkType).ast, asNode(extendsType).ast, asNode(trueType).ast, asNode(falseType).ast).node; + return astFactory.updateConditionalTypeNode(node.ast, checkType.ast, extendsType.ast, trueType.ast, falseType.ast).node; } // @api function createInferTypeNode(typeParameter: TypeParameterDeclaration): InferTypeNode { - return astFactory.createInferTypeNode(asNode(typeParameter).ast).node; + return astFactory.createInferTypeNode(typeParameter.ast).node; } // @api function updateInferTypeNode(node: InferTypeNode, typeParameter: TypeParameterDeclaration): InferTypeNode { - return astFactory.updateInferTypeNode(asNode(node).ast, asNode(typeParameter).ast).node; + return astFactory.updateInferTypeNode(node.ast, typeParameter.ast).node; } // @api function createTemplateLiteralType(head: TemplateHead, templateSpans: readonly TemplateLiteralTypeSpan[]): TemplateLiteralTypeNode { - return astFactory.createTemplateLiteralType(asNode(head).ast, asNodeArray(templateSpans).ast).node; + return astFactory.createTemplateLiteralType(head.ast, asNodeArray(templateSpans).ast).node; } // @api function updateTemplateLiteralType(node: TemplateLiteralTypeNode, head: TemplateHead, templateSpans: readonly TemplateLiteralTypeSpan[]): TemplateLiteralTypeNode { - return astFactory.updateTemplateLiteralType(asNode(node).ast, asNode(head).ast, asNodeArray(templateSpans).ast).node; + return astFactory.updateTemplateLiteralType(node.ast, head.ast, asNodeArray(templateSpans).ast).node; } // @api @@ -1807,7 +1807,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: typeArguments?: readonly TypeNode[], isTypeOf = false, ): ImportTypeNode { - return astFactory.createImportTypeNode(asNode(argument).ast, asNode(attributes)?.ast, asNode(qualifier)?.ast, asNodeArray(typeArguments)?.ast, isTypeOf).node; + return astFactory.createImportTypeNode(argument.ast, attributes?.ast, qualifier?.ast, asNodeArray(typeArguments)?.ast, isTypeOf).node; } // @api @@ -1819,17 +1819,17 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: typeArguments: readonly TypeNode[] | undefined, isTypeOf: boolean = node.isTypeOf, ): ImportTypeNode { - return astFactory.updateImportTypeNode(asNode(node).ast, asNode(argument).ast, asNode(attributes)?.ast, asNode(qualifier)?.ast, asNodeArray(typeArguments)?.ast, isTypeOf).node; + return astFactory.updateImportTypeNode(node.ast, argument.ast, attributes?.ast, qualifier?.ast, asNodeArray(typeArguments)?.ast, isTypeOf).node; } // @api function createParenthesizedType(type: TypeNode): ParenthesizedTypeNode { - return astFactory.createParenthesizedType(asNode(type).ast).node; + return astFactory.createParenthesizedType(type.ast).node; } // @api function updateParenthesizedType(node: ParenthesizedTypeNode, type: TypeNode): ParenthesizedTypeNode { - return astFactory.updateParenthesizedType(asNode(node).ast, asNode(type).ast).node; + return astFactory.updateParenthesizedType(node.ast, type.ast).node; } // @api @@ -1839,42 +1839,42 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function createTypeOperatorNode(operator: SyntaxKind.KeyOfKeyword | SyntaxKind.UniqueKeyword | SyntaxKind.ReadonlyKeyword, type: TypeNode): TypeOperatorNode { - return astFactory.createTypeOperatorNode(operator, asNode(type).ast).node; + return astFactory.createTypeOperatorNode(operator, type.ast).node; } // @api function updateTypeOperatorNode(node: TypeOperatorNode, type: TypeNode): TypeOperatorNode { - return astFactory.updateTypeOperatorNode(asNode(node).ast, asNode(type).ast).node; + return astFactory.updateTypeOperatorNode(node.ast, type.ast).node; } // @api function createIndexedAccessTypeNode(objectType: TypeNode, indexType: TypeNode): IndexedAccessTypeNode { - return astFactory.createIndexedAccessTypeNode(asNode(objectType).ast, asNode(indexType).ast).node; + return astFactory.createIndexedAccessTypeNode(objectType.ast, indexType.ast).node; } // @api function updateIndexedAccessTypeNode(node: IndexedAccessTypeNode, objectType: TypeNode, indexType: TypeNode): IndexedAccessTypeNode { - return astFactory.updateIndexedAccessTypeNode(asNode(node).ast, asNode(objectType).ast, asNode(indexType).ast).node; + return astFactory.updateIndexedAccessTypeNode(node.ast, objectType.ast, indexType.ast).node; } // @api function createMappedTypeNode(readonlyToken: ReadonlyKeyword | PlusToken | MinusToken | undefined, typeParameter: TypeParameterDeclaration, nameType: TypeNode | undefined, questionToken: QuestionToken | PlusToken | MinusToken | undefined, type: TypeNode | undefined, members: readonly TypeElement[] | undefined): MappedTypeNode { - return astFactory.createMappedTypeNode(asNode(readonlyToken)?.ast, asNode(typeParameter).ast, asNode(nameType)?.ast, asNode(questionToken)?.ast, asNode(type)?.ast, asNodeArray(members)?.ast).node; + return astFactory.createMappedTypeNode(readonlyToken?.ast, typeParameter.ast, nameType?.ast, questionToken?.ast, type?.ast, asNodeArray(members)?.ast).node; } // @api function updateMappedTypeNode(node: MappedTypeNode, readonlyToken: ReadonlyKeyword | PlusToken | MinusToken | undefined, typeParameter: TypeParameterDeclaration, nameType: TypeNode | undefined, questionToken: QuestionToken | PlusToken | MinusToken | undefined, type: TypeNode | undefined, members: readonly TypeElement[] | undefined): MappedTypeNode { - return astFactory.updateMappedTypeNode(asNode(node).ast, asNode(readonlyToken)?.ast, asNode(typeParameter).ast, asNode(nameType)?.ast, asNode(questionToken)?.ast, asNode(type)?.ast, asNodeArray(members)?.ast).node; + return astFactory.updateMappedTypeNode(node.ast, readonlyToken?.ast, typeParameter.ast, nameType?.ast, questionToken?.ast, type?.ast, asNodeArray(members)?.ast).node; } // @api function createLiteralTypeNode(literal: LiteralTypeNode["literal"]): LiteralTypeNode { - return astFactory.createLiteralTypeNode(asNode(literal).ast).node; + return astFactory.createLiteralTypeNode(literal.ast).node; } // @api function updateLiteralTypeNode(node: LiteralTypeNode, literal: LiteralTypeNode["literal"]): LiteralTypeNode { - return astFactory.updateLiteralTypeNode(asNode(node).ast, asNode(literal).ast).node; + return astFactory.updateLiteralTypeNode(node.ast, literal.ast).node; } // @@ -1888,7 +1888,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateObjectBindingPattern(node: ObjectBindingPattern, elements: readonly BindingElement[]): ObjectBindingPattern { - return astFactory.updateObjectBindingPattern(asNode(node).ast, asNodeArray(elements).ast).node; + return astFactory.updateObjectBindingPattern(node.ast, asNodeArray(elements).ast).node; } // @api @@ -1898,17 +1898,17 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateArrayBindingPattern(node: ArrayBindingPattern, elements: readonly ArrayBindingElement[]): ArrayBindingPattern { - return astFactory.updateArrayBindingPattern(asNode(node).ast, asNodeArray(elements).ast).node; + return astFactory.updateArrayBindingPattern(node.ast, asNodeArray(elements).ast).node; } // @api function createBindingElement(dotDotDotToken: DotDotDotToken | undefined, propertyName: string | PropertyName | undefined, name: string | BindingName, initializer?: Expression): BindingElement { - return astFactory.createBindingElement(asNode(dotDotDotToken)?.ast, asName(propertyName)?.ast, asName(name).ast, asNode(initializer)?.ast).node; + return astFactory.createBindingElement(dotDotDotToken?.ast, asName(propertyName)?.ast, asName(name).ast, initializer?.ast).node; } // @api function updateBindingElement(node: BindingElement, dotDotDotToken: DotDotDotToken | undefined, propertyName: PropertyName | undefined, name: BindingName, initializer: Expression | undefined): BindingElement { - return astFactory.updateBindingElement(asNode(node).ast, asNode(dotDotDotToken)?.ast, asNode(propertyName)?.ast, asNode(name).ast, asNode(initializer)?.ast).node; + return astFactory.updateBindingElement(node.ast, dotDotDotToken?.ast, propertyName?.ast, name.ast, initializer?.ast).node; } // @@ -1922,7 +1922,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateArrayLiteralExpression(node: ArrayLiteralExpression, elements: readonly Expression[]): ArrayLiteralExpression { - return astFactory.updateArrayLiteralExpression(asNode(node).ast, asNodeArray(elements).ast).node; + return astFactory.updateArrayLiteralExpression(node.ast, asNodeArray(elements).ast).node; } // @api @@ -1932,107 +1932,107 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateObjectLiteralExpression(node: ObjectLiteralExpression, properties: readonly ObjectLiteralElementLike[]): ObjectLiteralExpression { - return astFactory.updateObjectLiteralExpression(asNode(node).ast, asNodeArray(properties).ast).node; + return astFactory.updateObjectLiteralExpression(node.ast, asNodeArray(properties).ast).node; } // @api function createPropertyAccessExpression(expression: Expression, name: string | Identifier | PrivateIdentifier): PropertyAccessExpression { - return astFactory.createPropertyAccessExpression(asNode(expression).ast, asName(name).ast).node; + return astFactory.createPropertyAccessExpression(expression.ast, asName(name).ast).node; } // @api function updatePropertyAccessExpression(node: PropertyAccessExpression, expression: Expression, name: Identifier | PrivateIdentifier): PropertyAccessExpression { - return astFactory.updatePropertyAccessExpression(asNode(node).ast, asNode(expression).ast, asNode(name).ast).node; + return astFactory.updatePropertyAccessExpression(node.ast, expression.ast, name.ast).node; } // @api function createPropertyAccessChain(expression: Expression, questionDotToken: QuestionDotToken | undefined, name: string | Identifier | PrivateIdentifier): PropertyAccessChain { - return astFactory.createPropertyAccessChain(asNode(expression).ast, asNode(questionDotToken)?.ast, asName(name).ast).node; + return astFactory.createPropertyAccessChain(expression.ast, questionDotToken?.ast, asName(name).ast).node; } // @api function updatePropertyAccessChain(node: PropertyAccessChain, expression: Expression, questionDotToken: QuestionDotToken | undefined, name: Identifier | PrivateIdentifier): PropertyAccessChain { - return astFactory.updatePropertyAccessChain(asNode(node).ast, asNode(expression).ast, asNode(questionDotToken)?.ast, asNode(name).ast).node; + return astFactory.updatePropertyAccessChain(node.ast, expression.ast, questionDotToken?.ast, name.ast).node; } // @api function createElementAccessExpression(expression: Expression, index: number | Expression): ElementAccessExpression { - return astFactory.createElementAccessExpression(asNode(expression).ast, asExpression(index).ast).node; + return astFactory.createElementAccessExpression(expression.ast, asExpression(index).ast).node; } // @api function updateElementAccessExpression(node: ElementAccessExpression, expression: Expression, argumentExpression: Expression): ElementAccessExpression { - return astFactory.updateElementAccessExpression(asNode(node).ast, asNode(expression).ast, asNode(argumentExpression).ast).node; + return astFactory.updateElementAccessExpression(node.ast, expression.ast, argumentExpression.ast).node; } // @api function createElementAccessChain(expression: Expression, questionDotToken: QuestionDotToken | undefined, index: number | Expression): ElementAccessChain { - return astFactory.createElementAccessChain(asNode(expression).ast, asNode(questionDotToken)?.ast, asExpression(index).ast).node; + return astFactory.createElementAccessChain(expression.ast, questionDotToken?.ast, asExpression(index).ast).node; } // @api function updateElementAccessChain(node: ElementAccessChain, expression: Expression, questionDotToken: QuestionDotToken | undefined, argumentExpression: Expression): ElementAccessChain { - return astFactory.updateElementAccessChain(asNode(node).ast, asNode(expression).ast, asNode(questionDotToken)?.ast, asNode(argumentExpression).ast).node; + return astFactory.updateElementAccessChain(node.ast, expression.ast, questionDotToken?.ast, argumentExpression.ast).node; } // @api function createCallExpression(expression: Expression, typeArguments: readonly TypeNode[] | undefined, argumentsArray: readonly Expression[] | undefined): CallExpression { - return astFactory.createCallExpression(asNode(expression).ast, asNodeArray(typeArguments)?.ast, asNodeArray(argumentsArray)?.ast).node; + return astFactory.createCallExpression(expression.ast, asNodeArray(typeArguments)?.ast, asNodeArray(argumentsArray)?.ast).node; } // @api function updateCallExpression(node: CallExpression, expression: Expression, typeArguments: readonly TypeNode[] | undefined, argumentsArray: readonly Expression[]): CallExpression { - return astFactory.updateCallExpression(asNode(node).ast, asNode(expression).ast, asNodeArray(typeArguments)?.ast, asNodeArray(argumentsArray).ast).node; + return astFactory.updateCallExpression(node.ast, expression.ast, asNodeArray(typeArguments)?.ast, asNodeArray(argumentsArray).ast).node; } // @api function createCallChain(expression: Expression, questionDotToken: QuestionDotToken | undefined, typeArguments: readonly TypeNode[] | undefined, argumentsArray: readonly Expression[] | undefined): CallChain { - return astFactory.createCallChain(asNode(expression).ast, asNode(questionDotToken)?.ast, asNodeArray(typeArguments)?.ast, asNodeArray(argumentsArray)?.ast).node; + return astFactory.createCallChain(expression.ast, questionDotToken?.ast, asNodeArray(typeArguments)?.ast, asNodeArray(argumentsArray)?.ast).node; } // @api function updateCallChain(node: CallChain, expression: Expression, questionDotToken: QuestionDotToken | undefined, typeArguments: readonly TypeNode[] | undefined, argumentsArray: readonly Expression[]): CallChain { - return astFactory.updateCallChain(asNode(node).ast, asNode(expression).ast, asNode(questionDotToken)?.ast, asNodeArray(typeArguments)?.ast, asNodeArray(argumentsArray).ast).node; + return astFactory.updateCallChain(node.ast, expression.ast, questionDotToken?.ast, asNodeArray(typeArguments)?.ast, asNodeArray(argumentsArray).ast).node; } // @api function createNewExpression(expression: Expression, typeArguments: readonly TypeNode[] | undefined, argumentsArray: readonly Expression[] | undefined): NewExpression { - return astFactory.createNewExpression(asNode(expression).ast, asNodeArray(typeArguments)?.ast, asNodeArray(argumentsArray)?.ast).node; + return astFactory.createNewExpression(expression.ast, asNodeArray(typeArguments)?.ast, asNodeArray(argumentsArray)?.ast).node; } // @api function updateNewExpression(node: NewExpression, expression: Expression, typeArguments: readonly TypeNode[] | undefined, argumentsArray: readonly Expression[] | undefined): NewExpression { - return astFactory.updateNewExpression(asNode(node).ast, asNode(expression).ast, asNodeArray(typeArguments)?.ast, asNodeArray(argumentsArray)?.ast).node; + return astFactory.updateNewExpression(node.ast, expression.ast, asNodeArray(typeArguments)?.ast, asNodeArray(argumentsArray)?.ast).node; } // @api function createTaggedTemplateExpression(tag: Expression, typeArguments: readonly TypeNode[] | undefined, template: TemplateLiteral): TaggedTemplateExpression { - return astFactory.createTaggedTemplateExpression(asNode(tag).ast, asNodeArray(typeArguments)?.ast, asNode(template).ast).node; + return astFactory.createTaggedTemplateExpression(tag.ast, asNodeArray(typeArguments)?.ast, template.ast).node; } // @api function updateTaggedTemplateExpression(node: TaggedTemplateExpression, tag: Expression, typeArguments: readonly TypeNode[] | undefined, template: TemplateLiteral): TaggedTemplateExpression { - return astFactory.updateTaggedTemplateExpression(asNode(node).ast, asNode(tag).ast, asNodeArray(typeArguments)?.ast, asNode(template).ast).node; + return astFactory.updateTaggedTemplateExpression(node.ast, tag.ast, asNodeArray(typeArguments)?.ast, template.ast).node; } // @api - function createTypeAssertion(type: TypeNode, expression: Expression): TypeAssertion { - return astFactory.createTypeAssertion(asNode(type).ast, asNode(expression).ast).node; + function createTypeAssertion(type: TypeNode, expression: Expression): TypeAssertionExpression { + return astFactory.createTypeAssertion(type.ast, expression.ast).node; } // @api - function updateTypeAssertion(node: TypeAssertion, type: TypeNode, expression: Expression): TypeAssertion { - return astFactory.updateTypeAssertion(asNode(node).ast, asNode(type).ast, asNode(expression).ast).node; + function updateTypeAssertion(node: TypeAssertionExpression, type: TypeNode, expression: Expression): TypeAssertionExpression { + return astFactory.updateTypeAssertion(node.ast, type.ast, expression.ast).node; } // @api function createParenthesizedExpression(expression: Expression): ParenthesizedExpression { - return astFactory.createParenthesizedExpression(asNode(expression).ast).node; + return astFactory.createParenthesizedExpression(expression.ast).node; } // @api function updateParenthesizedExpression(node: ParenthesizedExpression, expression: Expression): ParenthesizedExpression { - return astFactory.updateParenthesizedExpression(asNode(node).ast, asNode(expression).ast).node; + return astFactory.updateParenthesizedExpression(node.ast, expression.ast).node; } // @api @@ -2045,7 +2045,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: type: TypeNode | undefined, body: Block, ): FunctionExpression { - return astFactory.createFunctionExpression(asNodeArray(modifiers)?.ast, asNode(asteriskToken)?.ast, asName(name)?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters)?.ast, asNode(type)?.ast, asNode(body).ast).node; + return astFactory.createFunctionExpression(asNodeArray(modifiers)?.ast, asteriskToken?.ast, asName(name)?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters)?.ast, type?.ast, body.ast).node; } // @api @@ -2059,7 +2059,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: type: TypeNode | undefined, body: Block, ): FunctionExpression { - return astFactory.updateFunctionExpression(asNode(node).ast, asNodeArray(modifiers)?.ast, asNode(asteriskToken)?.ast, asNode(name)?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, asNode(type)?.ast, asNode(body).ast).node; + return astFactory.updateFunctionExpression(node.ast, asNodeArray(modifiers)?.ast, asteriskToken?.ast, name?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, type?.ast, body.ast).node; } // @api @@ -2071,7 +2071,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: equalsGreaterThanToken: EqualsGreaterThanToken | undefined, body: ConciseBody, ): ArrowFunction { - return astFactory.createArrowFunction(asNodeArray(modifiers)?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, asNode(type)?.ast, asNode(equalsGreaterThanToken)?.ast, asNode(body).ast).node; + return astFactory.createArrowFunction(asNodeArray(modifiers)?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, type?.ast, equalsGreaterThanToken?.ast, body.ast).node; } // @api @@ -2084,82 +2084,82 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: equalsGreaterThanToken: EqualsGreaterThanToken, body: ConciseBody, ): ArrowFunction { - return astFactory.updateArrowFunction(asNode(node).ast, asNodeArray(modifiers)?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, asNode(type)?.ast, asNode(equalsGreaterThanToken).ast, asNode(body).ast).node; + return astFactory.updateArrowFunction(node.ast, asNodeArray(modifiers)?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, type?.ast, equalsGreaterThanToken.ast, body.ast).node; } // @api function createDeleteExpression(expression: Expression): DeleteExpression { - return astFactory.createDeleteExpression(asNode(expression).ast).node; + return astFactory.createDeleteExpression(expression.ast).node; } // @api function updateDeleteExpression(node: DeleteExpression, expression: Expression): DeleteExpression { - return astFactory.updateDeleteExpression(asNode(node).ast, asNode(expression).ast).node; + return astFactory.updateDeleteExpression(node.ast, expression.ast).node; } // @api function createTypeOfExpression(expression: Expression): TypeOfExpression { - return astFactory.createTypeOfExpression(asNode(expression).ast).node; + return astFactory.createTypeOfExpression(expression.ast).node; } // @api function updateTypeOfExpression(node: TypeOfExpression, expression: Expression): TypeOfExpression { - return astFactory.updateTypeOfExpression(asNode(node).ast, asNode(expression).ast).node; + return astFactory.updateTypeOfExpression(node.ast, expression.ast).node; } // @api function createVoidExpression(expression: Expression): VoidExpression { - return astFactory.createVoidExpression(asNode(expression).ast).node; + return astFactory.createVoidExpression(expression.ast).node; } // @api function updateVoidExpression(node: VoidExpression, expression: Expression): VoidExpression { - return astFactory.updateVoidExpression(asNode(node).ast, asNode(expression).ast).node; + return astFactory.updateVoidExpression(node.ast, expression.ast).node; } // @api function createAwaitExpression(expression: Expression): AwaitExpression { - return astFactory.createAwaitExpression(asNode(expression).ast).node; + return astFactory.createAwaitExpression(expression.ast).node; } // @api function updateAwaitExpression(node: AwaitExpression, expression: Expression): AwaitExpression { - return astFactory.updateAwaitExpression(asNode(node).ast, asNode(expression).ast).node; + return astFactory.updateAwaitExpression(node.ast, expression.ast).node; } // @api function createPrefixUnaryExpression(operator: PrefixUnaryOperator, operand: Expression): PrefixUnaryExpression { - return astFactory.createPrefixUnaryExpression(operator, asNode(operand).ast).node; + return astFactory.createPrefixUnaryExpression(operator, operand.ast).node; } // @api function updatePrefixUnaryExpression(node: PrefixUnaryExpression, operand: Expression): PrefixUnaryExpression { - return astFactory.updatePrefixUnaryExpression(asNode(node).ast, asNode(operand).ast).node; + return astFactory.updatePrefixUnaryExpression(node.ast, operand.ast).node; } // @api function createPostfixUnaryExpression(operand: Expression, operator: PostfixUnaryOperator): PostfixUnaryExpression { - return astFactory.createPostfixUnaryExpression(asNode(operand).ast, operator).node; + return astFactory.createPostfixUnaryExpression(operand.ast, operator).node; } // @api function updatePostfixUnaryExpression(node: PostfixUnaryExpression, operand: Expression): PostfixUnaryExpression { - return astFactory.updatePostfixUnaryExpression(asNode(node).ast, asNode(operand).ast).node; + return astFactory.updatePostfixUnaryExpression(node.ast, operand.ast).node; } // @api function createBinaryExpression(left: Expression, operator: BinaryOperator | BinaryOperatorToken, right: Expression): BinaryExpression { - return astFactory.createBinaryExpression(asNode(left).ast, asToken(operator).ast, asNode(right).ast).node; + return astFactory.createBinaryExpression(left.ast, asToken(operator).ast, right.ast).node; } // @api function updateBinaryExpression(node: BinaryExpression, left: Expression, operator: BinaryOperatorToken, right: Expression): BinaryExpression { - return astFactory.updateBinaryExpression(asNode(node).ast, asNode(left).ast, asNode(operator).ast, asNode(right).ast).node; + return astFactory.updateBinaryExpression(node.ast, left.ast, operator.ast, right.ast).node; } // @api function createConditionalExpression(condition: Expression, questionToken: QuestionToken | undefined, whenTrue: Expression, colonToken: ColonToken | undefined, whenFalse: Expression): ConditionalExpression { - return astFactory.createConditionalExpression(asNode(condition).ast, asNode(questionToken)?.ast, asNode(whenTrue).ast, asNode(colonToken)?.ast, asNode(whenFalse).ast).node; + return astFactory.createConditionalExpression(condition.ast, questionToken?.ast, whenTrue.ast, colonToken?.ast, whenFalse.ast).node; } // @api @@ -2171,17 +2171,17 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: colonToken: Token, whenFalse: Expression, ): ConditionalExpression { - return astFactory.updateConditionalExpression(asNode(node).ast, asNode(condition).ast, asNode(questionToken).ast, asNode(whenTrue).ast, asNode(colonToken).ast, asNode(whenFalse).ast).node; + return astFactory.updateConditionalExpression(node.ast, condition.ast, questionToken.ast, whenTrue.ast, colonToken.ast, whenFalse.ast).node; } // @api function createTemplateExpression(head: TemplateHead, templateSpans: readonly TemplateSpan[]): TemplateExpression { - return astFactory.createTemplateExpression(asNode(head).ast, asNodeArray(templateSpans).ast).node; + return astFactory.createTemplateExpression(head.ast, asNodeArray(templateSpans).ast).node; } // @api function updateTemplateExpression(node: TemplateExpression, head: TemplateHead, templateSpans: readonly TemplateSpan[]): TemplateExpression { - return astFactory.updateTemplateExpression(asNode(node).ast, asNode(head).ast, asNodeArray(templateSpans).ast).node; + return astFactory.updateTemplateExpression(node.ast, head.ast, asNodeArray(templateSpans).ast).node; } // @api @@ -2211,22 +2211,22 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function createYieldExpression(asteriskToken: AsteriskToken | undefined, expression: Expression | undefined): YieldExpression { - return astFactory.createYieldExpression(asNode(asteriskToken)?.ast, asNode(expression)?.ast).node; + return astFactory.createYieldExpression(asteriskToken?.ast, expression?.ast).node; } // @api function updateYieldExpression(node: YieldExpression, asteriskToken: AsteriskToken | undefined, expression: Expression | undefined): YieldExpression { - return astFactory.updateYieldExpression(asNode(node).ast, asNode(asteriskToken)?.ast, asNode(expression)?.ast).node; + return astFactory.updateYieldExpression(node.ast, asteriskToken?.ast, expression?.ast).node; } // @api function createSpreadElement(expression: Expression): SpreadElement { - return astFactory.createSpreadElement(asNode(expression).ast).node; + return astFactory.createSpreadElement(expression.ast).node; } // @api function updateSpreadElement(node: SpreadElement, expression: Expression): SpreadElement { - return astFactory.updateSpreadElement(asNode(node).ast, asNode(expression).ast).node; + return astFactory.updateSpreadElement(node.ast, expression.ast).node; } // @api @@ -2249,7 +2249,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: heritageClauses: readonly HeritageClause[] | undefined, members: readonly ClassElement[], ): ClassExpression { - return astFactory.updateClassExpression(asNode(node).ast, asNodeArray(modifiers)?.ast, asNode(name)?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(heritageClauses)?.ast, asNodeArray(members).ast).node; + return astFactory.updateClassExpression(node.ast, asNodeArray(modifiers)?.ast, name?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(heritageClauses)?.ast, asNodeArray(members).ast).node; } // @api @@ -2259,62 +2259,62 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function createExpressionWithTypeArguments(expression: Expression, typeArguments: readonly TypeNode[] | undefined): ExpressionWithTypeArguments { - return astFactory.createExpressionWithTypeArguments(asNode(expression).ast, asNodeArray(typeArguments)?.ast).node; + return astFactory.createExpressionWithTypeArguments(expression.ast, asNodeArray(typeArguments)?.ast).node; } // @api function updateExpressionWithTypeArguments(node: ExpressionWithTypeArguments, expression: Expression, typeArguments: readonly TypeNode[] | undefined): ExpressionWithTypeArguments { - return astFactory.updateExpressionWithTypeArguments(asNode(node).ast, asNode(expression).ast, asNodeArray(typeArguments)?.ast).node; + return astFactory.updateExpressionWithTypeArguments(node.ast, expression.ast, asNodeArray(typeArguments)?.ast).node; } // @api function createAsExpression(expression: Expression, type: TypeNode): AsExpression { - return astFactory.createAsExpression(asNode(expression).ast, asNode(type).ast).node; + return astFactory.createAsExpression(expression.ast, type.ast).node; } // @api function updateAsExpression(node: AsExpression, expression: Expression, type: TypeNode): AsExpression { - return astFactory.updateAsExpression(asNode(node).ast, asNode(expression).ast, asNode(type).ast).node; + return astFactory.updateAsExpression(node.ast, expression.ast, type.ast).node; } // @api function createNonNullExpression(expression: Expression): NonNullExpression { - return astFactory.createNonNullExpression(asNode(expression).ast).node; + return astFactory.createNonNullExpression(expression.ast).node; } // @api function updateNonNullExpression(node: NonNullExpression, expression: Expression): NonNullExpression { - return astFactory.updateNonNullExpression(asNode(node).ast, asNode(expression).ast).node; + return astFactory.updateNonNullExpression(node.ast, expression.ast).node; } // @api function createSatisfiesExpression(expression: Expression, type: TypeNode): SatisfiesExpression { - return astFactory.createSatisfiesExpression(asNode(expression).ast, asNode(type).ast).node; + return astFactory.createSatisfiesExpression(expression.ast, type.ast).node; } // @api function updateSatisfiesExpression(node: SatisfiesExpression, expression: Expression, type: TypeNode): SatisfiesExpression { - return astFactory.updateSatisfiesExpression(asNode(node).ast, asNode(expression).ast, asNode(type).ast).node; + return astFactory.updateSatisfiesExpression(node.ast, expression.ast, type.ast).node; } // @api function createNonNullChain(expression: Expression): NonNullChain { - return astFactory.createNonNullChain(asNode(expression).ast).node; + return astFactory.createNonNullChain(expression.ast).node; } // @api function updateNonNullChain(node: NonNullChain, expression: Expression): NonNullChain { - return astFactory.updateNonNullChain(asNode(node).ast, asNode(expression).ast).node; + return astFactory.updateNonNullChain(node.ast, expression.ast).node; } // @api function createMetaProperty(keywordToken: MetaProperty["keywordToken"], name: Identifier): MetaProperty { - return astFactory.createMetaProperty(keywordToken, asNode(name).ast).node; + return astFactory.createMetaProperty(keywordToken, name.ast).node; } // @api function updateMetaProperty(node: MetaProperty, name: Identifier): MetaProperty { - return astFactory.updateMetaProperty(asNode(node).ast, asNode(name).ast).node; + return astFactory.updateMetaProperty(node.ast, name.ast).node; } // @@ -2323,12 +2323,12 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function createTemplateSpan(expression: Expression, literal: TemplateMiddle | TemplateTail): TemplateSpan { - return astFactory.createTemplateSpan(asNode(expression).ast, asNode(literal).ast).node; + return astFactory.createTemplateSpan(expression.ast, literal.ast).node; } // @api function updateTemplateSpan(node: TemplateSpan, expression: Expression, literal: TemplateMiddle | TemplateTail): TemplateSpan { - return astFactory.updateTemplateSpan(asNode(node).ast, asNode(expression).ast, asNode(literal).ast).node; + return astFactory.updateTemplateSpan(node.ast, expression.ast, literal.ast).node; } // @api @@ -2347,17 +2347,17 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateBlock(node: Block, statements: readonly Statement[]): Block { - return astFactory.updateBlock(asNode(node).ast, asNodeArray(statements).ast).node; + return astFactory.updateBlock(node.ast, asNodeArray(statements).ast).node; } // @api function createVariableStatement(modifiers: readonly ModifierLike[] | undefined, declarationList: VariableDeclarationList | readonly VariableDeclaration[]): VariableStatement { - return astFactory.createVariableStatement(asNodeArray(modifiers)?.ast, isArray(declarationList) ? asNodeArray(declarationList).ast : asNode(declarationList).ast).node; + return astFactory.createVariableStatement(asNodeArray(modifiers)?.ast, isArray(declarationList) ? asNodeArray(declarationList).ast : declarationList.ast).node; } // @api function updateVariableStatement(node: VariableStatement, modifiers: readonly ModifierLike[] | undefined, declarationList: VariableDeclarationList): VariableStatement { - return astFactory.updateVariableStatement(asNode(node).ast, asNodeArray(modifiers)?.ast, asNode(declarationList).ast).node; + return astFactory.updateVariableStatement(node.ast, asNodeArray(modifiers)?.ast, declarationList.ast).node; } // @api @@ -2367,72 +2367,72 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function createExpressionStatement(expression: Expression): ExpressionStatement { - return astFactory.createExpressionStatement(asNode(expression).ast).node; + return astFactory.createExpressionStatement(expression.ast).node; } // @api function updateExpressionStatement(node: ExpressionStatement, expression: Expression): ExpressionStatement { - return astFactory.updateExpressionStatement(asNode(node).ast, asNode(expression).ast).node; + return astFactory.updateExpressionStatement(node.ast, expression.ast).node; } // @api function createIfStatement(expression: Expression, thenStatement: Statement, elseStatement?: Statement): IfStatement { - return astFactory.createIfStatement(asNode(expression).ast, asNode(thenStatement).ast, asNode(elseStatement)?.ast).node; + return astFactory.createIfStatement(expression.ast, thenStatement.ast, elseStatement?.ast).node; } // @api function updateIfStatement(node: IfStatement, expression: Expression, thenStatement: Statement, elseStatement: Statement | undefined): IfStatement { - return astFactory.updateIfStatement(asNode(node).ast, asNode(expression).ast, asNode(thenStatement).ast, asNode(elseStatement)?.ast).node; + return astFactory.updateIfStatement(node.ast, expression.ast, thenStatement.ast, elseStatement?.ast).node; } // @api function createDoStatement(statement: Statement, expression: Expression): DoStatement { - return astFactory.createDoStatement(asNode(statement).ast, asNode(expression).ast).node; + return astFactory.createDoStatement(statement.ast, expression.ast).node; } // @api function updateDoStatement(node: DoStatement, statement: Statement, expression: Expression): DoStatement { - return astFactory.updateDoStatement(asNode(node).ast, asNode(statement).ast, asNode(expression).ast).node; + return astFactory.updateDoStatement(node.ast, statement.ast, expression.ast).node; } // @api function createWhileStatement(expression: Expression, statement: Statement): WhileStatement { - return astFactory.createWhileStatement(asNode(expression).ast, asNode(statement).ast).node; + return astFactory.createWhileStatement(expression.ast, statement.ast).node; } // @api function updateWhileStatement(node: WhileStatement, expression: Expression, statement: Statement): WhileStatement { - return astFactory.updateWhileStatement(asNode(node).ast, asNode(expression).ast, asNode(statement).ast).node; + return astFactory.updateWhileStatement(node.ast, expression.ast, statement.ast).node; } // @api function createForStatement(initializer: ForInitializer | undefined, condition: Expression | undefined, incrementor: Expression | undefined, statement: Statement): ForStatement { - return astFactory.createForStatement(asNode(initializer)?.ast, asNode(condition)?.ast, asNode(incrementor)?.ast, asNode(statement).ast).node; + return astFactory.createForStatement(initializer?.ast, condition?.ast, incrementor?.ast, statement.ast).node; } // @api function updateForStatement(node: ForStatement, initializer: ForInitializer | undefined, condition: Expression | undefined, incrementor: Expression | undefined, statement: Statement): ForStatement { - return astFactory.updateForStatement(asNode(node).ast, asNode(initializer)?.ast, asNode(condition)?.ast, asNode(incrementor)?.ast, asNode(statement).ast).node; + return astFactory.updateForStatement(node.ast, initializer?.ast, condition?.ast, incrementor?.ast, statement.ast).node; } // @api function createForInStatement(initializer: ForInitializer, expression: Expression, statement: Statement): ForInStatement { - return astFactory.createForInStatement(asNode(initializer).ast, asNode(expression).ast, asNode(statement).ast).node; + return astFactory.createForInStatement(initializer.ast, expression.ast, statement.ast).node; } // @api function updateForInStatement(node: ForInStatement, initializer: ForInitializer, expression: Expression, statement: Statement): ForInStatement { - return astFactory.updateForInStatement(asNode(node).ast, asNode(initializer).ast, asNode(expression).ast, asNode(statement).ast).node; + return astFactory.updateForInStatement(node.ast, initializer.ast, expression.ast, statement.ast).node; } // @api function createForOfStatement(awaitModifier: AwaitKeyword | undefined, initializer: ForInitializer, expression: Expression, statement: Statement): ForOfStatement { - return astFactory.createForOfStatement(asNode(awaitModifier)?.ast, asNode(initializer).ast, asNode(expression).ast, asNode(statement).ast).node; + return astFactory.createForOfStatement(awaitModifier?.ast, initializer.ast, expression.ast, statement.ast).node; } // @api function updateForOfStatement(node: ForOfStatement, awaitModifier: AwaitKeyword | undefined, initializer: ForInitializer, expression: Expression, statement: Statement): ForOfStatement { - return astFactory.updateForOfStatement(asNode(node).ast, asNode(awaitModifier)?.ast, asNode(initializer).ast, asNode(expression).ast, asNode(statement).ast).node; + return astFactory.updateForOfStatement(node.ast, awaitModifier?.ast, initializer.ast, expression.ast, statement.ast).node; } // @api @@ -2442,7 +2442,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateContinueStatement(node: ContinueStatement, label: Identifier | undefined): ContinueStatement { - return astFactory.updateContinueStatement(asNode(node).ast, asNode(label)?.ast).node; + return astFactory.updateContinueStatement(node.ast, label?.ast).node; } // @api @@ -2452,67 +2452,67 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateBreakStatement(node: BreakStatement, label: Identifier | undefined): BreakStatement { - return astFactory.updateBreakStatement(asNode(node).ast, asNode(label)?.ast).node; + return astFactory.updateBreakStatement(node.ast, label?.ast).node; } // @api function createReturnStatement(expression?: Expression): ReturnStatement { - return astFactory.createReturnStatement(asNode(expression)?.ast).node; + return astFactory.createReturnStatement(expression?.ast).node; } // @api function updateReturnStatement(node: ReturnStatement, expression: Expression | undefined): ReturnStatement { - return astFactory.updateReturnStatement(asNode(node).ast, asNode(expression)?.ast).node; + return astFactory.updateReturnStatement(node.ast, expression?.ast).node; } // @api function createWithStatement(expression: Expression, statement: Statement): WithStatement { - return astFactory.createWithStatement(asNode(expression).ast, asNode(statement).ast).node; + return astFactory.createWithStatement(expression.ast, statement.ast).node; } // @api function updateWithStatement(node: WithStatement, expression: Expression, statement: Statement): WithStatement { - return astFactory.updateWithStatement(asNode(node).ast, asNode(expression).ast, asNode(statement).ast).node; + return astFactory.updateWithStatement(node.ast, expression.ast, statement.ast).node; } // @api function createSwitchStatement(expression: Expression, caseBlock: CaseBlock): SwitchStatement { - return astFactory.createSwitchStatement(asNode(expression).ast, asNode(caseBlock).ast).node; + return astFactory.createSwitchStatement(expression.ast, caseBlock.ast).node; } // @api function updateSwitchStatement(node: SwitchStatement, expression: Expression, caseBlock: CaseBlock): SwitchStatement { - return astFactory.updateSwitchStatement(asNode(node).ast, asNode(expression).ast, asNode(caseBlock).ast).node; + return astFactory.updateSwitchStatement(node.ast, expression.ast, caseBlock.ast).node; } // @api function createLabeledStatement(label: string | Identifier, statement: Statement): LabeledStatement { - return astFactory.createLabeledStatement(asName(label).ast, asNode(statement).ast).node; + return astFactory.createLabeledStatement(asName(label).ast, statement.ast).node; } // @api function updateLabeledStatement(node: LabeledStatement, label: Identifier, statement: Statement): LabeledStatement { - return astFactory.updateLabeledStatement(asNode(node).ast, asNode(label).ast, asNode(statement).ast).node; + return astFactory.updateLabeledStatement(node.ast, label.ast, statement.ast).node; } // @api function createThrowStatement(expression: Expression): ThrowStatement { - return astFactory.createThrowStatement(asNode(expression).ast).node; + return astFactory.createThrowStatement(expression.ast).node; } // @api function updateThrowStatement(node: ThrowStatement, expression: Expression): ThrowStatement { - return astFactory.updateThrowStatement(asNode(node).ast, asNode(expression).ast).node; + return astFactory.updateThrowStatement(node.ast, expression.ast).node; } // @api function createTryStatement(tryBlock: Block, catchClause: CatchClause | undefined, finallyBlock: Block | undefined): TryStatement { - return astFactory.createTryStatement(asNode(tryBlock).ast, asNode(catchClause)?.ast, asNode(finallyBlock)?.ast).node; + return astFactory.createTryStatement(tryBlock.ast, catchClause?.ast, finallyBlock?.ast).node; } // @api function updateTryStatement(node: TryStatement, tryBlock: Block, catchClause: CatchClause | undefined, finallyBlock: Block | undefined): TryStatement { - return astFactory.updateTryStatement(asNode(node).ast, asNode(tryBlock).ast, asNode(catchClause)?.ast, asNode(finallyBlock)?.ast).node; + return astFactory.updateTryStatement(node.ast, tryBlock.ast, catchClause?.ast, finallyBlock?.ast).node; } // @api @@ -2522,12 +2522,12 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function createVariableDeclaration(name: string | BindingName, exclamationToken: ExclamationToken | undefined, type: TypeNode | undefined, initializer: Expression | undefined): VariableDeclaration { - return astFactory.createVariableDeclaration(asName(name).ast, asNode(exclamationToken)?.ast, asNode(type)?.ast, asNode(initializer)?.ast).node; + return astFactory.createVariableDeclaration(asName(name).ast, exclamationToken?.ast, type?.ast, initializer?.ast).node; } // @api function updateVariableDeclaration(node: VariableDeclaration, name: BindingName, exclamationToken: ExclamationToken | undefined, type: TypeNode | undefined, initializer: Expression | undefined): VariableDeclaration { - return astFactory.updateVariableDeclaration(asNode(node).ast, asNode(name).ast, asNode(exclamationToken)?.ast, asNode(type)?.ast, asNode(initializer)?.ast).node; + return astFactory.updateVariableDeclaration(node.ast, name.ast, exclamationToken?.ast, type?.ast, initializer?.ast).node; } // @api @@ -2537,7 +2537,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateVariableDeclarationList(node: VariableDeclarationList, declarations: readonly VariableDeclaration[]): VariableDeclarationList { - return astFactory.updateVariableDeclarationList(asNode(node).ast, asNodeArray(declarations).ast).node; + return astFactory.updateVariableDeclarationList(node.ast, asNodeArray(declarations).ast).node; } // @api @@ -2550,7 +2550,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: type: TypeNode | undefined, body: Block | undefined, ): FunctionDeclaration { - return astFactory.createFunctionDeclaration(asNodeArray(modifiers)?.ast, asNode(asteriskToken)?.ast, asName(name)?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, asNode(type)?.ast, asNode(body)?.ast).node; + return astFactory.createFunctionDeclaration(asNodeArray(modifiers)?.ast, asteriskToken?.ast, asName(name)?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, type?.ast, body?.ast).node; } // @api @@ -2564,7 +2564,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: type: TypeNode | undefined, body: Block | undefined, ): FunctionDeclaration { - return astFactory.updateFunctionDeclaration(asNode(node).ast, asNodeArray(modifiers)?.ast, asNode(asteriskToken)?.ast, asNode(name)?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, asNode(type)?.ast, asNode(body)?.ast).node; + return astFactory.updateFunctionDeclaration(node.ast, asNodeArray(modifiers)?.ast, asteriskToken?.ast, name?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, type?.ast, body?.ast).node; } // @api @@ -2587,7 +2587,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: heritageClauses: readonly HeritageClause[] | undefined, members: readonly ClassElement[], ): ClassDeclaration { - return astFactory.updateClassDeclaration(asNode(node).ast, asNodeArray(modifiers)?.ast, asNode(name)?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(heritageClauses)?.ast, asNodeArray(members).ast).node; + return astFactory.updateClassDeclaration(node.ast, asNodeArray(modifiers)?.ast, name?.ast, asNodeArray(typeParameters)?.ast, asNodeArray(heritageClauses)?.ast, asNodeArray(members).ast).node; } // @api @@ -2610,7 +2610,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: heritageClauses: readonly HeritageClause[] | undefined, members: readonly TypeElement[], ): InterfaceDeclaration { - return astFactory.updateInterfaceDeclaration(asNode(node).ast, asNodeArray(modifiers)?.ast, asNode(name).ast, asNodeArray(typeParameters)?.ast, asNodeArray(heritageClauses)?.ast, asNodeArray(members).ast).node; + return astFactory.updateInterfaceDeclaration(node.ast, asNodeArray(modifiers)?.ast, name.ast, asNodeArray(typeParameters)?.ast, asNodeArray(heritageClauses)?.ast, asNodeArray(members).ast).node; } // @api @@ -2620,7 +2620,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: typeParameters: readonly TypeParameterDeclaration[] | undefined, type: TypeNode, ): TypeAliasDeclaration { - return astFactory.createTypeAliasDeclaration(asNodeArray(modifiers)?.ast, asName(name).ast, asNodeArray(typeParameters)?.ast, asNode(type).ast).node; + return astFactory.createTypeAliasDeclaration(asNodeArray(modifiers)?.ast, asName(name).ast, asNodeArray(typeParameters)?.ast, type.ast).node; } // @api @@ -2631,7 +2631,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: typeParameters: readonly TypeParameterDeclaration[] | undefined, type: TypeNode, ): TypeAliasDeclaration { - return astFactory.updateTypeAliasDeclaration(asNode(node).ast, asNodeArray(modifiers)?.ast, asNode(name).ast, asNodeArray(typeParameters)?.ast, asNode(type).ast).node; + return astFactory.updateTypeAliasDeclaration(node.ast, asNodeArray(modifiers)?.ast, name.ast, asNodeArray(typeParameters)?.ast, type.ast).node; } // @api @@ -2650,7 +2650,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: name: Identifier, members: readonly EnumMember[], ): EnumDeclaration { - return astFactory.updateEnumDeclaration(asNode(node).ast, asNodeArray(modifiers)?.ast, asNode(name).ast, asNodeArray(members).ast).node; + return astFactory.updateEnumDeclaration(node.ast, asNodeArray(modifiers)?.ast, name.ast, asNodeArray(members).ast).node; } // @api @@ -2660,7 +2660,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: body: ModuleBody | undefined, flags = NodeFlags.None, ): ModuleDeclaration { - return astFactory.createModuleDeclaration(asNodeArray(modifiers)?.ast, asNode(name).ast, asNode(body)?.ast, flags).node; + return astFactory.createModuleDeclaration(asNodeArray(modifiers)?.ast, name.ast, body?.ast, flags).node; } // @api @@ -2670,7 +2670,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: name: ModuleName, body: ModuleBody | undefined, ): ModuleDeclaration { - return astFactory.updateModuleDeclaration(asNode(node).ast, asNodeArray(modifiers)?.ast, asNode(name).ast, asNode(body)?.ast).node; + return astFactory.updateModuleDeclaration(node.ast, asNodeArray(modifiers)?.ast, name.ast, body?.ast).node; } // @api @@ -2680,7 +2680,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateModuleBlock(node: ModuleBlock, statements: readonly Statement[]) { - return astFactory.updateModuleBlock(asNode(node).ast, asNodeArray(statements).ast).node; + return astFactory.updateModuleBlock(node.ast, asNodeArray(statements).ast).node; } // @api @@ -2690,7 +2690,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateCaseBlock(node: CaseBlock, clauses: readonly CaseOrDefaultClause[]): CaseBlock { - return astFactory.updateCaseBlock(asNode(node).ast, asNodeArray(clauses).ast).node; + return astFactory.updateCaseBlock(node.ast, asNodeArray(clauses).ast).node; } // @api @@ -2700,7 +2700,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateNamespaceExportDeclaration(node: NamespaceExportDeclaration, name: Identifier): NamespaceExportDeclaration { - return astFactory.updateNamespaceExportDeclaration(asNode(node).ast, asNode(name).ast).node; + return astFactory.updateNamespaceExportDeclaration(node.ast, name.ast).node; } // @api @@ -2710,7 +2710,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: name: string | Identifier, moduleReference: ModuleReference, ): ImportEqualsDeclaration { - return astFactory.createImportEqualsDeclaration(asNodeArray(modifiers)?.ast, isTypeOnly, asName(name).ast, asNode(moduleReference).ast).node; + return astFactory.createImportEqualsDeclaration(asNodeArray(modifiers)?.ast, isTypeOnly, asName(name).ast, moduleReference.ast).node; } // @api @@ -2721,7 +2721,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: name: Identifier, moduleReference: ModuleReference, ): ImportEqualsDeclaration { - return astFactory.updateImportEqualsDeclaration(asNode(node).ast, asNodeArray(modifiers)?.ast, isTypeOnly, asNode(name).ast, asNode(moduleReference).ast).node; + return astFactory.updateImportEqualsDeclaration(node.ast, asNodeArray(modifiers)?.ast, isTypeOnly, name.ast, moduleReference.ast).node; } // @api @@ -2731,7 +2731,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: moduleSpecifier: Expression, attributes: ImportAttributes | undefined, ): ImportDeclaration { - return astFactory.createImportDeclaration(asNodeArray(modifiers)?.ast, asNode(importClause)?.ast, asNode(moduleSpecifier).ast, asNode(attributes)?.ast).node; + return astFactory.createImportDeclaration(asNodeArray(modifiers)?.ast, importClause?.ast, moduleSpecifier.ast, attributes?.ast).node; } // @api @@ -2742,17 +2742,17 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: moduleSpecifier: Expression, attributes: ImportAttributes | undefined, ): ImportDeclaration { - return astFactory.updateImportDeclaration(asNode(node).ast, asNodeArray(modifiers)?.ast, asNode(importClause)?.ast, asNode(moduleSpecifier).ast, asNode(attributes)?.ast).node; + return astFactory.updateImportDeclaration(node.ast, asNodeArray(modifiers)?.ast, importClause?.ast, moduleSpecifier.ast, attributes?.ast).node; } // @api function createImportClause(isTypeOnly: boolean, name: Identifier | undefined, namedBindings: NamedImportBindings | undefined): ImportClause { - return astFactory.createImportClause(isTypeOnly, asNode(name)?.ast, asNode(namedBindings)?.ast).node; + return astFactory.createImportClause(isTypeOnly, name?.ast, namedBindings?.ast).node; } // @api function updateImportClause(node: ImportClause, isTypeOnly: boolean, name: Identifier | undefined, namedBindings: NamedImportBindings | undefined): ImportClause { - return astFactory.updateImportClause(asNode(node).ast, isTypeOnly, asNode(name)?.ast, asNode(namedBindings)?.ast).node; + return astFactory.updateImportClause(node.ast, isTypeOnly, name?.ast, namedBindings?.ast).node; } // @api @@ -2762,27 +2762,27 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateAssertClause(node: AssertClause, elements: readonly AssertEntry[], multiLine?: boolean): AssertClause { - return astFactory.updateAssertClause(asNode(node).ast, asNodeArray(elements).ast, multiLine).node; + return astFactory.updateAssertClause(node.ast, asNodeArray(elements).ast, multiLine).node; } // @api function createAssertEntry(name: AssertionKey, value: Expression) { - return astFactory.createAssertEntry(asNode(name).ast, asNode(value).ast).node; + return astFactory.createAssertEntry(name.ast, value.ast).node; } // @api function updateAssertEntry(node: AssertEntry, name: AssertionKey, value: Expression) { - return astFactory.updateAssertEntry(asNode(node).ast, asNode(name).ast, asNode(value).ast).node; + return astFactory.updateAssertEntry(node.ast, name.ast, value.ast).node; } // @api function createImportTypeAssertionContainer(clause: AssertClause, multiLine?: boolean): ImportTypeAssertionContainer { - return astFactory.createImportTypeAssertionContainer(asNode(clause).ast, multiLine).node; + return astFactory.createImportTypeAssertionContainer(clause.ast, multiLine).node; } // @api function updateImportTypeAssertionContainer(node: ImportTypeAssertionContainer, clause: AssertClause, multiLine?: boolean): ImportTypeAssertionContainer { - return astFactory.updateImportTypeAssertionContainer(asNode(node).ast, asNode(clause).ast, multiLine).node; + return astFactory.updateImportTypeAssertionContainer(node.ast, clause.ast, multiLine).node; } // @api @@ -2794,37 +2794,37 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateImportAttributes(node: ImportAttributes, elements: readonly ImportAttribute[], multiLine?: boolean): ImportAttributes { - return astFactory.updateImportAttributes(asNode(node).ast, asNodeArray(elements).ast, multiLine).node; + return astFactory.updateImportAttributes(node.ast, asNodeArray(elements).ast, multiLine).node; } // @api function createImportAttribute(name: ImportAttributeName, value: Expression) { - return astFactory.createImportAttribute(asNode(name).ast, asNode(value).ast).node; + return astFactory.createImportAttribute(name.ast, value.ast).node; } // @api function updateImportAttribute(node: ImportAttribute, name: ImportAttributeName, value: Expression) { - return astFactory.updateImportAttribute(asNode(node).ast, asNode(name).ast, asNode(value).ast).node; + return astFactory.updateImportAttribute(node.ast, name.ast, value.ast).node; } // @api function createNamespaceImport(name: Identifier): NamespaceImport { - return astFactory.createNamespaceImport(asNode(name).ast).node; + return astFactory.createNamespaceImport(name.ast).node; } // @api function updateNamespaceImport(node: NamespaceImport, name: Identifier): NamespaceImport { - return astFactory.updateNamespaceImport(asNode(node).ast, asNode(name).ast).node; + return astFactory.updateNamespaceImport(node.ast, name.ast).node; } // @api function createNamespaceExport(name: ModuleExportName): NamespaceExport { - return astFactory.createNamespaceExport(asNode(name).ast).node; + return astFactory.createNamespaceExport(name.ast).node; } // @api function updateNamespaceExport(node: NamespaceExport, name: ModuleExportName): NamespaceExport { - return astFactory.updateNamespaceExport(asNode(node).ast, asNode(name).ast).node; + return astFactory.updateNamespaceExport(node.ast, name.ast).node; } // @api @@ -2834,17 +2834,17 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateNamedImports(node: NamedImports, elements: readonly ImportSpecifier[]): NamedImports { - return astFactory.updateNamedImports(asNode(node).ast, asNodeArray(elements).ast).node; + return astFactory.updateNamedImports(node.ast, asNodeArray(elements).ast).node; } // @api function createImportSpecifier(isTypeOnly: boolean, propertyName: ModuleExportName | undefined, name: Identifier): ImportSpecifier { - return astFactory.createImportSpecifier(isTypeOnly, asNode(propertyName)?.ast, asNode(name).ast).node; + return astFactory.createImportSpecifier(isTypeOnly, propertyName?.ast, name.ast).node; } // @api function updateImportSpecifier(node: ImportSpecifier, isTypeOnly: boolean, propertyName: ModuleExportName | undefined, name: Identifier): ImportSpecifier { - return astFactory.updateImportSpecifier(asNode(node).ast, isTypeOnly, asNode(propertyName)?.ast, asNode(name).ast).node; + return astFactory.updateImportSpecifier(node.ast, isTypeOnly, propertyName?.ast, name.ast).node; } // @api @@ -2853,7 +2853,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: isExportEquals: boolean | undefined, expression: Expression, ): ExportAssignment { - return astFactory.createExportAssignment(asNodeArray(modifiers)?.ast, isExportEquals, asNode(expression).ast).node; + return astFactory.createExportAssignment(asNodeArray(modifiers)?.ast, isExportEquals, expression.ast).node; } // @api @@ -2862,7 +2862,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: modifiers: readonly ModifierLike[] | undefined, expression: Expression, ): ExportAssignment { - return astFactory.updateExportAssignment(asNode(node).ast, asNodeArray(modifiers)?.ast, asNode(expression).ast).node; + return astFactory.updateExportAssignment(node.ast, asNodeArray(modifiers)?.ast, expression.ast).node; } // @api @@ -2873,7 +2873,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: moduleSpecifier?: Expression, attributes?: ImportAttributes, ): ExportDeclaration { - return astFactory.createExportDeclaration(asNodeArray(modifiers)?.ast, isTypeOnly, asNode(exportClause)?.ast, asNode(moduleSpecifier)?.ast, asNode(attributes)?.ast).node; + return astFactory.createExportDeclaration(asNodeArray(modifiers)?.ast, isTypeOnly, exportClause?.ast, moduleSpecifier?.ast, attributes?.ast).node; } // @api @@ -2885,7 +2885,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: moduleSpecifier: Expression | undefined, attributes: ImportAttributes | undefined, ): ExportDeclaration { - return astFactory.updateExportDeclaration(asNode(node).ast, asNodeArray(modifiers)?.ast, isTypeOnly, asNode(exportClause)?.ast, asNode(moduleSpecifier)?.ast, asNode(attributes)?.ast).node; + return astFactory.updateExportDeclaration(node.ast, asNodeArray(modifiers)?.ast, isTypeOnly, exportClause?.ast, moduleSpecifier?.ast, attributes?.ast).node; } // @api @@ -2895,7 +2895,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateNamedExports(node: NamedExports, elements: readonly ExportSpecifier[]): NamedExports { - return astFactory.updateNamedExports(asNode(node).ast, asNodeArray(elements).ast).node; + return astFactory.updateNamedExports(node.ast, asNodeArray(elements).ast).node; } // @api @@ -2905,7 +2905,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateExportSpecifier(node: ExportSpecifier, isTypeOnly: boolean, propertyName: ModuleExportName | undefined, name: ModuleExportName): ExportSpecifier { - return astFactory.updateExportSpecifier(asNode(node).ast, isTypeOnly, asNode(propertyName)?.ast, asNode(name).ast).node; + return astFactory.updateExportSpecifier(node.ast, isTypeOnly, propertyName?.ast, name.ast).node; } // @api @@ -2919,12 +2919,12 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function createExternalModuleReference(expression: Expression): ExternalModuleReference { - return astFactory.createExternalModuleReference(asNode(expression).ast).node; + return astFactory.createExternalModuleReference(expression.ast).node; } // @api function updateExternalModuleReference(node: ExternalModuleReference, expression: Expression): ExternalModuleReference { - return astFactory.updateExternalModuleReference(asNode(node).ast, asNode(expression).ast).node; + return astFactory.updateExternalModuleReference(node.ast, expression.ast).node; } // @@ -2943,63 +2943,63 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function createJSDocNonNullableType(type: TypeNode, postfix = false): JSDocNonNullableType { - return astFactory.createJSDocNonNullableType(asNode(type).ast, postfix).node; + return astFactory.createJSDocNonNullableType(type.ast, postfix).node; } // @api function updateJSDocNonNullableType(node: JSDocNonNullableType, type: TypeNode): JSDocNonNullableType { - return astFactory.updateJSDocNonNullableType(asNode(node).ast, asNode(type).ast).node; + return astFactory.updateJSDocNonNullableType(node.ast, type.ast).node; } // @api function createJSDocNullableType(type: TypeNode, postfix = false): JSDocNullableType { - return astFactory.createJSDocNullableType(asNode(type).ast, postfix).node; + return astFactory.createJSDocNullableType(type.ast, postfix).node; } // @api function updateJSDocNullableType(node: JSDocNullableType, type: TypeNode): JSDocNullableType { - return astFactory.updateJSDocNullableType(asNode(node).ast, asNode(type).ast).node; + return astFactory.updateJSDocNullableType(node.ast, type.ast).node; } // @api function createJSDocOptionalType(type: TypeNode): JSDocOptionalType { - return astFactory.createJSDocOptionalType(asNode(type).ast).node; + return astFactory.createJSDocOptionalType(type.ast).node; } // @api function updateJSDocOptionalType(node: JSDocOptionalType, type: TypeNode): JSDocOptionalType { - return astFactory.updateJSDocOptionalType(asNode(node).ast, asNode(type).ast).node; + return astFactory.updateJSDocOptionalType(node.ast, type.ast).node; } // @api function createJSDocVariadicType(type: TypeNode): JSDocVariadicType { - return astFactory.createJSDocVariadicType(asNode(type).ast).node; + return astFactory.createJSDocVariadicType(type.ast).node; } // @api function updateJSDocVariadicType(node: JSDocVariadicType, type: TypeNode): JSDocVariadicType { - return astFactory.updateJSDocVariadicType(asNode(node).ast, asNode(type).ast).node; + return astFactory.updateJSDocVariadicType(node.ast, type.ast).node; } // @api function createJSDocNamepathType(type: TypeNode): JSDocNamepathType { // NOTE: 'type' can be undefined when this is called by parser. - return astFactory.createJSDocNamepathType(asNode(type)?.ast).node; + return astFactory.createJSDocNamepathType(type?.ast).node; } // @api function updateJSDocNamepathType(node: JSDocNamepathType, type: TypeNode): JSDocNamepathType { - return astFactory.updateJSDocNamepathType(asNode(node).ast, asNode(type).ast).node; + return astFactory.updateJSDocNamepathType(node.ast, type.ast).node; } // @api function createJSDocFunctionType(parameters: readonly ParameterDeclaration[], type: TypeNode | undefined): JSDocFunctionType { - return astFactory.createJSDocFunctionType(asNodeArray(parameters).ast, asNode(type)?.ast).node; + return astFactory.createJSDocFunctionType(asNodeArray(parameters).ast, type?.ast).node; } // @api function updateJSDocFunctionType(node: JSDocFunctionType, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined): JSDocFunctionType { - return astFactory.updateJSDocFunctionType(asNode(node).ast, asNodeArray(parameters).ast, asNode(type)?.ast).node; + return astFactory.updateJSDocFunctionType(node.ast, asNodeArray(parameters).ast, type?.ast).node; } // @api @@ -3009,266 +3009,266 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateJSDocTypeLiteral(node: JSDocTypeLiteral, propertyTags: readonly JSDocPropertyLikeTag[] | undefined, isArrayType: boolean): JSDocTypeLiteral { - return astFactory.updateJSDocTypeLiteral(asNode(node).ast, asNodeArray(propertyTags)?.ast, isArrayType).node; + return astFactory.updateJSDocTypeLiteral(node.ast, asNodeArray(propertyTags)?.ast, isArrayType).node; } // @api function createJSDocTypeExpression(type: TypeNode): JSDocTypeExpression { - return astFactory.createJSDocTypeExpression(asNode(type).ast).node; + return astFactory.createJSDocTypeExpression(type.ast).node; } // @api function updateJSDocTypeExpression(node: JSDocTypeExpression, type: TypeNode): JSDocTypeExpression { - return astFactory.updateJSDocTypeExpression(asNode(node).ast, asNode(type).ast).node; + return astFactory.updateJSDocTypeExpression(node.ast, type.ast).node; } // @api function createJSDocSignature(typeParameters: readonly JSDocTemplateTag[] | undefined, parameters: readonly JSDocParameterTag[], type?: JSDocReturnTag): JSDocSignature { - return astFactory.createJSDocSignature(asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, asNode(type)?.ast).node; + return astFactory.createJSDocSignature(asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, type?.ast).node; } // @api function updateJSDocSignature(node: JSDocSignature, typeParameters: readonly JSDocTemplateTag[] | undefined, parameters: readonly JSDocParameterTag[], type: JSDocReturnTag | undefined): JSDocSignature { - return astFactory.updateJSDocSignature(asNode(node).ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, asNode(type)?.ast).node; + return astFactory.updateJSDocSignature(node.ast, asNodeArray(typeParameters)?.ast, asNodeArray(parameters).ast, type?.ast).node; } // @api function createJSDocTemplateTag(tagName: Identifier | undefined, constraint: JSDocTypeExpression | undefined, typeParameters: readonly TypeParameterDeclaration[], comment?: string | NodeArray): JSDocTemplateTag { - return astFactory.createJSDocTemplateTag(asNode(tagName)?.ast, asNode(constraint)?.ast, asNodeArray(typeParameters).ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.createJSDocTemplateTag(tagName?.ast, constraint?.ast, asNodeArray(typeParameters).ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function updateJSDocTemplateTag(node: JSDocTemplateTag, tagName: Identifier | undefined, constraint: JSDocTypeExpression | undefined, typeParameters: readonly TypeParameterDeclaration[], comment: string | NodeArray | undefined): JSDocTemplateTag { - return astFactory.updateJSDocTemplateTag(asNode(node).ast, asNode(tagName)?.ast, asNode(constraint)?.ast, asNodeArray(typeParameters).ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.updateJSDocTemplateTag(node.ast, tagName?.ast, constraint?.ast, asNodeArray(typeParameters).ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function createJSDocTypedefTag(tagName: Identifier | undefined, typeExpression?: JSDocTypeExpression, fullName?: Identifier | JSDocNamespaceDeclaration, comment?: string | NodeArray): JSDocTypedefTag { - return astFactory.createJSDocTypedefTag(asNode(tagName)?.ast, asNode(typeExpression)?.ast, asNode(fullName)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.createJSDocTypedefTag(tagName?.ast, typeExpression?.ast, fullName?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function updateJSDocTypedefTag(node: JSDocTypedefTag, tagName: Identifier | undefined, typeExpression: JSDocTypeExpression | undefined, fullName: Identifier | JSDocNamespaceDeclaration | undefined, comment: string | NodeArray | undefined): JSDocTypedefTag { - return astFactory.updateJSDocTypedefTag(asNode(node).ast, asNode(tagName)?.ast, asNode(typeExpression)?.ast, asNode(fullName)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.updateJSDocTypedefTag(node.ast, tagName?.ast, typeExpression?.ast, fullName?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function createJSDocParameterTag(tagName: Identifier | undefined, name: EntityName, isBracketed: boolean, typeExpression?: JSDocTypeExpression, isNameFirst?: boolean, comment?: string | NodeArray): JSDocParameterTag { - return astFactory.createJSDocParameterTag(asNode(tagName)?.ast, asNode(name).ast, isBracketed, asNode(typeExpression)?.ast, isNameFirst, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.createJSDocParameterTag(tagName?.ast, name.ast, isBracketed, typeExpression?.ast, isNameFirst, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function updateJSDocParameterTag(node: JSDocParameterTag, tagName: Identifier | undefined, name: EntityName, isBracketed: boolean, typeExpression: JSDocTypeExpression | undefined, isNameFirst: boolean, comment: string | NodeArray | undefined): JSDocParameterTag { - return astFactory.updateJSDocParameterTag(asNode(node).ast, asNode(tagName)?.ast, asNode(name).ast, isBracketed, asNode(typeExpression)?.ast, isNameFirst, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.updateJSDocParameterTag(node.ast, tagName?.ast, name.ast, isBracketed, typeExpression?.ast, isNameFirst, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function createJSDocPropertyTag(tagName: Identifier | undefined, name: EntityName, isBracketed: boolean, typeExpression?: JSDocTypeExpression, isNameFirst?: boolean, comment?: string | NodeArray): JSDocPropertyTag { - return astFactory.createJSDocPropertyTag(asNode(tagName)?.ast, asNode(name).ast, isBracketed, asNode(typeExpression)?.ast, isNameFirst, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.createJSDocPropertyTag(tagName?.ast, name.ast, isBracketed, typeExpression?.ast, isNameFirst, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function updateJSDocPropertyTag(node: JSDocPropertyTag, tagName: Identifier | undefined, name: EntityName, isBracketed: boolean, typeExpression: JSDocTypeExpression | undefined, isNameFirst: boolean, comment: string | NodeArray | undefined): JSDocPropertyTag { - return astFactory.updateJSDocPropertyTag(asNode(node).ast, asNode(tagName)?.ast, asNode(name).ast, isBracketed, asNode(typeExpression)?.ast, isNameFirst, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.updateJSDocPropertyTag(node.ast, tagName?.ast, name.ast, isBracketed, typeExpression?.ast, isNameFirst, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function createJSDocCallbackTag(tagName: Identifier | undefined, typeExpression: JSDocSignature, fullName?: Identifier | JSDocNamespaceDeclaration, comment?: string | NodeArray): JSDocCallbackTag { - return astFactory.createJSDocCallbackTag(asNode(tagName)?.ast, asNode(typeExpression).ast, asNode(fullName)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.createJSDocCallbackTag(tagName?.ast, typeExpression.ast, fullName?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function updateJSDocCallbackTag(node: JSDocCallbackTag, tagName: Identifier | undefined, typeExpression: JSDocSignature, fullName: Identifier | JSDocNamespaceDeclaration | undefined, comment: string | NodeArray | undefined): JSDocCallbackTag { - return astFactory.updateJSDocCallbackTag(asNode(node).ast, asNode(tagName)?.ast, asNode(typeExpression).ast, asNode(fullName)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.updateJSDocCallbackTag(node.ast, tagName?.ast, typeExpression.ast, fullName?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function createJSDocOverloadTag(tagName: Identifier | undefined, typeExpression: JSDocSignature, comment?: string | NodeArray): JSDocOverloadTag { - return astFactory.createJSDocOverloadTag(asNode(tagName)?.ast, asNode(typeExpression).ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.createJSDocOverloadTag(tagName?.ast, typeExpression.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function updateJSDocOverloadTag(node: JSDocOverloadTag, tagName: Identifier | undefined, typeExpression: JSDocSignature, comment: string | NodeArray | undefined): JSDocOverloadTag { - return astFactory.updateJSDocOverloadTag(asNode(node).ast, asNode(tagName)?.ast, asNode(typeExpression).ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.updateJSDocOverloadTag(node.ast, tagName?.ast, typeExpression.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function createJSDocAugmentsTag(tagName: Identifier | undefined, className: JSDocClassReference, comment?: string | NodeArray): JSDocAugmentsTag { - return astFactory.createJSDocAugmentsTag(asNode(tagName)?.ast, asNode(className).ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.createJSDocAugmentsTag(tagName?.ast, className.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function updateJSDocAugmentsTag(node: JSDocAugmentsTag, tagName: Identifier | undefined, className: JSDocClassReference, comment: string | NodeArray | undefined): JSDocAugmentsTag { - return astFactory.updateJSDocAugmentsTag(asNode(node).ast, asNode(tagName)?.ast, asNode(className).ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.updateJSDocAugmentsTag(node.ast, tagName?.ast, className.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function createJSDocImplementsTag(tagName: Identifier | undefined, className: JSDocClassReference, comment?: string | NodeArray): JSDocImplementsTag { - return astFactory.createJSDocImplementsTag(asNode(tagName)?.ast, asNode(className).ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.createJSDocImplementsTag(tagName?.ast, className.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function createJSDocSeeTag(tagName: Identifier | undefined, name: JSDocNameReference | undefined, comment?: string | NodeArray): JSDocSeeTag { - return astFactory.createJSDocSeeTag(asNode(tagName)?.ast, asNode(name)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.createJSDocSeeTag(tagName?.ast, name?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function updateJSDocSeeTag(node: JSDocSeeTag, tagName: Identifier | undefined, name: JSDocNameReference | undefined, comment?: string | NodeArray): JSDocSeeTag { - return astFactory.updateJSDocSeeTag(asNode(node).ast, asNode(tagName)?.ast, asNode(name)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.updateJSDocSeeTag(node.ast, tagName?.ast, name?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function createJSDocNameReference(name: EntityName | JSDocMemberName): JSDocNameReference { - return astFactory.createJSDocNameReference(asNode(name).ast).node; + return astFactory.createJSDocNameReference(name.ast).node; } // @api function updateJSDocNameReference(node: JSDocNameReference, name: EntityName | JSDocMemberName): JSDocNameReference { - return astFactory.updateJSDocNameReference(asNode(node).ast, asNode(name).ast).node; + return astFactory.updateJSDocNameReference(node.ast, name.ast).node; } // @api function createJSDocMemberName(left: EntityName | JSDocMemberName, right: Identifier): JSDocMemberName { - return astFactory.createJSDocMemberName(asNode(left).ast, asNode(right).ast).node; + return astFactory.createJSDocMemberName(left.ast, right.ast).node; } // @api function updateJSDocMemberName(node: JSDocMemberName, left: EntityName | JSDocMemberName, right: Identifier): JSDocMemberName { - return astFactory.updateJSDocMemberName(asNode(node).ast, asNode(left).ast, asNode(right).ast).node; + return astFactory.updateJSDocMemberName(node.ast, left.ast, right.ast).node; } // @api function createJSDocLink(name: EntityName | JSDocMemberName | undefined, text: string): JSDocLink { - return astFactory.createJSDocLink(asNode(name)?.ast, text).node; + return astFactory.createJSDocLink(name?.ast, text).node; } // @api function updateJSDocLink(node: JSDocLink, name: EntityName | JSDocMemberName | undefined, text: string): JSDocLink { - return astFactory.updateJSDocLink(asNode(node).ast, asNode(name)?.ast, text).node; + return astFactory.updateJSDocLink(node.ast, name?.ast, text).node; } // @api function createJSDocLinkCode(name: EntityName | JSDocMemberName | undefined, text: string): JSDocLinkCode { - return astFactory.createJSDocLinkCode(asNode(name)?.ast, text).node; + return astFactory.createJSDocLinkCode(name?.ast, text).node; } // @api function updateJSDocLinkCode(node: JSDocLinkCode, name: EntityName | JSDocMemberName | undefined, text: string): JSDocLinkCode { - return astFactory.updateJSDocLinkCode(asNode(node).ast, asNode(name)?.ast, text).node; + return astFactory.updateJSDocLinkCode(node.ast, name?.ast, text).node; } // @api function createJSDocLinkPlain(name: EntityName | JSDocMemberName | undefined, text: string): JSDocLinkPlain { - return astFactory.createJSDocLinkPlain(asNode(name)?.ast, text).node; + return astFactory.createJSDocLinkPlain(name?.ast, text).node; } // @api function updateJSDocLinkPlain(node: JSDocLinkPlain, name: EntityName | JSDocMemberName | undefined, text: string): JSDocLinkPlain { - return astFactory.updateJSDocLinkPlain(asNode(node).ast, asNode(name)?.ast, text).node; + return astFactory.updateJSDocLinkPlain(node.ast, name?.ast, text).node; } // @api function updateJSDocImplementsTag(node: JSDocImplementsTag, tagName: Identifier | undefined, className: JSDocClassReference, comment: string | NodeArray | undefined): JSDocImplementsTag { - return astFactory.updateJSDocImplementsTag(asNode(node).ast, asNode(tagName)?.ast, asNode(className).ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.updateJSDocImplementsTag(node.ast, tagName?.ast, className.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function createJSDocAuthorTag(tagName: Identifier | undefined, comment?: string | NodeArray): JSDocAuthorTag { - return astFactory.createJSDocAuthorTag(asNode(tagName)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.createJSDocAuthorTag(tagName?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function updateJSDocAuthorTag(node: JSDocAuthorTag, tagName: Identifier | undefined, comment: string | NodeArray | undefined): JSDocAuthorTag { - return astFactory.updateJSDocAuthorTag(asNode(node).ast, asNode(tagName)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.updateJSDocAuthorTag(node.ast, tagName?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function createJSDocClassTag(tagName: Identifier | undefined, comment?: string | NodeArray): JSDocClassTag { - return astFactory.createJSDocClassTag(asNode(tagName)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.createJSDocClassTag(tagName?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function updateJSDocClassTag(node: JSDocClassTag, tagName: Identifier | undefined, comment: string | NodeArray | undefined): JSDocClassTag { - return astFactory.updateJSDocClassTag(asNode(node).ast, asNode(tagName)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.updateJSDocClassTag(node.ast, tagName?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function createJSDocPublicTag(tagName: Identifier | undefined, comment?: string | NodeArray): JSDocPublicTag { - return astFactory.createJSDocPublicTag(asNode(tagName)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.createJSDocPublicTag(tagName?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function updateJSDocPublicTag(node: JSDocPublicTag, tagName: Identifier | undefined, comment: string | NodeArray | undefined): JSDocPublicTag { - return astFactory.updateJSDocPublicTag(asNode(node).ast, asNode(tagName)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.updateJSDocPublicTag(node.ast, tagName?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function createJSDocPrivateTag(tagName: Identifier | undefined, comment?: string | NodeArray): JSDocPrivateTag { - return astFactory.createJSDocPrivateTag(asNode(tagName)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.createJSDocPrivateTag(tagName?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function updateJSDocPrivateTag(node: JSDocPrivateTag, tagName: Identifier | undefined, comment: string | NodeArray | undefined): JSDocPrivateTag { - return astFactory.updateJSDocPrivateTag(asNode(node).ast, asNode(tagName)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.updateJSDocPrivateTag(node.ast, tagName?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function createJSDocProtectedTag(tagName: Identifier | undefined, comment?: string | NodeArray): JSDocProtectedTag { - return astFactory.createJSDocProtectedTag(asNode(tagName)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.createJSDocProtectedTag(tagName?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function updateJSDocProtectedTag(node: JSDocProtectedTag, tagName: Identifier | undefined, comment: string | NodeArray | undefined): JSDocProtectedTag { - return astFactory.updateJSDocProtectedTag(asNode(node).ast, asNode(tagName)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.updateJSDocProtectedTag(node.ast, tagName?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function createJSDocReadonlyTag(tagName: Identifier | undefined, comment?: string | NodeArray): JSDocReadonlyTag { - return astFactory.createJSDocReadonlyTag(asNode(tagName)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.createJSDocReadonlyTag(tagName?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function updateJSDocReadonlyTag(node: JSDocReadonlyTag, tagName: Identifier | undefined, comment: string | NodeArray | undefined): JSDocReadonlyTag { - return astFactory.updateJSDocReadonlyTag(asNode(node).ast, asNode(tagName)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.updateJSDocReadonlyTag(node.ast, tagName?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function createJSDocOverrideTag(tagName: Identifier | undefined, comment?: string | NodeArray): JSDocOverrideTag { - return astFactory.createJSDocOverrideTag(asNode(tagName)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.createJSDocOverrideTag(tagName?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function updateJSDocOverrideTag(node: JSDocOverrideTag, tagName: Identifier | undefined, comment: string | NodeArray | undefined): JSDocOverrideTag { - return astFactory.updateJSDocOverrideTag(asNode(node).ast, asNode(tagName)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.updateJSDocOverrideTag(node.ast, tagName?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function createJSDocDeprecatedTag(tagName: Identifier | undefined, comment?: string | NodeArray): JSDocDeprecatedTag { - return astFactory.createJSDocDeprecatedTag(asNode(tagName)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.createJSDocDeprecatedTag(tagName?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function updateJSDocDeprecatedTag(node: JSDocDeprecatedTag, tagName: Identifier | undefined, comment?: string | NodeArray): JSDocDeprecatedTag { - return astFactory.updateJSDocDeprecatedTag(asNode(node).ast, asNode(tagName)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.updateJSDocDeprecatedTag(node.ast, tagName?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function createJSDocUnknownTag(tagName: Identifier, comment?: string | NodeArray): JSDocUnknownTag { - return astFactory.createJSDocUnknownTag(asNode(tagName).ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.createJSDocUnknownTag(tagName.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function updateJSDocUnknownTag(node: JSDocUnknownTag, tagName: Identifier, comment: string | NodeArray | undefined): JSDocUnknownTag { - return astFactory.updateJSDocUnknownTag(asNode(node).ast, asNode(tagName).ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.updateJSDocUnknownTag(node.ast, tagName.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function createJSDocImportTag(tagName: Identifier | undefined, importClause: ImportClause | undefined, moduleSpecifier: Expression, attributes?: ImportAttributes, comment?: string | NodeArray): JSDocImportTag { - return astFactory.createJSDocImportTag(asNode(tagName)?.ast, asNode(importClause)?.ast, asNode(moduleSpecifier).ast, asNode(attributes)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.createJSDocImportTag(tagName?.ast, importClause?.ast, moduleSpecifier.ast, attributes?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } function updateJSDocImportTag(node: JSDocImportTag, tagName: Identifier | undefined, importClause: ImportClause | undefined, moduleSpecifier: Expression, attributes: ImportAttributes | undefined, comment: string | NodeArray | undefined): JSDocImportTag { - return astFactory.updateJSDocImportTag(asNode(node).ast, asNode(tagName)?.ast, asNode(importClause)?.ast, asNode(moduleSpecifier).ast, asNode(attributes)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.updateJSDocImportTag(node.ast, tagName?.ast, importClause?.ast, moduleSpecifier.ast, attributes?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api @@ -3278,7 +3278,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateJSDocText(node: JSDocText, text: string): JSDocText { - return astFactory.updateJSDocText(asNode(node).ast, text).node; + return astFactory.updateJSDocText(node.ast, text).node; } // @api @@ -3288,67 +3288,67 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateJSDocComment(node: JSDoc, comment: string | NodeArray | undefined, tags: readonly JSDocTag[] | undefined): JSDoc { - return astFactory.updateJSDocComment(asNode(node).ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast, asNodeArray(tags)?.ast).node; + return astFactory.updateJSDocComment(node.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast, asNodeArray(tags)?.ast).node; } // @api function createJSDocTypeTag(tagName: Identifier | undefined, typeExpression: JSDocTypeExpression, comment?: string | NodeArray): JSDocTypeTag { - return astFactory.createJSDocTypeTag(asNode(tagName)?.ast, asNode(typeExpression).ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.createJSDocTypeTag(tagName?.ast, typeExpression.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function updateJSDocTypeTag(node: JSDocTypeTag, tagName: Identifier | undefined, typeExpression: JSDocTypeExpression, comment: string | NodeArray | undefined): JSDocTypeTag { - return astFactory.updateJSDocTypeTag(asNode(node).ast, asNode(tagName)?.ast, asNode(typeExpression).ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.updateJSDocTypeTag(node.ast, tagName?.ast, typeExpression.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function createJSDocReturnTag(tagName: Identifier | undefined, typeExpression?: JSDocTypeExpression, comment?: string | NodeArray): JSDocReturnTag { - return astFactory.createJSDocReturnTag(asNode(tagName)?.ast, asNode(typeExpression)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.createJSDocReturnTag(tagName?.ast, typeExpression?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function updateJSDocReturnTag(node: JSDocReturnTag, tagName: Identifier | undefined, typeExpression: JSDocTypeExpression | undefined, comment: string | NodeArray | undefined): JSDocReturnTag { - return astFactory.updateJSDocReturnTag(asNode(node).ast, asNode(tagName)?.ast, asNode(typeExpression)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.updateJSDocReturnTag(node.ast, tagName?.ast, typeExpression?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function createJSDocThisTag(tagName: Identifier | undefined, typeExpression: JSDocTypeExpression, comment?: string | NodeArray): JSDocThisTag { - return astFactory.createJSDocThisTag(asNode(tagName)?.ast, asNode(typeExpression).ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.createJSDocThisTag(tagName?.ast, typeExpression.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function updateJSDocThisTag(node: JSDocThisTag, tagName: Identifier | undefined, typeExpression: JSDocTypeExpression | undefined, comment: string | NodeArray | undefined): JSDocThisTag { - return astFactory.updateJSDocThisTag(asNode(node).ast, asNode(tagName)?.ast, asNode(typeExpression)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.updateJSDocThisTag(node.ast, tagName?.ast, typeExpression?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function createJSDocThrowsTag(tagName: Identifier | undefined, typeExpression: JSDocTypeExpression | undefined, comment?: string | NodeArray): JSDocThrowsTag { - return astFactory.createJSDocThrowsTag(asNode(tagName)?.ast, asNode(typeExpression)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.createJSDocThrowsTag(tagName?.ast, typeExpression?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function updateJSDocThrowsTag(node: JSDocThrowsTag, tagName: Identifier | undefined, typeExpression: JSDocTypeExpression | undefined, comment: string | NodeArray | undefined): JSDocThrowsTag { - return astFactory.updateJSDocThrowsTag(asNode(node).ast, asNode(tagName)?.ast, asNode(typeExpression)?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.updateJSDocThrowsTag(node.ast, tagName?.ast, typeExpression?.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function createJSDocEnumTag(tagName: Identifier | undefined, typeExpression: JSDocTypeExpression, comment?: string | NodeArray) { - return astFactory.createJSDocEnumTag(asNode(tagName)?.ast, asNode(typeExpression).ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.createJSDocEnumTag(tagName?.ast, typeExpression.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function updateJSDocEnumTag(node: JSDocEnumTag, tagName: Identifier | undefined, typeExpression: JSDocTypeExpression, comment: string | NodeArray | undefined) { - return astFactory.updateJSDocEnumTag(asNode(node).ast, asNode(tagName)?.ast, asNode(typeExpression).ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.updateJSDocEnumTag(node.ast, tagName?.ast, typeExpression.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function createJSDocSatisfiesTag(tagName: Identifier | undefined, typeExpression: JSDocTypeExpression, comment?: string | NodeArray) { - return astFactory.createJSDocSatisfiesTag(asNode(tagName)?.ast, asNode(typeExpression).ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.createJSDocSatisfiesTag(tagName?.ast, typeExpression.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @api function updateJSDocSatisfiesTag(node: JSDocSatisfiesTag, tagName: Identifier | undefined, typeExpression: JSDocTypeExpression, comment: string | NodeArray | undefined) { - return astFactory.updateJSDocSatisfiesTag(asNode(node).ast, asNode(tagName)?.ast, asNode(typeExpression).ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; + return astFactory.updateJSDocSatisfiesTag(node.ast, tagName?.ast, typeExpression.ast, typeof comment === "string" ? comment : asNodeArray(comment)?.ast).node; } // @@ -3357,52 +3357,52 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function createJsxElement(openingElement: JsxOpeningElement, children: readonly JsxChild[], closingElement: JsxClosingElement): JsxElement { - return astFactory.createJsxElement(asNode(openingElement).ast, asNodeArray(children).ast, asNode(closingElement).ast).node; + return astFactory.createJsxElement(openingElement.ast, asNodeArray(children).ast, closingElement.ast).node; } // @api function updateJsxElement(node: JsxElement, openingElement: JsxOpeningElement, children: readonly JsxChild[], closingElement: JsxClosingElement): JsxElement { - return astFactory.updateJsxElement(asNode(node).ast, asNode(openingElement).ast, asNodeArray(children).ast, asNode(closingElement).ast).node; + return astFactory.updateJsxElement(node.ast, openingElement.ast, asNodeArray(children).ast, closingElement.ast).node; } // @api function createJsxSelfClosingElement(tagName: JsxTagNameExpression, typeArguments: readonly TypeNode[] | undefined, attributes: JsxAttributes): JsxSelfClosingElement { - return astFactory.createJsxSelfClosingElement(asNode(tagName).ast, asNodeArray(typeArguments)?.ast, asNode(attributes).ast).node; + return astFactory.createJsxSelfClosingElement(tagName.ast, asNodeArray(typeArguments)?.ast, attributes.ast).node; } // @api function updateJsxSelfClosingElement(node: JsxSelfClosingElement, tagName: JsxTagNameExpression, typeArguments: readonly TypeNode[] | undefined, attributes: JsxAttributes): JsxSelfClosingElement { - return astFactory.updateJsxSelfClosingElement(asNode(node).ast, asNode(tagName).ast, asNodeArray(typeArguments)?.ast, asNode(attributes).ast).node; + return astFactory.updateJsxSelfClosingElement(node.ast, tagName.ast, asNodeArray(typeArguments)?.ast, attributes.ast).node; } // @api function createJsxOpeningElement(tagName: JsxTagNameExpression, typeArguments: readonly TypeNode[] | undefined, attributes: JsxAttributes): JsxOpeningElement { - return astFactory.createJsxOpeningElement(asNode(tagName).ast, asNodeArray(typeArguments)?.ast, asNode(attributes).ast).node; + return astFactory.createJsxOpeningElement(tagName.ast, asNodeArray(typeArguments)?.ast, attributes.ast).node; } // @api function updateJsxOpeningElement(node: JsxOpeningElement, tagName: JsxTagNameExpression, typeArguments: readonly TypeNode[] | undefined, attributes: JsxAttributes): JsxOpeningElement { - return astFactory.updateJsxOpeningElement(asNode(node).ast, asNode(tagName).ast, asNodeArray(typeArguments)?.ast, asNode(attributes).ast).node; + return astFactory.updateJsxOpeningElement(node.ast, tagName.ast, asNodeArray(typeArguments)?.ast, attributes.ast).node; } // @api function createJsxClosingElement(tagName: JsxTagNameExpression): JsxClosingElement { - return astFactory.createJsxClosingElement(asNode(tagName).ast).node; + return astFactory.createJsxClosingElement(tagName.ast).node; } // @api function updateJsxClosingElement(node: JsxClosingElement, tagName: JsxTagNameExpression): JsxClosingElement { - return astFactory.updateJsxClosingElement(asNode(node).ast, asNode(tagName).ast).node; + return astFactory.updateJsxClosingElement(node.ast, tagName.ast).node; } // @api function createJsxFragment(openingFragment: JsxOpeningFragment, children: readonly JsxChild[], closingFragment: JsxClosingFragment): JsxFragment { - return astFactory.createJsxFragment(asNode(openingFragment).ast, asNodeArray(children).ast, asNode(closingFragment).ast).node; + return astFactory.createJsxFragment(openingFragment.ast, asNodeArray(children).ast, closingFragment.ast).node; } // @api function updateJsxFragment(node: JsxFragment, openingFragment: JsxOpeningFragment, children: readonly JsxChild[], closingFragment: JsxClosingFragment): JsxFragment { - return astFactory.updateJsxFragment(asNode(node).ast, asNode(openingFragment).ast, asNodeArray(children).ast, asNode(closingFragment).ast).node; + return astFactory.updateJsxFragment(node.ast, openingFragment.ast, asNodeArray(children).ast, closingFragment.ast).node; } // @api @@ -3412,7 +3412,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateJsxText(node: JsxText, text: string, containsOnlyTriviaWhiteSpaces?: boolean): JsxText { - return astFactory.updateJsxText(asNode(node).ast, text, containsOnlyTriviaWhiteSpaces).node; + return astFactory.updateJsxText(node.ast, text, containsOnlyTriviaWhiteSpaces).node; } // @api @@ -3427,12 +3427,12 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function createJsxAttribute(name: JsxAttributeName, initializer: JsxAttributeValue | undefined): JsxAttribute { - return astFactory.createJsxAttribute(asNode(name).ast, asNode(initializer)?.ast).node; + return astFactory.createJsxAttribute(name.ast, initializer?.ast).node; } // @api function updateJsxAttribute(node: JsxAttribute, name: JsxAttributeName, initializer: JsxAttributeValue | undefined): JsxAttribute { - return astFactory.updateJsxAttribute(asNode(node).ast, asNode(name).ast, asNode(initializer)?.ast).node; + return astFactory.updateJsxAttribute(node.ast, name.ast, initializer?.ast).node; } // @api @@ -3442,37 +3442,37 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateJsxAttributes(node: JsxAttributes, properties: readonly JsxAttributeLike[]): JsxAttributes { - return astFactory.updateJsxAttributes(asNode(node).ast, asNodeArray(properties).ast).node; + return astFactory.updateJsxAttributes(node.ast, asNodeArray(properties).ast).node; } // @api function createJsxSpreadAttribute(expression: Expression): JsxSpreadAttribute { - return astFactory.createJsxSpreadAttribute(asNode(expression).ast).node; + return astFactory.createJsxSpreadAttribute(expression.ast).node; } // @api function updateJsxSpreadAttribute(node: JsxSpreadAttribute, expression: Expression): JsxSpreadAttribute { - return astFactory.updateJsxSpreadAttribute(asNode(node).ast, asNode(expression).ast).node; + return astFactory.updateJsxSpreadAttribute(node.ast, expression.ast).node; } // @api function createJsxExpression(dotDotDotToken: DotDotDotToken | undefined, expression: Expression | undefined): JsxExpression { - return astFactory.createJsxExpression(asNode(dotDotDotToken)?.ast, asNode(expression)?.ast).node; + return astFactory.createJsxExpression(dotDotDotToken?.ast, expression?.ast).node; } // @api function updateJsxExpression(node: JsxExpression, expression: Expression | undefined): JsxExpression { - return astFactory.updateJsxExpression(asNode(node).ast, asNode(expression)?.ast).node; + return astFactory.updateJsxExpression(node.ast, expression?.ast).node; } // @api function createJsxNamespacedName(namespace: Identifier, name: Identifier): JsxNamespacedName { - return astFactory.createJsxNamespacedName(asNode(namespace).ast, asNode(name).ast).node; + return astFactory.createJsxNamespacedName(namespace.ast, name.ast).node; } // @api function updateJsxNamespacedName(node: JsxNamespacedName, namespace: Identifier, name: Identifier): JsxNamespacedName { - return astFactory.updateJsxNamespacedName(asNode(node).ast, asNode(namespace).ast, asNode(name).ast).node; + return astFactory.updateJsxNamespacedName(node.ast, namespace.ast, name.ast).node; } // @@ -3481,12 +3481,12 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function createCaseClause(expression: Expression, statements: readonly Statement[]): CaseClause { - return astFactory.createCaseClause(asNode(expression).ast, asNodeArray(statements).ast).node; + return astFactory.createCaseClause(expression.ast, asNodeArray(statements).ast).node; } // @api function updateCaseClause(node: CaseClause, expression: Expression, statements: readonly Statement[]): CaseClause { - return astFactory.updateCaseClause(asNode(node).ast, asNode(expression).ast, asNodeArray(statements).ast).node; + return astFactory.updateCaseClause(node.ast, expression.ast, asNodeArray(statements).ast).node; } // @api @@ -3496,7 +3496,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateDefaultClause(node: DefaultClause, statements: readonly Statement[]): DefaultClause { - return astFactory.updateDefaultClause(asNode(node).ast, asNodeArray(statements).ast).node; + return astFactory.updateDefaultClause(node.ast, asNodeArray(statements).ast).node; } // @api @@ -3506,17 +3506,17 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateHeritageClause(node: HeritageClause, types: readonly ExpressionWithTypeArguments[]): HeritageClause { - return astFactory.updateHeritageClause(asNode(node).ast, asNodeArray(types).ast).node; + return astFactory.updateHeritageClause(node.ast, asNodeArray(types).ast).node; } // @api function createCatchClause(variableDeclaration: string | BindingName | VariableDeclaration | undefined, block: Block): CatchClause { - return astFactory.createCatchClause(asVariableDeclaration(variableDeclaration)?.ast, asNode(block).ast).node; + return astFactory.createCatchClause(asVariableDeclaration(variableDeclaration)?.ast, block.ast).node; } // @api function updateCatchClause(node: CatchClause, variableDeclaration: VariableDeclaration | undefined, block: Block): CatchClause { - return astFactory.updateCatchClause(asNode(node).ast, asNode(variableDeclaration)?.ast, asNode(block).ast).node; + return astFactory.updateCatchClause(node.ast, variableDeclaration?.ast, block.ast).node; } // @@ -3525,32 +3525,32 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function createPropertyAssignment(name: string | PropertyName, initializer: Expression): PropertyAssignment { - return astFactory.createPropertyAssignment(asName(name)?.ast, asNode(initializer).ast).node; + return astFactory.createPropertyAssignment(asName(name)?.ast, initializer.ast).node; } // @api function updatePropertyAssignment(node: PropertyAssignment, name: PropertyName, initializer: Expression): PropertyAssignment { - return astFactory.updatePropertyAssignment(asNode(node).ast, asNode(name).ast, asNode(initializer).ast).node; + return astFactory.updatePropertyAssignment(node.ast, name.ast, initializer.ast).node; } // @api function createShorthandPropertyAssignment(name: string | Identifier, objectAssignmentInitializer?: Expression): ShorthandPropertyAssignment { - return astFactory.createShorthandPropertyAssignment(asName(name).ast, asNode(objectAssignmentInitializer)?.ast).node; + return astFactory.createShorthandPropertyAssignment(asName(name).ast, objectAssignmentInitializer?.ast).node; } // @api function updateShorthandPropertyAssignment(node: ShorthandPropertyAssignment, name: Identifier, objectAssignmentInitializer: Expression | undefined): ShorthandPropertyAssignment { - return astFactory.updateShorthandPropertyAssignment(asNode(node).ast, asNode(name).ast, asNode(objectAssignmentInitializer)?.ast).node; + return astFactory.updateShorthandPropertyAssignment(node.ast, name.ast, objectAssignmentInitializer?.ast).node; } // @api function createSpreadAssignment(expression: Expression): SpreadAssignment { - return astFactory.createSpreadAssignment(asNode(expression).ast).node; + return astFactory.createSpreadAssignment(expression.ast).node; } // @api function updateSpreadAssignment(node: SpreadAssignment, expression: Expression): SpreadAssignment { - return astFactory.updateSpreadAssignment(asNode(node).ast, asNode(expression).ast).node; + return astFactory.updateSpreadAssignment(node.ast, expression.ast).node; } // @@ -3559,12 +3559,12 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function createEnumMember(name: string | PropertyName, initializer?: Expression): EnumMember { - return astFactory.createEnumMember(asName(name).ast, asNode(initializer)?.ast).node; + return astFactory.createEnumMember(asName(name).ast, initializer?.ast).node; } // @api function updateEnumMember(node: EnumMember, name: PropertyName, initializer: Expression | undefined): EnumMember { - return astFactory.updateEnumMember(asNode(node).ast, asNode(name).ast, asNode(initializer)?.ast).node; + return astFactory.updateEnumMember(node.ast, name.ast, initializer?.ast).node; } // @@ -3577,7 +3577,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: endOfFileToken: EndOfFileToken, flags: NodeFlags, ): SourceFile { - return astFactory.createSourceFile(asNodeArray(statements).ast, asNode(endOfFileToken).ast, flags).node; + return astFactory.createSourceFile(asNodeArray(statements).ast, endOfFileToken.ast, flags).node; } // @api @@ -3596,7 +3596,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: libReferenceDirectives = node.libReferenceDirectives, ): SourceFile { return astFactory.updateSourceFile( - asNode(node).ast, + node.ast, asNodeArray(statements).ast, isDeclarationFile, referencedFiles, @@ -3608,12 +3608,12 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function createBundle(sourceFiles: readonly SourceFile[]): Bundle { - return astFactory.createBundle(sourceFiles as readonly ast.SourceFile[]).node; + return astFactory.createBundle(sourceFiles).node; } // @api function updateBundle(node: Bundle, sourceFiles: readonly SourceFile[]): Bundle { - return astFactory.updateBundle(asNode(node).ast, sourceFiles as readonly ast.SourceFile[]).node; + return astFactory.updateBundle(node.ast, sourceFiles).node; } // @@ -3622,12 +3622,12 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function createSyntheticExpression(type: Type, isSpread = false, tupleNameSource?: ParameterDeclaration | NamedTupleMember): SyntheticExpression { - return astFactory.createSyntheticExpression(type, isSpread, asNode(tupleNameSource)?.ast).node; + return astFactory.createSyntheticExpression(type, isSpread, tupleNameSource?.ast).node; } // @api function createSyntaxList(children: readonly Node[]): SyntaxList { - return astFactory.createSyntaxList(children as readonly ast.Node[]).node; + return astFactory.createSyntaxList(children).node; } // @@ -3642,7 +3642,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: */ // @api function createNotEmittedStatement(original: Node): NotEmittedStatement { - return astFactory.createNotEmittedStatement(asNode(original).ast).node; + return astFactory.createNotEmittedStatement(original.ast).node; } /** @@ -3654,12 +3654,12 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: */ // @api function createPartiallyEmittedExpression(expression: Expression, original?: Node): PartiallyEmittedExpression { - return astFactory.createPartiallyEmittedExpression(asNode(expression).ast, asNode(original)?.ast).node; + return astFactory.createPartiallyEmittedExpression(expression.ast, original?.ast).node; } // @api function updatePartiallyEmittedExpression(node: PartiallyEmittedExpression, expression: Expression): PartiallyEmittedExpression { - return astFactory.updatePartiallyEmittedExpression(asNode(node).ast, asNode(expression).ast).node; + return astFactory.updatePartiallyEmittedExpression(node.ast, expression.ast).node; } // @api @@ -3674,23 +3674,23 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: // @api function updateCommaListExpression(node: CommaListExpression, elements: readonly Expression[]): CommaListExpression { - return astFactory.updateCommaListExpression(asNode(node).ast, asNodeArray(elements).ast).node; + return astFactory.updateCommaListExpression(node.ast, asNodeArray(elements).ast).node; } // @api function createSyntheticReferenceExpression(expression: Expression, thisArg: Expression): SyntheticReferenceExpression { - return astFactory.createSyntheticReferenceExpression(asNode(expression).ast, asNode(thisArg).ast).node; + return astFactory.createSyntheticReferenceExpression(expression.ast, thisArg.ast).node; } // @api function updateSyntheticReferenceExpression(node: SyntheticReferenceExpression, expression: Expression, thisArg: Expression): SyntheticReferenceExpression { - return astFactory.updateSyntheticReferenceExpression(asNode(node).ast, asNode(expression).ast, asNode(thisArg).ast).node; + return astFactory.updateSyntheticReferenceExpression(node.ast, expression.ast, thisArg.ast).node; } // @api function cloneNode(node: T): T; function cloneNode(node: Node | undefined) { - return node && astFactory.cloneNode(asNode(node).ast).node as Node | undefined; + return node && astFactory.cloneNode(node.ast).node as Node | undefined; } // compound nodes @@ -4418,54 +4418,29 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: } } - type ToNode = Expression extends T ? ast.Expression : - Statement extends T ? ast.Statement : - TypeNode extends T ? ast.TypeNode : - TypeElement extends T ? ast.TypeElement : - ClassElement extends T ? ast.ClassElement : - ObjectLiteralElement extends T ? ast.ObjectLiteralElement : - PropertyAccessChain extends T ? ast.PropertyAccessChain : - ElementAccessChain extends T ? ast.ElementAccessChain : - CallChain extends T ? ast.CallChain : - NonNullChain extends T ? ast.NonNullChain : - ModuleBody extends T ? ast.ModuleBody : - LiteralExpression extends T ? ast.LiteralExpression : - JSDocNamespaceDeclaration extends T ? ast.JSDocNamespaceDeclaration : - JSDocPropertyLikeTag extends T ? ast.JSDocPropertyLikeTag : - JSDocClassReference extends T ? ast.JSDocClassReference : - JsxNamespacedName extends T ? ast.JsxNamespacedName : - ast.NodeType[T["kind"]]; - - function asNode(node: T): ToNode; - function asNode(node: T | undefined): ToNode | undefined; - function asNode(node: Node | undefined): ast.Node | undefined { - return node as ast.Node | undefined; + function asNodeArray(array: readonly T[]): NodeArray; + function asNodeArray(array: readonly T[] | undefined): NodeArray | undefined; + function asNodeArray(array: readonly Node[] | undefined): NodeArray | undefined { + return array ? createNodeArray(array) : undefined; } - function asNodeArray(array: readonly T[]): ast.NodeArray>; - function asNodeArray(array: readonly T[] | undefined): ast.NodeArray> | undefined; - function asNodeArray(array: readonly Node[] | undefined): ast.NodeArray | undefined { - return array ? createNodeArray(array) as ast.NodeArray : undefined; - } - - function asName(name: string | T): ToNode | ast.Identifier; - function asName(name: string | T | undefined): ToNode | ast.Identifier | undefined; + function asName(name: string | T): T | Identifier; + function asName(name: string | T | undefined): T | Identifier | undefined; function asName(name: string | DeclarationName | Identifier | BindingName | PropertyName | NoSubstitutionTemplateLiteral | EntityName | ThisTypeNode | undefined) { - return typeof name === "string" ? createIdentifier(name) as ast.Identifier : - name as Node as ast.Node as ToNode; + return typeof name === "string" ? createIdentifier(name) : name; } - function asExpression(value: string | number | boolean | T): ToNode | ast.StringLiteral | ast.NumericLiteral | ast.BooleanLiteral; - function asExpression(value: string | number | boolean | T | undefined): ToNode | ast.StringLiteral | ast.NumericLiteral | ast.BooleanLiteral | undefined; - function asExpression(value: string | number | boolean | Expression | undefined): ast.Expression | undefined | ast.StringLiteral | ast.NumericLiteral | ast.BooleanLiteral | undefined { - return typeof value === "string" ? createStringLiteral(value) as ast.StringLiteral : - typeof value === "number" ? createNumericLiteral(value) as ast.NumericLiteral : - typeof value === "boolean" ? value ? createTrue() as ast.TrueLiteral : createFalse() as ast.FalseLiteral : - value as ast.Expression; + function asExpression(value: string | number | boolean | T): T | StringLiteral | NumericLiteral | BooleanLiteral; + function asExpression(value: string | number | boolean | T | undefined): T | StringLiteral | NumericLiteral | BooleanLiteral | undefined; + function asExpression(value: string | number | boolean | Expression | undefined): Expression | undefined | StringLiteral | NumericLiteral | BooleanLiteral | undefined { + return typeof value === "string" ? createStringLiteral(value) : + typeof value === "number" ? createNumericLiteral(value) : + typeof value === "boolean" ? value ? createTrue() : createFalse() : + value as Expression; } - function asToken(value: TKind | Token): ast.Token { - return (typeof value === "number" ? createToken(value) : value) as ast.Token; + function asToken(value: TKind | Token): Token { + return typeof value === "number" ? createToken(value) : value; } function asVariableDeclaration(variableDeclaration: string | BindingName | VariableDeclaration | undefined) { @@ -4475,9 +4450,9 @@ export function createNodeFactory(flags: NodeFactoryFlags, onFinishNode?: (node: /*exclamationToken*/ undefined, /*type*/ undefined, /*initializer*/ undefined, - ) as ast.VariableDeclaration; + ); } - return variableDeclaration as ast.BindingName | ast.VariableDeclaration | undefined; + return variableDeclaration; } } diff --git a/src/compiler/factory/nodeTests.ts b/src/compiler/factory/nodeTests.ts index 8aa4bb02e83..ba20a858f5b 100644 --- a/src/compiler/factory/nodeTests.ts +++ b/src/compiler/factory/nodeTests.ts @@ -212,7 +212,7 @@ import { TryStatement, TupleTypeNode, TypeAliasDeclaration, - TypeAssertion, + TypeAssertionExpression, TypeLiteralNode, TypeOfExpression, TypeOperatorNode, @@ -601,7 +601,7 @@ export function isTaggedTemplateExpression(node: Node): node is TaggedTemplateEx return node.kind === SyntaxKind.TaggedTemplateExpression; } -export function isTypeAssertionExpression(node: Node): node is TypeAssertion { +export function isTypeAssertionExpression(node: Node): node is TypeAssertionExpression { return node.kind === SyntaxKind.TypeAssertionExpression; } diff --git a/src/compiler/factory/parenthesizerRules.ts b/src/compiler/factory/parenthesizerRules.ts index 093b69a79df..3f56288e155 100644 --- a/src/compiler/factory/parenthesizerRules.ts +++ b/src/compiler/factory/parenthesizerRules.ts @@ -1,36 +1,21 @@ import { - ast, BinaryOperator, - CallChain, cast, - ClassElement, ConciseBody, - ElementAccessChain, Expression, identity, isLeftHandSideExpression, isNodeArray, isUnaryExpression, - JSDocClassReference, - JSDocNamespaceDeclaration, - JSDocPropertyLikeTag, - JsxNamespacedName, LeftHandSideExpression, - LiteralExpression, - ModuleBody, NamedTupleMember, Node, NodeArray, NodeFactory, - NonNullChain, - ObjectLiteralElement, ParenthesizerRules, - PropertyAccessChain, - Statement, SyntaxKind, - TypeElement, TypeNode, - UnaryExpression, + UnaryExpression } from "../_namespaces/ts.js"; /** @internal */ @@ -94,43 +79,43 @@ export function createParenthesizerRules(factory: NodeFactory): ParenthesizerRul } function parenthesizeLeftSideOfBinary(binaryOperator: SyntaxKind, leftSide: Expression): Expression { - return astRules.parenthesizeLeftSideOfBinary(binaryOperator, asNode(leftSide).ast).node; + return astRules.parenthesizeLeftSideOfBinary(binaryOperator, leftSide.ast).node; } function parenthesizeRightSideOfBinary(binaryOperator: SyntaxKind, leftSide: Expression | undefined, rightSide: Expression): Expression { - return astRules.parenthesizeRightSideOfBinary(binaryOperator, asNode(leftSide)?.ast, asNode(rightSide).ast).node; + return astRules.parenthesizeRightSideOfBinary(binaryOperator, leftSide?.ast, rightSide.ast).node; } function parenthesizeExpressionOfComputedPropertyName(expression: Expression): Expression { - return astRules.parenthesizeExpressionOfComputedPropertyName(asNode(expression).ast).node; + return astRules.parenthesizeExpressionOfComputedPropertyName(expression.ast).node; } function parenthesizeConditionOfConditionalExpression(condition: Expression): Expression { - return astRules.parenthesizeConditionOfConditionalExpression(asNode(condition).ast).node; + return astRules.parenthesizeConditionOfConditionalExpression(condition.ast).node; } function parenthesizeBranchOfConditionalExpression(branch: Expression): Expression { - return astRules.parenthesizeBranchOfConditionalExpression(asNode(branch).ast).node; + return astRules.parenthesizeBranchOfConditionalExpression(branch.ast).node; } function parenthesizeExpressionOfExportDefault(expression: Expression): Expression { - return astRules.parenthesizeExpressionOfExportDefault(asNode(expression).ast).node; + return astRules.parenthesizeExpressionOfExportDefault(expression.ast).node; } function parenthesizeExpressionOfNew(expression: Expression): LeftHandSideExpression { - return astRules.parenthesizeExpressionOfNew(asNode(expression).ast).node; + return astRules.parenthesizeExpressionOfNew(expression.ast).node; } function parenthesizeLeftSideOfAccess(expression: Expression, optionalChain?: boolean): LeftHandSideExpression { - return astRules.parenthesizeLeftSideOfAccess(asNode(expression).ast, optionalChain).node; + return astRules.parenthesizeLeftSideOfAccess(expression.ast, optionalChain).node; } function parenthesizeOperandOfPostfixUnary(operand: Expression): LeftHandSideExpression { - return astRules.parenthesizeOperandOfPostfixUnary(asNode(operand).ast).node; + return astRules.parenthesizeOperandOfPostfixUnary(operand.ast).node; } function parenthesizeOperandOfPrefixUnary(operand: Expression): UnaryExpression { - return astRules.parenthesizeOperandOfPrefixUnary(asNode(operand).ast).node; + return astRules.parenthesizeOperandOfPrefixUnary(operand.ast).node; } function parenthesizeExpressionsOfCommaDelimitedList(elements: NodeArray): NodeArray { @@ -138,29 +123,29 @@ export function createParenthesizerRules(factory: NodeFactory): ParenthesizerRul } function parenthesizeExpressionForDisallowedComma(expression: Expression): Expression { - return astRules.parenthesizeExpressionForDisallowedComma(asNode(expression).ast).node; + return astRules.parenthesizeExpressionForDisallowedComma(expression.ast).node; } function parenthesizeExpressionOfExpressionStatement(expression: Expression): Expression { - return astRules.parenthesizeExpressionOfExpressionStatement(asNode(expression).ast).node; + return astRules.parenthesizeExpressionOfExpressionStatement(expression.ast).node; } function parenthesizeConciseBodyOfArrowFunction(body: Expression): Expression; function parenthesizeConciseBodyOfArrowFunction(body: ConciseBody): ConciseBody; function parenthesizeConciseBodyOfArrowFunction(body: ConciseBody): ConciseBody { - return astRules.parenthesizeConciseBodyOfArrowFunction(asNode(body).ast).node; + return astRules.parenthesizeConciseBodyOfArrowFunction(body.ast).node; } function parenthesizeCheckTypeOfConditionalType(checkType: TypeNode): TypeNode { - return astRules.parenthesizeCheckTypeOfConditionalType(asNode(checkType).ast).node; + return astRules.parenthesizeCheckTypeOfConditionalType(checkType.ast).node; } function parenthesizeExtendsTypeOfConditionalType(extendsType: TypeNode): TypeNode { - return astRules.parenthesizeExtendsTypeOfConditionalType(asNode(extendsType).ast).node; + return astRules.parenthesizeExtendsTypeOfConditionalType(extendsType.ast).node; } function parenthesizeConstituentTypeOfUnionType(type: TypeNode): TypeNode { - return astRules.parenthesizeConstituentTypeOfUnionType(asNode(type).ast).node; + return astRules.parenthesizeConstituentTypeOfUnionType(type.ast).node; } function parenthesizeConstituentTypesOfUnionType(members: readonly TypeNode[]): NodeArray { @@ -168,7 +153,7 @@ export function createParenthesizerRules(factory: NodeFactory): ParenthesizerRul } function parenthesizeConstituentTypeOfIntersectionType(type: TypeNode): TypeNode { - return astRules.parenthesizeConstituentTypeOfIntersectionType(asNode(type).ast).node; + return astRules.parenthesizeConstituentTypeOfIntersectionType(type.ast).node; } function parenthesizeConstituentTypesOfIntersectionType(members: readonly TypeNode[]): NodeArray { @@ -176,15 +161,15 @@ export function createParenthesizerRules(factory: NodeFactory): ParenthesizerRul } function parenthesizeOperandOfTypeOperator(type: TypeNode) { - return astRules.parenthesizeOperandOfTypeOperator(asNode(type).ast).node; + return astRules.parenthesizeOperandOfTypeOperator(type.ast).node; } function parenthesizeOperandOfReadonlyTypeOperator(type: TypeNode) { - return astRules.parenthesizeOperandOfReadonlyTypeOperator(asNode(type).ast).node; + return astRules.parenthesizeOperandOfReadonlyTypeOperator(type.ast).node; } function parenthesizeNonArrayTypeOfPostfixType(type: TypeNode) { - return astRules.parenthesizeNonArrayTypeOfPostfixType(asNode(type).ast).node; + return astRules.parenthesizeNonArrayTypeOfPostfixType(type.ast).node; } function parenthesizeElementTypesOfTupleType(types: readonly (TypeNode | NamedTupleMember)[]): NodeArray { @@ -192,49 +177,25 @@ export function createParenthesizerRules(factory: NodeFactory): ParenthesizerRul } function parenthesizeElementTypeOfTupleType(type: TypeNode | NamedTupleMember): TypeNode { - return astRules.parenthesizeElementTypeOfTupleType(asNode(type).ast).node; + return astRules.parenthesizeElementTypeOfTupleType(type.ast).node; } function parenthesizeTypeOfOptionalType(type: TypeNode): TypeNode { - return astRules.parenthesizeTypeOfOptionalType(asNode(type).ast).node; + return astRules.parenthesizeTypeOfOptionalType(type.ast).node; } function parenthesizeLeadingTypeArgument(node: TypeNode) { - return astRules.parenthesizeLeadingTypeArgument(asNode(node).ast).node; + return astRules.parenthesizeLeadingTypeArgument(node.ast).node; } function parenthesizeTypeArguments(typeArguments: NodeArray | undefined): NodeArray | undefined { return astRules.parenthesizeTypeArguments(asNodeArray(typeArguments)?.ast)?.nodes; } - type ToNode = Expression extends T ? ast.Expression : - Statement extends T ? ast.Statement : - TypeNode extends T ? ast.TypeNode : - TypeElement extends T ? ast.TypeElement : - ClassElement extends T ? ast.ClassElement : - ObjectLiteralElement extends T ? ast.ObjectLiteralElement : - PropertyAccessChain extends T ? ast.PropertyAccessChain : - ElementAccessChain extends T ? ast.ElementAccessChain : - CallChain extends T ? ast.CallChain : - NonNullChain extends T ? ast.NonNullChain : - ModuleBody extends T ? ast.ModuleBody : - LiteralExpression extends T ? ast.LiteralExpression : - JSDocNamespaceDeclaration extends T ? ast.JSDocNamespaceDeclaration : - JSDocPropertyLikeTag extends T ? ast.JSDocPropertyLikeTag : - JSDocClassReference extends T ? ast.JSDocClassReference : - JsxNamespacedName extends T ? ast.JsxNamespacedName : - ast.NodeType[T["kind"]]; - - function asNode(node: T): ToNode; - function asNode(node: T | undefined): ToNode | undefined; - function asNode(node: Node | undefined): ast.Node | undefined { - return node as ast.Node | undefined; - } - - function asNodeArray(array: readonly T[]): ast.NodeArray>; - function asNodeArray(array: readonly T[] | undefined): ast.NodeArray> | undefined; - function asNodeArray(array: readonly Node[] | undefined): ast.NodeArray | undefined { - return array ? factory.createNodeArray(array) as ast.NodeArray : undefined; + function asNodeArray(array: readonly T[]): NodeArray; + function asNodeArray(array: readonly T[] | undefined): NodeArray | undefined; + function asNodeArray(array: readonly Node[] | undefined): NodeArray | undefined { + return array ? factory.createNodeArray(array) : undefined; } } diff --git a/src/compiler/factory/utilities.ts b/src/compiler/factory/utilities.ts index 9f7cc54ef75..7818c1af040 100644 --- a/src/compiler/factory/utilities.ts +++ b/src/compiler/factory/utilities.ts @@ -126,7 +126,6 @@ import { MethodDeclaration, MinusToken, Modifier, - ModifiersArray, ModuleKind, ModuleName, MultiplicativeOperator, @@ -463,7 +462,7 @@ function createExpressionForMethodDeclaration(factory: NodeFactory, method: Meth /** @internal */ export function createExpressionForObjectLiteralElementLike(factory: NodeFactory, node: ObjectLiteralExpression, property: ObjectLiteralElementLike, receiver: Expression): Expression | undefined { - if (property.name && isPrivateIdentifier(property.name)) { + if (!isSpreadAssignment(property) && property.name && isPrivateIdentifier(property.name)) { Debug.failBadSyntaxKind(property.name, "Private identifiers are not allowed in object literals."); } switch (property.kind) { @@ -1048,10 +1047,13 @@ export function tryGetPropertyNameOfBindingOrAssignmentElement(bindingElement: B case SyntaxKind.SpreadAssignment: // `a` in `({ ...a } = ...)` - if (bindingElement.name && isPrivateIdentifier(bindingElement.name)) { - return Debug.failBadSyntaxKind(bindingElement.name); + if (isPropertyName(bindingElement.expression)) { + if (isPrivateIdentifier(bindingElement.expression)) { + return Debug.failBadSyntaxKind(bindingElement.expression); + } + return bindingElement.expression; } - return bindingElement.name; + break; } const target = getTargetOfBindingOrAssignmentElement(bindingElement); @@ -1606,7 +1608,7 @@ export function formatGeneratedName(privateName: boolean, prefix: string | Gener * * @internal */ -export function createAccessorPropertyBackingField(factory: NodeFactory, node: PropertyDeclaration, modifiers: ModifiersArray | undefined, initializer: Expression | undefined): PropertyDeclaration { +export function createAccessorPropertyBackingField(factory: NodeFactory, node: PropertyDeclaration, modifiers: NodeArray | undefined, initializer: Expression | undefined): PropertyDeclaration { return factory.updatePropertyDeclaration( node, modifiers, diff --git a/src/compiler/forEachChild.ts b/src/compiler/forEachChild.ts index 7c4b92a1428..11ebac8d167 100644 --- a/src/compiler/forEachChild.ts +++ b/src/compiler/forEachChild.ts @@ -162,7 +162,7 @@ import { TryStatement, TupleTypeNode, TypeAliasDeclaration, - TypeAssertion, + TypeAssertionExpression, TypeLiteralNode, TypeOfExpression, TypeOperatorNode, @@ -307,7 +307,6 @@ const forEachChildTable: ForEachChildTable = { }, [SyntaxKind.Constructor]: function forEachChildInConstructor(node: ConstructorDeclaration, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { return visitNodes(cbNode, cbNodes, node.modifiers) || - visitNode(cbNode, node.name) || visitNodes(cbNode, cbNodes, node.typeParameters) || visitNodes(cbNode, cbNodes, node.parameters) || visitNode(cbNode, node.type) || @@ -450,7 +449,7 @@ const forEachChildTable: ForEachChildTable = { visitNodes(cbNode, cbNodes, node.typeArguments) || visitNode(cbNode, node.template); }, - [SyntaxKind.TypeAssertionExpression]: function forEachChildInTypeAssertionExpression(node: TypeAssertion, cbNode: (node: Node) => T | undefined, _cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { + [SyntaxKind.TypeAssertionExpression]: function forEachChildInTypeAssertionExpression(node: TypeAssertionExpression, cbNode: (node: Node) => T | undefined, _cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined { return visitNode(cbNode, node.type) || visitNode(cbNode, node.expression); }, diff --git a/src/compiler/moduleSpecifiers.ts b/src/compiler/moduleSpecifiers.ts index ac433ba8fed..22a9c751181 100644 --- a/src/compiler/moduleSpecifiers.ts +++ b/src/compiler/moduleSpecifiers.ts @@ -100,6 +100,7 @@ import { NodeModulePathParts, normalizePath, PackageJsonPathFields, + PartialSourceFile, pathContainsNodeModules, pathIsBareSpecifier, pathIsRelative, @@ -183,7 +184,7 @@ export function getModuleSpecifierPreferences( { importModuleSpecifierPreference, importModuleSpecifierEnding, autoImportSpecifierExcludeRegexes }: UserPreferences, host: Pick, compilerOptions: CompilerOptions, - importingSourceFile: Pick, + importingSourceFile: PartialSourceFile<"impliedNodeFormat" | "packageJsonScope">, oldImportSpecifier?: string, ): ModuleSpecifierPreferences { const filePreferredEnding = getPreferredEnding(); @@ -431,7 +432,7 @@ export function getModuleSpecifiersWithCacheInfo( /** @internal */ export function getLocalModuleSpecifierBetweenFileNames( - importingFile: Pick, + importingFile: PartialSourceFile<"impliedNodeFormat">, targetFileName: string, compilerOptions: CompilerOptions, host: ModuleSpecifierResolutionHost, @@ -1459,7 +1460,7 @@ function isPathRelativeToParent(path: string): boolean { return startsWith(path, ".."); } -function getDefaultResolutionModeForFile(file: Pick, host: Pick, compilerOptions: CompilerOptions) { +function getDefaultResolutionModeForFile(file: PartialSourceFile<"impliedNodeFormat" | "packageJsonScope">, host: Pick, compilerOptions: CompilerOptions) { return isFullSourceFile(file) ? host.getDefaultResolutionModeForFile(file) : getDefaultResolutionModeForFileWorker(file, compilerOptions); } diff --git a/src/compiler/nodes.ts b/src/compiler/nodes.ts new file mode 100644 index 00000000000..b09cc1f4d3a --- /dev/null +++ b/src/compiler/nodes.ts @@ -0,0 +1,613 @@ +import { + ArrayBindingPattern, + ArrayLiteralExpression, + ArrayTypeNode, + ArrowFunction, + AsExpression, + AstTokenData, + AwaitExpression, + BigIntLiteral, + BinaryExpression, + BindingElement, + Block, + BreakStatement, + Bundle, + CallExpression, + CallSignatureDeclaration, + CaseBlock, + CaseClause, + CatchClause, + ClassDeclaration, + ClassExpression, + ClassStaticBlockDeclaration, + CommaListExpression, + ComputedPropertyName, + ConditionalExpression, + ConditionalTypeNode, + ConstructorDeclaration, + ConstructorTypeNode, + ConstructSignatureDeclaration, + ContinueStatement, + DebuggerStatement, + Decorator, + DefaultClause, + DeleteExpression, + DoStatement, + ElementAccessExpression, + EmptyStatement, + EndOfFileToken, + EnumDeclaration, + EnumMember, + ExportAssignment, + ExportDeclaration, + ExportSpecifier, + ExpressionStatement, + ExpressionWithTypeArguments, + ExternalModuleReference, + FalseLiteral, + ForInStatement, + ForOfStatement, + ForStatement, + FunctionDeclaration, + FunctionExpression, + FunctionTypeNode, + GetAccessorDeclaration, + HasLocals, + HasName, + HeritageClause, + Identifier, + IfStatement, + ImportAttribute, + ImportClause, + ImportDeclaration, + ImportEqualsDeclaration, + ImportExpression, + ImportSpecifier, + ImportTypeAssertionContainer, + ImportTypeNode, + IndexedAccessTypeNode, + IndexSignatureDeclaration, + InferTypeNode, + InterfaceDeclaration, + IntersectionTypeNode, + IsFunctionLike, + JSDoc, + JSDocAllType, + JSDocAugmentsTag, + JSDocAuthorTag, + JSDocCallbackTag, + JSDocClassTag, + JSDocDeprecatedTag, + JSDocEnumTag, + JSDocFunctionType, + JSDocImplementsTag, + JSDocImportTag, + JSDocLink, + JSDocLinkCode, + JSDocLinkPlain, + JSDocMemberName, + JSDocNamepathType, + JSDocNameReference, + JSDocNonNullableType, + JSDocNullableType, + JSDocOptionalType, + JSDocOverloadTag, + JSDocOverrideTag, + JSDocParameterTag, + JSDocPrivateTag, + JSDocPropertyTag, + JSDocProtectedTag, + JSDocPublicTag, + JSDocReadonlyTag, + JSDocReturnTag, + JSDocSatisfiesTag, + JSDocSeeTag, + JSDocSignature, + JSDocTemplateTag, + JSDocText, + JSDocThisTag, + JSDocThrowsTag, + JSDocTypedefTag, + JSDocTypeExpression, + JSDocTypeLiteral, + JSDocTypeTag, + JSDocUnknownTag, + JSDocUnknownType, + JSDocVariadicType, + JsxAttribute, + JsxAttributes, + JsxClosingElement, + JsxClosingFragment, + JsxElement, + JsxExpression, + JsxFragment, + JsxNamespacedName, + JsxOpeningElement, + JsxOpeningFragment, + JsxSelfClosingElement, + JsxSpreadAttribute, + JsxText, + LabeledStatement, + LiteralTypeNode, + MappedTypeNode, + MetaProperty, + MethodDeclaration, + MethodSignature, + MissingDeclaration, + ModuleBlock, + ModuleDeclaration, + NamedExports, + NamedImports, + NamedTupleMember, + NamespaceExport, + NamespaceExportDeclaration, + NamespaceImport, + NewExpression, + NonNullExpression, + NoSubstitutionTemplateLiteral, + NotEmittedStatement, + NotEmittedTypeElement, + NullLiteral, + NumericLiteral, + ObjectBindingPattern, + ObjectLiteralExpression, + OmittedExpression, + OptionalTypeNode, + ParameterDeclaration, + ParenthesizedExpression, + ParenthesizedTypeNode, + PartiallyEmittedExpression, + PostfixUnaryExpression, + PrefixUnaryExpression, + PrivateIdentifier, + PropertyAccessExpression, + PropertyAssignment, + PropertyDeclaration, + PropertySignature, + QualifiedName, + RegularExpressionLiteral, + RestTypeNode, + ReturnStatement, + SatisfiesExpression, + SemicolonClassElement, + SetAccessorDeclaration, + ShorthandPropertyAssignment, + SourceFile, + SpreadAssignment, + SpreadElement, + StringLiteral, + SuperExpression, + SwitchStatement, + SyntaxKind, + SyntaxList, + SyntheticExpression, + SyntheticReferenceExpression, + TaggedTemplateExpression, + TemplateExpression, + TemplateHead, TemplateLiteralTypeNode, TemplateLiteralTypeSpan, TemplateMiddle, TemplateSpan, TemplateTail, + ThisExpression, + ThisTypeNode, + ThrowStatement, + Token, + TrueLiteral, + TryStatement, + TupleTypeNode, + TypeAliasDeclaration, + TypeAssertionExpression, + TypeLiteralNode, + TypeOfExpression, + TypeOperatorNode, + TypeParameterDeclaration, + TypePredicateNode, + TypeQueryNode, + TypeReferenceNode, + UnionTypeNode, + VariableDeclaration, + VariableDeclarationList, + VariableStatement, + VoidExpression, + WhileStatement, + WithStatement, + YieldExpression +} from "./_namespaces/ts.js"; + +{ + // eslint-disable-next-line @typescript-eslint/naming-convention + type _ = [ + __Expect>, + __Expect, IsFunctionLike>, + ]; +} + +{ + // eslint-disable-next-line @typescript-eslint/naming-convention + type _ = [ + __Expect>, + __Expect, HasLocals>, + ]; +} + +{ + // eslint-disable-next-line @typescript-eslint/naming-convention + type _ = [ + __Expect>, + __Expect, HasName>, + ]; +} + +// Registry + +/** + * A mapping of all `SyntaxKind` values to their associated `Node` subtypes. + */ +export interface NodeMap { + [SyntaxKind.Unknown]: Token; + [SyntaxKind.EndOfFileToken]: EndOfFileToken; + [SyntaxKind.SingleLineCommentTrivia]: Token; + [SyntaxKind.MultiLineCommentTrivia]: Token; + [SyntaxKind.NewLineTrivia]: Token; + [SyntaxKind.WhitespaceTrivia]: Token; + [SyntaxKind.ShebangTrivia]: Token; + [SyntaxKind.ConflictMarkerTrivia]: Token; + [SyntaxKind.NonTextFileMarkerTrivia]: never; + [SyntaxKind.NumericLiteral]: NumericLiteral; + [SyntaxKind.BigIntLiteral]: BigIntLiteral; + [SyntaxKind.StringLiteral]: StringLiteral; + [SyntaxKind.JsxText]: JsxText; + [SyntaxKind.JsxTextAllWhiteSpaces]: never; + [SyntaxKind.RegularExpressionLiteral]: RegularExpressionLiteral; + [SyntaxKind.NoSubstitutionTemplateLiteral]: NoSubstitutionTemplateLiteral; + [SyntaxKind.TemplateHead]: TemplateHead; + [SyntaxKind.TemplateMiddle]: TemplateMiddle; + [SyntaxKind.TemplateTail]: TemplateTail; + [SyntaxKind.OpenBraceToken]: Token; + [SyntaxKind.CloseBraceToken]: Token; + [SyntaxKind.OpenParenToken]: Token; + [SyntaxKind.CloseParenToken]: Token; + [SyntaxKind.OpenBracketToken]: Token; + [SyntaxKind.CloseBracketToken]: Token; + [SyntaxKind.DotToken]: Token; + [SyntaxKind.DotDotDotToken]: Token; + [SyntaxKind.SemicolonToken]: Token; + [SyntaxKind.CommaToken]: Token; + [SyntaxKind.QuestionDotToken]: Token; + [SyntaxKind.LessThanToken]: Token; + [SyntaxKind.LessThanSlashToken]: Token; + [SyntaxKind.GreaterThanToken]: Token; + [SyntaxKind.LessThanEqualsToken]: Token; + [SyntaxKind.GreaterThanEqualsToken]: Token; + [SyntaxKind.EqualsEqualsToken]: Token; + [SyntaxKind.ExclamationEqualsToken]: Token; + [SyntaxKind.EqualsEqualsEqualsToken]: Token; + [SyntaxKind.ExclamationEqualsEqualsToken]: Token; + [SyntaxKind.EqualsGreaterThanToken]: Token; + [SyntaxKind.PlusToken]: Token; + [SyntaxKind.MinusToken]: Token; + [SyntaxKind.AsteriskToken]: Token; + [SyntaxKind.AsteriskAsteriskToken]: Token; + [SyntaxKind.SlashToken]: Token; + [SyntaxKind.PercentToken]: Token; + [SyntaxKind.PlusPlusToken]: Token; + [SyntaxKind.MinusMinusToken]: Token; + [SyntaxKind.LessThanLessThanToken]: Token; + [SyntaxKind.GreaterThanGreaterThanToken]: Token; + [SyntaxKind.GreaterThanGreaterThanGreaterThanToken]: Token; + [SyntaxKind.AmpersandToken]: Token; + [SyntaxKind.BarToken]: Token; + [SyntaxKind.CaretToken]: Token; + [SyntaxKind.ExclamationToken]: Token; + [SyntaxKind.TildeToken]: Token; + [SyntaxKind.AmpersandAmpersandToken]: Token; + [SyntaxKind.BarBarToken]: Token; + [SyntaxKind.QuestionToken]: Token; + [SyntaxKind.ColonToken]: Token; + [SyntaxKind.AtToken]: Token; + [SyntaxKind.QuestionQuestionToken]: Token; + [SyntaxKind.BacktickToken]: Token; + [SyntaxKind.HashToken]: Token; + [SyntaxKind.EqualsToken]: Token; + [SyntaxKind.PlusEqualsToken]: Token; + [SyntaxKind.MinusEqualsToken]: Token; + [SyntaxKind.AsteriskEqualsToken]: Token; + [SyntaxKind.AsteriskAsteriskEqualsToken]: Token; + [SyntaxKind.SlashEqualsToken]: Token; + [SyntaxKind.PercentEqualsToken]: Token; + [SyntaxKind.LessThanLessThanEqualsToken]: Token; + [SyntaxKind.GreaterThanGreaterThanEqualsToken]: Token; + [SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken]: Token; + [SyntaxKind.AmpersandEqualsToken]: Token; + [SyntaxKind.BarEqualsToken]: Token; + [SyntaxKind.BarBarEqualsToken]: Token; + [SyntaxKind.AmpersandAmpersandEqualsToken]: Token; + [SyntaxKind.QuestionQuestionEqualsToken]: Token; + [SyntaxKind.CaretEqualsToken]: Token; + [SyntaxKind.Identifier]: Identifier; + [SyntaxKind.PrivateIdentifier]: PrivateIdentifier; + /** @internal */ + [SyntaxKind.JSDocCommentTextToken]: never; + [SyntaxKind.BreakKeyword]: Token; + [SyntaxKind.CaseKeyword]: Token; + [SyntaxKind.CatchKeyword]: Token; + [SyntaxKind.ClassKeyword]: Token; + [SyntaxKind.ConstKeyword]: Token; + [SyntaxKind.ContinueKeyword]: Token; + [SyntaxKind.DebuggerKeyword]: Token; + [SyntaxKind.DefaultKeyword]: Token; + [SyntaxKind.DeleteKeyword]: Token; + [SyntaxKind.DoKeyword]: Token; + [SyntaxKind.ElseKeyword]: Token; + [SyntaxKind.EnumKeyword]: Token; + [SyntaxKind.ExportKeyword]: Token; + [SyntaxKind.ExtendsKeyword]: Token; + [SyntaxKind.FalseKeyword]: FalseLiteral; + [SyntaxKind.FinallyKeyword]: Token; + [SyntaxKind.ForKeyword]: Token; + [SyntaxKind.FunctionKeyword]: Token; + [SyntaxKind.IfKeyword]: Token; + [SyntaxKind.ImportKeyword]: ImportExpression; + [SyntaxKind.InKeyword]: Token; + [SyntaxKind.InstanceOfKeyword]: Token; + [SyntaxKind.NewKeyword]: Token; + [SyntaxKind.NullKeyword]: NullLiteral; + [SyntaxKind.ReturnKeyword]: Token; + [SyntaxKind.SuperKeyword]: SuperExpression; + [SyntaxKind.SwitchKeyword]: Token; + [SyntaxKind.ThisKeyword]: ThisExpression; + [SyntaxKind.ThrowKeyword]: Token; + [SyntaxKind.TrueKeyword]: TrueLiteral; + [SyntaxKind.TryKeyword]: Token; + [SyntaxKind.TypeOfKeyword]: Token; + [SyntaxKind.VarKeyword]: Token; + [SyntaxKind.VoidKeyword]: Token; + [SyntaxKind.WhileKeyword]: Token; + [SyntaxKind.WithKeyword]: Token; + [SyntaxKind.ImplementsKeyword]: Token; + [SyntaxKind.InterfaceKeyword]: Token; + [SyntaxKind.LetKeyword]: Token; + [SyntaxKind.PackageKeyword]: Token; + [SyntaxKind.PrivateKeyword]: Token; + [SyntaxKind.ProtectedKeyword]: Token; + [SyntaxKind.PublicKeyword]: Token; + [SyntaxKind.StaticKeyword]: Token; + [SyntaxKind.YieldKeyword]: Token; + [SyntaxKind.AbstractKeyword]: Token; + [SyntaxKind.AccessorKeyword]: Token; + [SyntaxKind.AsKeyword]: Token; + [SyntaxKind.AssertsKeyword]: Token; + [SyntaxKind.AssertKeyword]: Token; + [SyntaxKind.AnyKeyword]: Token; + [SyntaxKind.AsyncKeyword]: Token; + [SyntaxKind.AwaitKeyword]: Token; + [SyntaxKind.BooleanKeyword]: Token; + [SyntaxKind.ConstructorKeyword]: Token; + [SyntaxKind.DeclareKeyword]: Token; + [SyntaxKind.GetKeyword]: Token; + [SyntaxKind.InferKeyword]: Token; + [SyntaxKind.IntrinsicKeyword]: Token; + [SyntaxKind.IsKeyword]: Token; + [SyntaxKind.KeyOfKeyword]: Token; + [SyntaxKind.ModuleKeyword]: Token; + [SyntaxKind.NamespaceKeyword]: Token; + [SyntaxKind.NeverKeyword]: Token; + [SyntaxKind.OutKeyword]: Token; + [SyntaxKind.ReadonlyKeyword]: Token; + [SyntaxKind.RequireKeyword]: Token; + [SyntaxKind.NumberKeyword]: Token; + [SyntaxKind.ObjectKeyword]: Token; + [SyntaxKind.SatisfiesKeyword]: Token; + [SyntaxKind.SetKeyword]: Token; + [SyntaxKind.StringKeyword]: Token; + [SyntaxKind.SymbolKeyword]: Token; + [SyntaxKind.TypeKeyword]: Token; + [SyntaxKind.UndefinedKeyword]: Token; + [SyntaxKind.UniqueKeyword]: Token; + [SyntaxKind.UnknownKeyword]: Token; + [SyntaxKind.UsingKeyword]: Token; + [SyntaxKind.FromKeyword]: Token; + [SyntaxKind.GlobalKeyword]: Token; + [SyntaxKind.BigIntKeyword]: Token; + [SyntaxKind.OverrideKeyword]: Token; + [SyntaxKind.OfKeyword]: Token; + [SyntaxKind.QualifiedName]: QualifiedName; + [SyntaxKind.ComputedPropertyName]: ComputedPropertyName; + [SyntaxKind.Decorator]: Decorator; + [SyntaxKind.TypeParameter]: TypeParameterDeclaration; + [SyntaxKind.CallSignature]: CallSignatureDeclaration; + [SyntaxKind.ConstructSignature]: ConstructSignatureDeclaration; + [SyntaxKind.VariableDeclaration]: VariableDeclaration; + [SyntaxKind.VariableDeclarationList]: VariableDeclarationList; + [SyntaxKind.Parameter]: ParameterDeclaration; + [SyntaxKind.BindingElement]: BindingElement; + [SyntaxKind.PropertySignature]: PropertySignature; + [SyntaxKind.PropertyDeclaration]: PropertyDeclaration; + [SyntaxKind.PropertyAssignment]: PropertyAssignment; + [SyntaxKind.ShorthandPropertyAssignment]: ShorthandPropertyAssignment; + [SyntaxKind.SpreadAssignment]: SpreadAssignment; + [SyntaxKind.ObjectBindingPattern]: ObjectBindingPattern; + [SyntaxKind.ArrayBindingPattern]: ArrayBindingPattern; + [SyntaxKind.FunctionDeclaration]: FunctionDeclaration; + [SyntaxKind.MethodSignature]: MethodSignature; + [SyntaxKind.MethodDeclaration]: MethodDeclaration; + [SyntaxKind.Constructor]: ConstructorDeclaration; + [SyntaxKind.SemicolonClassElement]: SemicolonClassElement; + [SyntaxKind.GetAccessor]: GetAccessorDeclaration; + [SyntaxKind.SetAccessor]: SetAccessorDeclaration; + [SyntaxKind.IndexSignature]: IndexSignatureDeclaration; + [SyntaxKind.ClassStaticBlockDeclaration]: ClassStaticBlockDeclaration; + [SyntaxKind.ImportTypeAssertionContainer]: ImportTypeAssertionContainer; + [SyntaxKind.ImportType]: ImportTypeNode; + [SyntaxKind.ThisType]: ThisTypeNode; + [SyntaxKind.FunctionType]: FunctionTypeNode; + [SyntaxKind.ConstructorType]: ConstructorTypeNode; + [SyntaxKind.TypeReference]: TypeReferenceNode; + [SyntaxKind.TypePredicate]: TypePredicateNode; + [SyntaxKind.TypeQuery]: TypeQueryNode; + [SyntaxKind.TypeLiteral]: TypeLiteralNode; + [SyntaxKind.ArrayType]: ArrayTypeNode; + [SyntaxKind.TupleType]: TupleTypeNode; + [SyntaxKind.NamedTupleMember]: NamedTupleMember; + [SyntaxKind.OptionalType]: OptionalTypeNode; + [SyntaxKind.RestType]: RestTypeNode; + [SyntaxKind.UnionType]: UnionTypeNode; + [SyntaxKind.IntersectionType]: IntersectionTypeNode; + [SyntaxKind.ConditionalType]: ConditionalTypeNode; + [SyntaxKind.InferType]: InferTypeNode; + [SyntaxKind.ParenthesizedType]: ParenthesizedTypeNode; + [SyntaxKind.TypeOperator]: TypeOperatorNode; + [SyntaxKind.IndexedAccessType]: IndexedAccessTypeNode; + [SyntaxKind.MappedType]: MappedTypeNode; + [SyntaxKind.LiteralType]: LiteralTypeNode; + [SyntaxKind.TemplateLiteralType]: TemplateLiteralTypeNode; + [SyntaxKind.TemplateLiteralTypeSpan]: TemplateLiteralTypeSpan; + [SyntaxKind.OmittedExpression]: OmittedExpression; + [SyntaxKind.PrefixUnaryExpression]: PrefixUnaryExpression; + [SyntaxKind.PostfixUnaryExpression]: PostfixUnaryExpression; + [SyntaxKind.DeleteExpression]: DeleteExpression; + [SyntaxKind.TypeOfExpression]: TypeOfExpression; + [SyntaxKind.VoidExpression]: VoidExpression; + [SyntaxKind.AwaitExpression]: AwaitExpression; + [SyntaxKind.YieldExpression]: YieldExpression; + [SyntaxKind.BinaryExpression]: BinaryExpression; + [SyntaxKind.ConditionalExpression]: ConditionalExpression; + [SyntaxKind.FunctionExpression]: FunctionExpression; + [SyntaxKind.ArrowFunction]: ArrowFunction; + [SyntaxKind.TemplateExpression]: TemplateExpression; + [SyntaxKind.TemplateSpan]: TemplateSpan; + [SyntaxKind.ParenthesizedExpression]: ParenthesizedExpression; + [SyntaxKind.ArrayLiteralExpression]: ArrayLiteralExpression; + [SyntaxKind.SpreadElement]: SpreadElement; + [SyntaxKind.ObjectLiteralExpression]: ObjectLiteralExpression; + [SyntaxKind.PropertyAccessExpression]: PropertyAccessExpression; + [SyntaxKind.ElementAccessExpression]: ElementAccessExpression; + [SyntaxKind.CallExpression]: CallExpression; + [SyntaxKind.ExpressionWithTypeArguments]: ExpressionWithTypeArguments; + [SyntaxKind.NewExpression]: NewExpression; + [SyntaxKind.TaggedTemplateExpression]: TaggedTemplateExpression; + [SyntaxKind.AsExpression]: AsExpression; + [SyntaxKind.TypeAssertionExpression]: TypeAssertionExpression; + [SyntaxKind.SyntheticExpression]: SyntheticExpression; + [SyntaxKind.SatisfiesExpression]: SatisfiesExpression; + [SyntaxKind.NonNullExpression]: NonNullExpression; + [SyntaxKind.MetaProperty]: MetaProperty; + [SyntaxKind.JsxElement]: JsxElement; + [SyntaxKind.JsxAttributes]: JsxAttributes; + [SyntaxKind.JsxNamespacedName]: JsxNamespacedName; + [SyntaxKind.JsxOpeningElement]: JsxOpeningElement; + [SyntaxKind.JsxSelfClosingElement]: JsxSelfClosingElement; + [SyntaxKind.JsxFragment]: JsxFragment; + [SyntaxKind.JsxOpeningFragment]: JsxOpeningFragment; + [SyntaxKind.JsxClosingFragment]: JsxClosingFragment; + [SyntaxKind.JsxAttribute]: JsxAttribute; + [SyntaxKind.JsxSpreadAttribute]: JsxSpreadAttribute; + [SyntaxKind.JsxClosingElement]: JsxClosingElement; + [SyntaxKind.JsxExpression]: JsxExpression; + [SyntaxKind.EmptyStatement]: EmptyStatement; + [SyntaxKind.DebuggerStatement]: DebuggerStatement; + [SyntaxKind.MissingDeclaration]: MissingDeclaration; + [SyntaxKind.Block]: Block; + [SyntaxKind.VariableStatement]: VariableStatement; + [SyntaxKind.ExpressionStatement]: ExpressionStatement; + [SyntaxKind.IfStatement]: IfStatement; + [SyntaxKind.DoStatement]: DoStatement; + [SyntaxKind.WhileStatement]: WhileStatement; + [SyntaxKind.ForStatement]: ForStatement; + [SyntaxKind.ForInStatement]: ForInStatement; + [SyntaxKind.ForOfStatement]: ForOfStatement; + [SyntaxKind.BreakStatement]: BreakStatement; + [SyntaxKind.ContinueStatement]: ContinueStatement; + [SyntaxKind.ReturnStatement]: ReturnStatement; + [SyntaxKind.WithStatement]: WithStatement; + [SyntaxKind.SwitchStatement]: SwitchStatement; + [SyntaxKind.CaseBlock]: CaseBlock; + [SyntaxKind.CaseClause]: CaseClause; + [SyntaxKind.DefaultClause]: DefaultClause; + [SyntaxKind.LabeledStatement]: LabeledStatement; + [SyntaxKind.ThrowStatement]: ThrowStatement; + [SyntaxKind.TryStatement]: TryStatement; + [SyntaxKind.CatchClause]: CatchClause; + [SyntaxKind.ClassDeclaration]: ClassDeclaration; + [SyntaxKind.ClassExpression]: ClassExpression; + [SyntaxKind.InterfaceDeclaration]: InterfaceDeclaration; + [SyntaxKind.HeritageClause]: HeritageClause; + [SyntaxKind.TypeAliasDeclaration]: TypeAliasDeclaration; + [SyntaxKind.EnumMember]: EnumMember; + [SyntaxKind.EnumDeclaration]: EnumDeclaration; + [SyntaxKind.ModuleDeclaration]: ModuleDeclaration; + [SyntaxKind.ModuleBlock]: ModuleBlock; + [SyntaxKind.ImportEqualsDeclaration]: ImportEqualsDeclaration; + [SyntaxKind.ExternalModuleReference]: ExternalModuleReference; + [SyntaxKind.ImportDeclaration]: ImportDeclaration; + [SyntaxKind.ImportClause]: ImportClause; + [SyntaxKind.ImportAttribute]: ImportAttribute; + [SyntaxKind.ImportAttributes]: ImportAttributes; + [SyntaxKind.NamespaceImport]: NamespaceImport; + [SyntaxKind.NamespaceExport]: NamespaceExport; + [SyntaxKind.NamespaceExportDeclaration]: NamespaceExportDeclaration; + [SyntaxKind.ExportDeclaration]: ExportDeclaration; + [SyntaxKind.NamedImports]: NamedImports; + [SyntaxKind.NamedExports]: NamedExports; + [SyntaxKind.ImportSpecifier]: ImportSpecifier; + [SyntaxKind.ExportSpecifier]: ExportSpecifier; + [SyntaxKind.ExportAssignment]: ExportAssignment; + [SyntaxKind.JSDocTypeExpression]: JSDocTypeExpression; + [SyntaxKind.JSDocNameReference]: JSDocNameReference; + [SyntaxKind.JSDocMemberName]: JSDocMemberName; + [SyntaxKind.JSDocAllType]: JSDocAllType; + [SyntaxKind.JSDocUnknownType]: JSDocUnknownType; + [SyntaxKind.JSDocNonNullableType]: JSDocNonNullableType; + [SyntaxKind.JSDocNullableType]: JSDocNullableType; + [SyntaxKind.JSDocOptionalType]: JSDocOptionalType; + [SyntaxKind.JSDocFunctionType]: JSDocFunctionType; + [SyntaxKind.JSDocVariadicType]: JSDocVariadicType; + [SyntaxKind.JSDocNamepathType]: JSDocNamepathType; + [SyntaxKind.JSDoc]: JSDoc; + [SyntaxKind.JSDocLink]: JSDocLink; + [SyntaxKind.JSDocLinkCode]: JSDocLinkCode; + [SyntaxKind.JSDocLinkPlain]: JSDocLinkPlain; + [SyntaxKind.JSDocText]: JSDocText; + [SyntaxKind.JSDocTag]: JSDocUnknownTag; + [SyntaxKind.JSDocAugmentsTag]: JSDocAugmentsTag; + [SyntaxKind.JSDocImplementsTag]: JSDocImplementsTag; + [SyntaxKind.JSDocAuthorTag]: JSDocAuthorTag; + [SyntaxKind.JSDocDeprecatedTag]: JSDocDeprecatedTag; + [SyntaxKind.JSDocClassTag]: JSDocClassTag; + [SyntaxKind.JSDocPublicTag]: JSDocPublicTag; + [SyntaxKind.JSDocPrivateTag]: JSDocPrivateTag; + [SyntaxKind.JSDocProtectedTag]: JSDocProtectedTag; + [SyntaxKind.JSDocReadonlyTag]: JSDocReadonlyTag; + [SyntaxKind.JSDocOverrideTag]: JSDocOverrideTag; + [SyntaxKind.JSDocEnumTag]: JSDocEnumTag; + [SyntaxKind.JSDocThisTag]: JSDocThisTag; + [SyntaxKind.JSDocTemplateTag]: JSDocTemplateTag; + [SyntaxKind.JSDocSeeTag]: JSDocSeeTag; + [SyntaxKind.JSDocReturnTag]: JSDocReturnTag; + [SyntaxKind.JSDocTypeTag]: JSDocTypeTag; + [SyntaxKind.JSDocTypedefTag]: JSDocTypedefTag; + [SyntaxKind.JSDocCallbackTag]: JSDocCallbackTag; + [SyntaxKind.JSDocOverloadTag]: JSDocOverloadTag; + [SyntaxKind.JSDocThrowsTag]: JSDocThrowsTag; + [SyntaxKind.JSDocSignature]: JSDocSignature; + [SyntaxKind.JSDocPropertyTag]: JSDocPropertyTag; + [SyntaxKind.JSDocParameterTag]: JSDocParameterTag; + [SyntaxKind.JSDocTypeLiteral]: JSDocTypeLiteral; + [SyntaxKind.JSDocSatisfiesTag]: JSDocSatisfiesTag; + [SyntaxKind.JSDocImportTag]: JSDocImportTag; + [SyntaxKind.SourceFile]: SourceFile; + [SyntaxKind.Bundle]: Bundle; + [SyntaxKind.SyntaxList]: SyntaxList; + [SyntaxKind.NotEmittedStatement]: NotEmittedStatement; + [SyntaxKind.NotEmittedTypeElement]: NotEmittedTypeElement; + [SyntaxKind.PartiallyEmittedExpression]: PartiallyEmittedExpression; + [SyntaxKind.CommaListExpression]: CommaListExpression; + /** @internal */ + [SyntaxKind.SyntheticReferenceExpression]: SyntheticReferenceExpression; + [SyntaxKind.Count]: never; + [SyntaxKind.NonTextFileMarkerTrivia]: never; +} + +/** + * The set of all `Node` subtypes. + */ +export type Nodes = NodeMap[keyof NodeMap]; + +type __Expect = never; // eslint-disable-line @typescript-eslint/naming-convention diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index d240c141f38..24ac27de383 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -1,4 +1,8 @@ import { + addRange, + addRelatedInfo, + append, + AssertionLevel, AstAccessorDeclaration, AstArrayBindingElement, AstArrayBindingPattern, @@ -17,6 +21,7 @@ import { AstBooleanLiteral, AstBreakOrContinueStatement, AstCallSignatureDeclaration, + astCanHaveModifiers, AstCaseBlock, AstCaseClause, AstCaseOrDefaultClause, @@ -46,6 +51,7 @@ import { AstExpression, AstExpressionStatement, AstExpressionWithTypeArguments, + astForEachChild, AstForInitializer, AstForInOrOfStatement, AstForStatement, @@ -53,6 +59,8 @@ import { AstFunctionExpression, AstFunctionOrConstructorTypeNode, AstHasJSDoc, + astHasJSDocNodes, + AstHasModifiers, AstHeritageClause, AstIdentifier, AstIfStatement, @@ -67,6 +75,7 @@ import { AstInferTypeNode, AstInterfaceDeclaration, AstIterationStatement, + AstJSDoc, AstJSDocAllType, AstJSDocAugmentsTag, AstJSDocAuthorTag, @@ -80,7 +89,6 @@ import { AstJSDocMemberName, AstJSDocNameReference, AstJSDocNamespaceDeclaration, - AstJSDoc, AstJSDocNullableType, AstJSDocOptionalType, AstJSDocOverloadTag, @@ -213,47 +221,8 @@ import { AstWhileStatement, AstWithStatement, AstYieldExpression, - createAstNodeFactory, - astHasJSDocNodes, - isAstAsyncModifier, - isAstDeclareKeyword, - isAstExportModifier, - isAstExpressionWithTypeArguments, - isAstFunctionTypeNode, - isAstIdentifier, - isAstJSDocFunctionType, - isAstJSDocNullableType, - isAstJSDocReturnTag, - isAstJSDocTypeTag, - isAstJsxNamespacedName, - isAstJsxOpeningElement, - isAstJsxOpeningFragment, - isAstLeftHandSideExpression, - isAstNonNullExpression, - isAstPrivateIdentifier, - isAstSetAccessorDeclaration, - isAstStringOrNumericLiteralLike, - isAstTaggedTemplateExpression, - isAstTypeReferenceNode, - astForEachChild, - isAstMetaProperty, - astCanHaveModifiers, - AstHasModifiers, - isAstImportEqualsDeclaration, - isAstImportDeclaration, - isAstExportAssignment, - isAstExportDeclaration, - isAstExternalModuleReference, -} from "./_namespaces/ts.ast.js"; -import { - addRange, - addRelatedInfo, - append, - AssertionLevel, - ast, attachFileToDiagnostics, canHaveJSDoc, - canHaveModifiers, CharacterCodes, CommentDirective, commentPragmas, @@ -261,6 +230,7 @@ import { concatenate, containsParseError, convertToJson, + createAstNodeFactory, createDetachedDiagnostic, createNodeFactory, createScanner, @@ -281,7 +251,6 @@ import { findIndex, firstOrUndefined, forEach, - forEachChild, getAnyExtensionFromPath, getBaseFileName, getBinaryOperatorPrecedence, @@ -292,21 +261,40 @@ import { getLeadingCommentRanges, getSpellingSuggestion, getTextOfNodeFromSourceText, - HasModifiers, identity, isArray, isAssignmentOperator, + isAstAsyncModifier, + isAstDeclareKeyword, + isAstExportAssignment, + isAstExportDeclaration, + isAstExportModifier, + isAstExpressionWithTypeArguments, + isAstExternalModuleReference, + isAstFunctionTypeNode, + isAstIdentifier, + isAstImportDeclaration, + isAstImportEqualsDeclaration, + isAstJSDocFunctionType, + isAstJSDocNullableType, + isAstJSDocReturnTag, + isAstJSDocTypeTag, + isAstJsxNamespacedName, + isAstJsxOpeningElement, + isAstJsxOpeningFragment, + isAstLeftHandSideExpression, + isAstMetaProperty, + isAstNonNullExpression, + isAstPrivateIdentifier, + isAstSetAccessorDeclaration, + isAstStringOrNumericLiteralLike, + isAstTaggedTemplateExpression, + isAstTypeReferenceNode, isClassMemberModifier, - isExportAssignment, - isExportDeclaration, - isExternalModuleReference, isIdentifierText, - isImportDeclaration, - isImportEqualsDeclaration, isKeyword, isKeywordOrPunctuation, isLiteralKind, - isMetaProperty, isModifierKind, isTemplateLiteralKind, JSDoc, @@ -325,7 +313,6 @@ import { ModuleKind, Mutable, Node, - NodeArray, NodeFactory, NodeFactoryFlags, NodeFlags, @@ -411,7 +398,7 @@ export function isFileProbablyExternalModule(sourceFile: SourceFile): Node | und // Try to use the first top-level import/export when available, then // fall back to looking for an 'import.meta' somewhere in the tree if necessary. // TODO(rbuckton): do not instantiate .node - return forEach((sourceFile as AstSourceFile["node"]).ast.data.statements.items, isAnExternalModuleIndicatorNode)?.node || + return forEach(sourceFile.ast.data.statements.items, isAnExternalModuleIndicatorNode)?.node || getImportMetaIfNecessary(sourceFile)?.node; } @@ -425,7 +412,7 @@ function isAnExternalModuleIndicatorNode(node: AstNode) { function getImportMetaIfNecessary(sourceFile: SourceFile) { return sourceFile.flags & NodeFlags.PossiblyContainsImportMeta ? - walkTreeForImportMeta((sourceFile as AstSourceFile["node"]).ast) : + walkTreeForImportMeta(sourceFile.ast) : undefined; } @@ -521,7 +508,7 @@ export function isExternalModule(file: SourceFile): boolean { // becoming detached from any SourceFile). It is recommended that this SourceFile not // be used once 'update' is called on it. export function updateSourceFile(sourceFile: SourceFile, newText: string, textChangeRange: TextChangeRange, aggressiveChecks = false): SourceFile { - const newSourceFile = IncrementalParser.updateSourceFile((sourceFile as AstSourceFile["node"]).ast, newText, textChangeRange, aggressiveChecks); + const newSourceFile = IncrementalParser.updateSourceFile(sourceFile.ast, newText, textChangeRange, aggressiveChecks); // Because new source file node is created, it may not have the flag PossiblyContainDynamicImport. This is the case if there is no new edit to add dynamic import. // We will manually port the flag to the new source file. newSourceFile.flags |= sourceFile.flags & NodeFlags.PermanentlySetIncrementalFlags; @@ -540,7 +527,7 @@ export function parseIsolatedJSDocComment(content: string, start?: number, lengt if (result && result.jsDoc) { // because the jsDocComment was parsed out of the source file, it might // not be covered by the fixupParentReferences. - Parser.fixupParentReferences((result.jsDoc as AstJSDoc["node"]).ast); + Parser.fixupParentReferences(result.jsDoc.ast); } return result; @@ -9173,7 +9160,7 @@ namespace IncrementalParser { astForEachChild(node, visitNode, visitArray); if (astHasJSDocNodes(node)) { for (const jsDocComment of node.data.jsDoc!) { - visitNode((jsDocComment as AstJSDoc["node"]).ast); // TODO(rbuckton): have JSDocArray store AstJSDoc entries + visitNode(jsDocComment.ast); // TODO(rbuckton): have JSDocArray store AstJSDoc entries } } checkNodePositions(node, aggressiveChecks); @@ -9283,7 +9270,7 @@ namespace IncrementalParser { }; if (astHasJSDocNodes(node)) { for (const jsDocComment of node.data.jsDoc!) { - visitNode((jsDocComment as AstJSDoc["node"]).ast); // TODO(rbuckton): have JSDocArray store AstJSDoc entries + visitNode(jsDocComment.ast); // TODO(rbuckton): have JSDocArray store AstJSDoc entries } } astForEachChild(node, visitNode); @@ -9326,7 +9313,7 @@ namespace IncrementalParser { astForEachChild(child, visitNode, visitArray); if (astHasJSDocNodes(child)) { for (const jsDocComment of child.data.jsDoc!) { - visitNode((jsDocComment as AstJSDoc["node"]).ast); + visitNode(jsDocComment.ast); } } checkNodePositions(child, aggressiveChecks); @@ -9417,7 +9404,7 @@ namespace IncrementalParser { while (true) { const lastChild = getLastChild(node.node); // TODO(rbuckton): do not instantiate .node if (lastChild) { - node = (lastChild as AstNode["node"]).ast; + node = lastChild.ast; } else { return node; @@ -9858,9 +9845,9 @@ function getNamedPragmaArguments(pragma: PragmaDefinition, text: string | undefi } /** @internal */ -export function tagNamesAreEquivalent(lhs: JsxTagNameExpression | ast.AstJsxTagNameExpression, rhs: JsxTagNameExpression | ast.AstJsxTagNameExpression): boolean { - if (!(lhs instanceof AstNode)) lhs = (lhs as AstJsxTagNameExpression["node"]).ast; - if (!(rhs instanceof AstNode)) rhs = (rhs as AstJsxTagNameExpression["node"]).ast; +export function tagNamesAreEquivalent(lhs: JsxTagNameExpression | AstJsxTagNameExpression, rhs: JsxTagNameExpression | AstJsxTagNameExpression): boolean { + if (!(lhs instanceof AstNode)) lhs = lhs.ast; + if (!(rhs instanceof AstNode)) rhs = rhs.ast; if (lhs.kind !== rhs.kind) { return false; } diff --git a/src/compiler/program.ts b/src/compiler/program.ts index ad18f43b29e..d007322d714 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -333,6 +333,7 @@ import { WriteFileCallback, WriteFileCallbackData, writeFileEnsuringDirectories, + PartialSourceFile, } from "./_namespaces/ts.js"; import * as performance from "./_namespaces/ts.performance.js"; @@ -888,7 +889,7 @@ export function getModeForResolutionAtIndex(file: SourceFileImportsList, index: export function getModeForResolutionAtIndex(file: SourceFileImportsList, index: number, compilerOptions?: CompilerOptions): ResolutionMode { // we ensure all elements of file.imports and file.moduleAugmentations have the relevant parent pointers set during program setup, // so it's safe to use them even pre-bind - return getModeForUsageLocationWorker(file, getModuleNameStringLiteralAt(file, index), compilerOptions); + return getModeForUsageLocationWorker(file as PartialSourceFile<"impliedNodeFormat" | "packageJsonScope">, getModuleNameStringLiteralAt(file, index), compilerOptions); } /** @internal */ @@ -944,7 +945,7 @@ export function getModeForUsageLocation(file: SourceFile, usage: StringLiteralLi return getModeForUsageLocationWorker(file, usage, compilerOptions); } -function getModeForUsageLocationWorker(file: Pick, usage: StringLiteralLike, compilerOptions?: CompilerOptions) { +function getModeForUsageLocationWorker(file: PartialSourceFile<"impliedNodeFormat" | "packageJsonScope">, usage: StringLiteralLike, compilerOptions?: CompilerOptions) { if (isImportDeclaration(usage.parent) || isExportDeclaration(usage.parent) || isJSDocImportTag(usage.parent)) { const isTypeOnly = isExclusivelyTypeOnlyImportOrExport(usage.parent); if (isTypeOnly) { @@ -966,7 +967,7 @@ function getModeForUsageLocationWorker(file: Pick, usage: StringLiteralLike, compilerOptions?: CompilerOptions): ResolutionMode { +function getEmitSyntaxForUsageLocationWorker(file: PartialSourceFile<"impliedNodeFormat" | "packageJsonScope">, usage: StringLiteralLike, compilerOptions?: CompilerOptions): ResolutionMode { if (!compilerOptions) { // This should always be provided, but we try to fail somewhat // gracefully to allow projects like ts-node time to update. @@ -5204,7 +5205,7 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg } } -function shouldTransformImportCallWorker(sourceFile: Pick, options: CompilerOptions): boolean { +function shouldTransformImportCallWorker(sourceFile: PartialSourceFile<"impliedNodeFormat" | "packageJsonScope">, options: CompilerOptions): boolean { const moduleKind = getEmitModuleKind(options); if (ModuleKind.Node16 <= moduleKind && moduleKind <= ModuleKind.NodeNext || moduleKind === ModuleKind.Preserve) { return false; @@ -5212,11 +5213,11 @@ function shouldTransformImportCallWorker(sourceFile: Pick, options: CompilerOptions): ModuleKind { +export function getEmitModuleFormatOfFileWorker(sourceFile: PartialSourceFile<"impliedNodeFormat" | "packageJsonScope">, options: CompilerOptions): ModuleKind { return getImpliedNodeFormatForEmitWorker(sourceFile, options) ?? getEmitModuleKind(options); } /** @internal Prefer `program.getImpliedNodeFormatForEmit` when possible. */ -export function getImpliedNodeFormatForEmitWorker(sourceFile: Pick, options: CompilerOptions): ResolutionMode { +export function getImpliedNodeFormatForEmitWorker(sourceFile: PartialSourceFile<"impliedNodeFormat" | "packageJsonScope">, options: CompilerOptions): ResolutionMode { const moduleKind = getEmitModuleKind(options); if (ModuleKind.Node16 <= moduleKind && moduleKind <= ModuleKind.NodeNext) { return sourceFile.impliedNodeFormat; @@ -5238,7 +5239,7 @@ export function getImpliedNodeFormatForEmitWorker(sourceFile: Pick, options: CompilerOptions): ResolutionMode { +export function getDefaultResolutionModeForFileWorker(sourceFile: PartialSourceFile<"impliedNodeFormat" | "packageJsonScope">, options: CompilerOptions): ResolutionMode { return importSyntaxAffectsModuleResolution(options) ? getImpliedNodeFormatForEmitWorker(sourceFile, options) : undefined; } diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index 7d8bc6f8eab..5bc306d4eb9 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -16,6 +16,7 @@ import { BindingElement, Bundle, CallExpression, + canHaveAsteriskToken, chainBundle, ClassDeclaration, ClassElement, @@ -851,7 +852,7 @@ export function transformClassFields(context: TransformationContext): (x: Source functionName, factory.createFunctionExpression( filter(node.modifiers, (m): m is Modifier => isModifier(m) && !isStaticModifier(m) && !isAccessorModifier(m)), - node.asteriskToken, + tryCast(node, canHaveAsteriskToken)?.asteriskToken, functionName, /*typeParameters*/ undefined, visitParameterList(node.parameters, visitor, context), @@ -3300,7 +3301,7 @@ export function transformClassFields(context: TransformationContext): (x: Source // constructor references in static property initializers. const declaration = resolver.getReferencedValueDeclaration(node); if (declaration) { - const classAlias = classAliases[declaration.id!]; // TODO: GH#18217 + const classAlias = classAliases[declaration.id]; // TODO: GH#18217 if (classAlias) { const clone = factory.cloneNode(classAlias); setSourceMapRange(clone, node); diff --git a/src/compiler/transformers/declarations.ts b/src/compiler/transformers/declarations.ts index ba19f34fe0a..a53391fb3d4 100644 --- a/src/compiler/transformers/declarations.ts +++ b/src/compiler/transformers/declarations.ts @@ -10,6 +10,7 @@ import { Bundle, CallSignatureDeclaration, canHaveModifiers, + canHaveName, canProduceDiagnostics, ClassDeclaration, compact, @@ -683,7 +684,7 @@ export function transformDeclarations(context: TransformationContext): Transform return visitNode(type, visitDeclarationSubtree, isTypeNode); } - errorNameNode = node.name; + errorNameNode = canHaveName(node) ? node.name : undefined; let oldDiag: typeof getSymbolAccessibilityDiagnostic; if (!suppressNewDiagnosticContexts) { oldDiag = getSymbolAccessibilityDiagnostic; diff --git a/src/compiler/transformers/declarations/diagnostics.ts b/src/compiler/transformers/declarations/diagnostics.ts index 7e2978d9c59..b90f578f000 100644 --- a/src/compiler/transformers/declarations/diagnostics.ts +++ b/src/compiler/transformers/declarations/diagnostics.ts @@ -31,6 +31,7 @@ import { getAllAccessorDeclarations, getNameOfDeclaration, getTextOfNode, + hasName, hasSyntacticModifier, ImportEqualsDeclaration, IndexSignatureDeclaration, @@ -733,7 +734,7 @@ export function createGetIsolatedDeclarationErrors(resolver: EmitResolver): (nod function addParentDeclarationRelatedInfo(node: Node, diag: DiagnosticWithLocation) { const parentDeclaration = findNearestDeclaration(node); if (parentDeclaration) { - const targetStr = isExportAssignment(parentDeclaration) || !parentDeclaration.name ? "" : getTextOfNode(parentDeclaration.name, /*includeTrivia*/ false); + const targetStr = isExportAssignment(parentDeclaration) || !hasName(parentDeclaration) ? "" : getTextOfNode(parentDeclaration.name, /*includeTrivia*/ false); addRelatedInfo(diag, createDiagnosticForNode(parentDeclaration, relatedSuggestionByDeclarationKind[parentDeclaration.kind], targetStr)); } return diag; @@ -791,7 +792,7 @@ export function createGetIsolatedDeclarationErrors(resolver: EmitResolver): (nod const parentDeclaration = findNearestDeclaration(node); let diag: DiagnosticWithLocation; if (parentDeclaration) { - const targetStr = isExportAssignment(parentDeclaration) || !parentDeclaration.name ? "" : getTextOfNode(parentDeclaration.name, /*includeTrivia*/ false); + const targetStr = isExportAssignment(parentDeclaration) || !hasName(parentDeclaration) ? "" : getTextOfNode(parentDeclaration.name, /*includeTrivia*/ false); const parent = findAncestor(node.parent, n => isExportAssignment(n) || (isStatement(n) ? "quit" : !isParenthesizedExpression(n) && !isTypeAssertionExpression(n) && !isAsExpression(n))); if (parentDeclaration === parent) { diff --git a/src/compiler/transformers/es2015.ts b/src/compiler/transformers/es2015.ts index 8d87fa4e255..5e55197fd68 100644 --- a/src/compiler/transformers/es2015.ts +++ b/src/compiler/transformers/es2015.ts @@ -17,6 +17,7 @@ import { BreakOrContinueStatement, Bundle, CallExpression, + canHaveAsteriskToken, CaseBlock, CaseClause, cast, @@ -76,6 +77,7 @@ import { getSourceMapRange, getSuperCallFromStatement, getUseDefineForClassFields, + hasName, hasStaticModifier, hasSyntacticModifier, Identifier, @@ -2527,7 +2529,7 @@ export function transformES2015(context: TransformationContext): (x: SourceFile setTextRange( factory.createFunctionExpression( /*modifiers*/ undefined, - node.asteriskToken, + tryCast(node, canHaveAsteriskToken)?.asteriskToken, name, /*typeParameters*/ undefined, parameters, @@ -3318,7 +3320,7 @@ export function transformES2015(context: TransformationContext): (x: SourceFile if ( (property.transformFlags & TransformFlags.ContainsYield && hierarchyFacts & HierarchyFacts.AsyncFunctionBody) - || (hasComputed = Debug.checkDefined(property.name).kind === SyntaxKind.ComputedPropertyName) + || (hasComputed = cast(property, hasName).name.kind === SyntaxKind.ComputedPropertyName) ) { numInitialProperties = i; break; diff --git a/src/compiler/transformers/esDecorators.ts b/src/compiler/transformers/esDecorators.ts index 7609ab957a0..e1b2b7c9f08 100644 --- a/src/compiler/transformers/esDecorators.ts +++ b/src/compiler/transformers/esDecorators.ts @@ -131,7 +131,6 @@ import { Modifier, ModifierFlags, ModifierLike, - ModifiersArray, moveRangePastDecorators, moveRangePastModifiers, Node, @@ -1238,7 +1237,7 @@ export function transformESDecorators(context: TransformationContext): (x: Sourc >( member: TNode, classInfo: ClassInfo | undefined, - createDescriptor?: (node: TNode & { readonly name: PrivateIdentifier; }, modifiers: ModifiersArray | undefined) => Expression, + createDescriptor?: (node: TNode & { readonly name: PrivateIdentifier; }, modifiers: NodeArray | undefined) => Expression, ) { let referencedName: Expression | undefined; let name: PropertyName | undefined; @@ -2273,7 +2272,7 @@ export function transformESDecorators(context: TransformationContext): (x: Sourc /** * Creates a `value`, `get`, or `set` method for a pseudo-{@link PropertyDescriptor} object created for a private element. */ - function createDescriptorMethod(original: Node, name: PrivateIdentifier, modifiers: ModifiersArray | undefined, asteriskToken: AsteriskToken | undefined, kind: "value" | "get" | "set", parameters: readonly ParameterDeclaration[], body: Block | undefined) { + function createDescriptorMethod(original: Node, name: PrivateIdentifier, modifiers: NodeArray | undefined, asteriskToken: AsteriskToken | undefined, kind: "value" | "get" | "set", parameters: readonly ParameterDeclaration[], body: Block | undefined) { const func = factory.createFunctionExpression( modifiers, asteriskToken, @@ -2300,7 +2299,7 @@ export function transformESDecorators(context: TransformationContext): (x: Sourc /** * Creates a pseudo-{@link PropertyDescriptor} object used when decorating a private {@link MethodDeclaration}. */ - function createMethodDescriptorObject(node: PrivateIdentifierMethodDeclaration, modifiers: ModifiersArray | undefined) { + function createMethodDescriptorObject(node: PrivateIdentifierMethodDeclaration, modifiers: NodeArray | undefined) { return factory.createObjectLiteralExpression([ createDescriptorMethod( node, @@ -2317,7 +2316,7 @@ export function transformESDecorators(context: TransformationContext): (x: Sourc /** * Creates a pseudo-{@link PropertyDescriptor} object used when decorating a private {@link GetAccessorDeclaration}. */ - function createGetAccessorDescriptorObject(node: PrivateIdentifierGetAccessorDeclaration, modifiers: ModifiersArray | undefined) { + function createGetAccessorDescriptorObject(node: PrivateIdentifierGetAccessorDeclaration, modifiers: NodeArray | undefined) { return factory.createObjectLiteralExpression([ createDescriptorMethod( node, @@ -2334,7 +2333,7 @@ export function transformESDecorators(context: TransformationContext): (x: Sourc /** * Creates a pseudo-{@link PropertyDescriptor} object used when decorating a private {@link SetAccessorDeclaration}. */ - function createSetAccessorDescriptorObject(node: PrivateIdentifierSetAccessorDeclaration, modifiers: ModifiersArray | undefined) { + function createSetAccessorDescriptorObject(node: PrivateIdentifierSetAccessorDeclaration, modifiers: NodeArray | undefined) { return factory.createObjectLiteralExpression([ createDescriptorMethod( node, @@ -2351,7 +2350,7 @@ export function transformESDecorators(context: TransformationContext): (x: Sourc /** * Creates a pseudo-{@link PropertyDescriptor} object used when decorating an `accessor` {@link PropertyDeclaration} with a private name. */ - function createAccessorPropertyDescriptorObject(node: PrivateIdentifierPropertyDeclaration, modifiers: ModifiersArray | undefined) { + function createAccessorPropertyDescriptorObject(node: PrivateIdentifierPropertyDeclaration, modifiers: NodeArray | undefined) { // { // get() { return this.${privateName}; }, // set(value) { this.${privateName} = value; }, @@ -2406,7 +2405,7 @@ export function transformESDecorators(context: TransformationContext): (x: Sourc * @param name The name for the resulting declaration. * @param descriptorName The name of the descriptor variable. */ - function createMethodDescriptorForwarder(modifiers: ModifiersArray | undefined, name: PropertyName, descriptorName: Identifier) { + function createMethodDescriptorForwarder(modifiers: NodeArray | undefined, name: PropertyName, descriptorName: Identifier) { // strip off all but the `static` modifier modifiers = visitNodes(modifiers, node => isStaticModifier(node) ? node : undefined, isModifier); return factory.createGetAccessorDeclaration( @@ -2431,7 +2430,7 @@ export function transformESDecorators(context: TransformationContext): (x: Sourc * @param name The name for the resulting declaration. * @param descriptorName The name of the descriptor variable. */ - function createGetAccessorDescriptorForwarder(modifiers: ModifiersArray | undefined, name: PropertyName, descriptorName: Identifier) { + function createGetAccessorDescriptorForwarder(modifiers: NodeArray | undefined, name: PropertyName, descriptorName: Identifier) { // strip off all but the `static` modifier modifiers = visitNodes(modifiers, node => isStaticModifier(node) ? node : undefined, isModifier); return factory.createGetAccessorDeclaration( @@ -2460,7 +2459,7 @@ export function transformESDecorators(context: TransformationContext): (x: Sourc * @param name The name for the resulting declaration. * @param descriptorName The name of the descriptor variable. */ - function createSetAccessorDescriptorForwarder(modifiers: ModifiersArray | undefined, name: PropertyName, descriptorName: Identifier) { + function createSetAccessorDescriptorForwarder(modifiers: NodeArray | undefined, name: PropertyName, descriptorName: Identifier) { // strip off all but the `static` modifier modifiers = visitNodes(modifiers, node => isStaticModifier(node) ? node : undefined, isModifier); return factory.createSetAccessorDeclaration( diff --git a/src/compiler/transformers/generators.ts b/src/compiler/transformers/generators.ts index 4031cb70466..302b8e97e1c 100644 --- a/src/compiler/transformers/generators.ts +++ b/src/compiler/transformers/generators.ts @@ -34,6 +34,7 @@ import { getNonAssignmentOperatorForCompoundAssignment, getOriginalNode, getOriginalNodeId, + hasAsteriskToken, Identifier, idText, IfStatement, @@ -422,7 +423,7 @@ export function transformGenerators(context: TransformationContext): (x: SourceF else if (inGeneratorFunctionBody) { return visitJavaScriptInGeneratorFunctionBody(node); } - else if (isFunctionLikeDeclaration(node) && node.asteriskToken) { + else if (isFunctionLikeDeclaration(node) && hasAsteriskToken(node)) { return visitGenerator(node); } else if (transformFlags & TransformFlags.ContainsGenerator) { diff --git a/src/compiler/transformers/jsx.ts b/src/compiler/transformers/jsx.ts index bcb0cbf8ee2..cd725170807 100644 --- a/src/compiler/transformers/jsx.ts +++ b/src/compiler/transformers/jsx.ts @@ -314,7 +314,7 @@ export function transformJsx(context: TransformationContext): (x: SourceFile | B function visitJsxOpeningLikeElementJSX(node: JsxOpeningLikeElement, children: readonly JsxChild[] | undefined, isChild: boolean, location: TextRange) { const tagName = getTagName(node); const childrenProp = children && children.length ? convertJsxChildrenToChildrenPropAssignment(children) : undefined; - const keyAttr = find(node.attributes.properties, p => !!p.name && isIdentifier(p.name) && p.name.escapedText === "key") as JsxAttribute | undefined; + const keyAttr = find(node.attributes.properties, p => !isJsxSpreadAttribute(p) && isIdentifier(p.name) && p.name.escapedText === "key") as JsxAttribute | undefined; const attrs = keyAttr ? filter(node.attributes.properties, p => p !== keyAttr) : node.attributes.properties; const objectProperties = length(attrs) ? transformJsxAttributesToObjectProps(attrs, childrenProp) : factory.createObjectLiteralExpression(childrenProp ? [childrenProp] : emptyArray); // When there are no attributes, React wants {} diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 091e5410ed4..b258399e5f3 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -1,20 +1,555 @@ +/* eslint-disable @typescript-eslint/adjacent-overload-signatures */ import { - ast, + AstArrayBindingPattern, + AstArrayBindingPatternData, + AstArrayLiteralExpression, + AstArrayLiteralExpressionData, + AstArrayTypeNode, + AstArrayTypeNodeData, + AstArrowFunction, + AstArrowFunctionData, + AstAsExpression, + AstAsExpressionData, + AstAwaitExpression, + AstAwaitExpressionData, + AstBaseJSDocTag, + AstBigIntLiteral, + AstBigIntLiteralData, + AstBinaryExpression, + AstBinaryExpressionData, + AstBindingElement, + AstBindingElementData, + AstBlock, + AstBlockData, + AstBreakStatement, + AstBreakStatementData, + AstBundle, + AstBundleData, + AstCallChain, + AstCallExpression, + AstCallExpressionData, + AstCallSignatureDeclaration, + AstCallSignatureDeclarationData, + AstCaseBlock, + AstCaseBlockData, + AstCaseClause, + AstCaseClauseData, + AstCatchClause, + AstCatchClauseData, + AstClassDeclaration, + AstClassDeclarationData, + AstClassElement, + AstClassExpression, + AstClassExpressionData, + AstClassStaticBlockDeclaration, + AstClassStaticBlockDeclarationData, + AstCommaListExpression, + AstCommaListExpressionData, + AstComputedPropertyName, + AstComputedPropertyNameData, + AstConditionalExpression, + AstConditionalExpressionData, + AstConditionalTypeNode, + AstConditionalTypeNodeData, + AstConstructorDeclaration, + AstConstructorDeclarationData, + AstConstructorTypeNode, + AstConstructorTypeNodeData, + AstConstructSignatureDeclaration, + AstConstructSignatureDeclarationData, + AstContinueStatement, + AstContinueStatementData, + AstData, + AstDebuggerStatement, + AstDebuggerStatementData, + AstDeclaration, + AstDeclarationData, + AstDecorator, + AstDecoratorData, + AstDefaultClause, + AstDefaultClauseData, + AstDeleteExpression, + AstDeleteExpressionData, + AstDoStatement, + AstDoStatementData, + AstElementAccessChain, + AstElementAccessExpression, + AstElementAccessExpressionData, + AstEmptyStatement, + AstEmptyStatementData, + AstEndOfFileToken, + AstEndOfFileTokenData, + AstEnumDeclaration, + AstEnumDeclarationData, + AstEnumMember, + AstEnumMemberData, + AstExportAssignment, + AstExportAssignmentData, + AstExportDeclaration, + AstExportDeclarationData, + AstExportSpecifier, + AstExportSpecifierData, + AstExpression, + AstExpressionStatement, + AstExpressionStatementData, + AstExpressionWithTypeArguments, + AstExpressionWithTypeArgumentsData, + AstExternalModuleReference, + AstExternalModuleReferenceData, + AstFalseLiteral, + AstForInStatement, + AstForInStatementData, + AstForOfStatement, + AstForOfStatementData, + AstForStatement, + AstForStatementData, + AstFunctionDeclaration, + AstFunctionDeclarationData, + AstFunctionExpression, + AstFunctionExpressionData, + AstFunctionTypeNode, + AstFunctionTypeNodeData, + AstGetAccessorDeclaration, + AstGetAccessorDeclarationData, + AstHeritageClause, + AstHeritageClauseData, + AstIdentifier, + AstIdentifierData, + AstIfStatement, + AstIfStatementData, + AstImportAttribute, + AstImportAttributeData, + AstImportAttributes, + AstImportAttributesData, + AstImportClause, + AstImportClauseData, + AstImportDeclaration, + AstImportDeclarationData, + AstImportEqualsDeclaration, + AstImportEqualsDeclarationData, + AstImportExpression, + AstImportSpecifier, + AstImportSpecifierData, + AstImportTypeAssertionContainer, + AstImportTypeAssertionContainerData, + AstImportTypeNode, + AstImportTypeNodeData, + AstIndexedAccessTypeNode, + AstIndexedAccessTypeNodeData, + AstIndexSignatureDeclaration, + AstIndexSignatureDeclarationData, + AstInferTypeNode, + AstInferTypeNodeData, + AstInterfaceDeclaration, + AstInterfaceDeclarationData, + AstIntersectionTypeNode, + AstIntersectionTypeNodeData, + AstJSDoc, + AstJSDocAllType, + AstJSDocAllTypeData, + AstJSDocAugmentsTag, + AstJSDocAugmentsTagData, + AstJSDocAuthorTag, + AstJSDocAuthorTagData, + AstJSDocCallbackTag, + AstJSDocCallbackTagData, + AstJSDocClassReference, + AstJSDocClassReferenceData, + AstJSDocClassTag, + AstJSDocClassTagData, + AstJSDocData, + AstJSDocDeprecatedTag, + AstJSDocDeprecatedTagData, + AstJSDocEnumTag, + AstJSDocEnumTagData, + AstJSDocFunctionType, + AstJSDocFunctionTypeData, + AstJSDocImplementsTag, + AstJSDocImplementsTagData, + AstJSDocImportTag, + AstJSDocImportTagData, + AstJSDocLink, + AstJSDocLinkCode, + AstJSDocLinkCodeData, + AstJSDocLinkData, + AstJSDocLinkPlain, + AstJSDocLinkPlainData, + AstJSDocMemberName, + AstJSDocMemberNameData, + AstJSDocNamepathType, + AstJSDocNamepathTypeData, + AstJSDocNameReference, + AstJSDocNameReferenceData, + AstJSDocNamespaceDeclaration, + AstJSDocNamespaceDeclarationData, + AstJSDocNonNullableType, + AstJSDocNonNullableTypeData, + AstJSDocNullableType, + AstJSDocNullableTypeData, + AstJSDocOptionalType, + AstJSDocOptionalTypeData, + AstJSDocOverloadTag, + AstJSDocOverloadTagData, + AstJSDocOverrideTag, + AstJSDocOverrideTagData, + AstJSDocParameterTag, + AstJSDocParameterTagData, + AstJSDocPrivateTag, + AstJSDocPrivateTagData, + AstJSDocPropertyLikeTag, + AstJSDocPropertyTag, + AstJSDocPropertyTagData, + AstJSDocProtectedTag, + AstJSDocProtectedTagData, + AstJSDocPublicTag, + AstJSDocPublicTagData, + AstJSDocReadonlyTag, + AstJSDocReadonlyTagData, + AstJSDocReturnTag, + AstJSDocReturnTagData, + AstJSDocSatisfiesTag, + AstJSDocSatisfiesTagData, + AstJSDocSeeTag, + AstJSDocSeeTagData, + AstJSDocSignature, + AstJSDocSignatureData, + AstJSDocTagData, + AstJSDocTemplateTag, + AstJSDocTemplateTagData, + AstJSDocText, + AstJSDocTextData, + AstJSDocThisTag, + AstJSDocThisTagData, + AstJSDocThrowsTag, + AstJSDocThrowsTagData, + AstJSDocTypedefTag, + AstJSDocTypedefTagData, + AstJSDocTypeExpression, + AstJSDocTypeExpressionData, + AstJSDocTypeLiteral, + AstJSDocTypeLiteralData, + AstJSDocTypeTag, + AstJSDocTypeTagData, + AstJSDocUnknownTag, + AstJSDocUnknownTagData, + AstJSDocUnknownType, + AstJSDocUnknownTypeData, + AstJSDocVariadicType, + AstJSDocVariadicTypeData, + AstJsonMinusNumericLiteral, + AstJsonMinusNumericLiteralData, + AstJsonObjectExpressionStatement, + AstJsonObjectExpressionStatementData, + AstJsonSourceFile, + AstJsonSourceFileData, + AstJsxAttribute, + AstJsxAttributeData, + AstJsxAttributes, + AstJsxAttributesData, + AstJsxClosingElement, + AstJsxClosingElementData, + AstJsxClosingFragment, + AstJsxClosingFragmentData, + AstJsxElement, + AstJsxElementData, + AstJsxExpression, + AstJsxExpressionData, + AstJsxFragment, + AstJsxFragmentData, + AstJsxNamespacedName, + AstJsxNamespacedNameData, + AstJsxOpeningElement, + AstJsxOpeningElementData, + AstJsxOpeningFragment, + AstJsxOpeningFragmentData, + AstJsxSelfClosingElement, + AstJsxSelfClosingElementData, + AstJsxSpreadAttribute, + AstJsxSpreadAttributeData, + AstJsxTagNamePropertyAccess, + AstJsxTagNamePropertyAccessData, + AstJsxText, + AstJsxTextData, + AstKeywordExpression, + AstKeywordTypeNode, + AstLabeledStatement, + AstLabeledStatementData, + AstLeftHandSideExpression, + AstLiteralExpression, + AstLiteralExpressionData, + AstLiteralLikeNode, + AstLiteralLikeNodeData, + AstLiteralTypeNode, + AstLiteralTypeNodeData, + AstMappedTypeNode, + AstMappedTypeNodeData, + AstMemberExpression, + AstMetaProperty, + AstMetaPropertyData, + AstMethodDeclaration, + AstMethodDeclarationData, + AstMethodSignature, + AstMethodSignatureData, + AstMissingDeclaration, + AstMissingDeclarationData, + AstModuleBlock, + AstModuleBlockData, + AstModuleDeclaration, + AstModuleDeclarationData, + AstNamedExports, + AstNamedExportsData, + AstNamedImports, + AstNamedImportsData, + AstNamedTupleMember, + AstNamedTupleMemberData, + AstNamespaceDeclaration, + AstNamespaceDeclarationData, + AstNamespaceExport, + AstNamespaceExportData, + AstNamespaceExportDeclaration, + AstNamespaceExportDeclarationData, + AstNamespaceImport, + AstNamespaceImportData, + AstNewExpression, + AstNewExpressionData, + AstNode, + AstNodeArray, + AstNonNullChain, + AstNonNullExpression, + AstNonNullExpressionData, + AstNoSubstitutionTemplateLiteral, + AstNoSubstitutionTemplateLiteralData, + AstNotEmittedStatement, + AstNotEmittedStatementData, + AstNotEmittedTypeElement, + AstNotEmittedTypeElementData, + AstNullLiteral, + AstNumericLiteral, + AstNumericLiteralData, + AstObjectBindingPattern, + AstObjectBindingPatternData, + AstObjectLiteralElement, + AstObjectLiteralExpression, + AstObjectLiteralExpressionData, + AstOmittedExpression, + AstOmittedExpressionData, + AstOptionalTypeNode, + AstOptionalTypeNodeData, + AstParameterDeclaration, + AstParameterDeclarationData, + AstParenthesizedExpression, + AstParenthesizedExpressionData, + AstParenthesizedTypeNode, + AstParenthesizedTypeNodeData, + AstPartiallyEmittedExpression, + AstPartiallyEmittedExpressionData, + AstPostfixUnaryExpression, + AstPostfixUnaryExpressionData, + AstPrefixUnaryExpression, + AstPrefixUnaryExpressionData, + AstPrimaryExpression, + AstPrivateIdentifier, + AstPrivateIdentifierData, + AstPropertyAccessChain, + AstPropertyAccessExpression, + AstPropertyAccessExpressionData, + AstPropertyAssignment, + AstPropertyAssignmentData, + AstPropertyDeclaration, + AstPropertyDeclarationData, + AstPropertySignature, + AstPropertySignatureData, + AstQualifiedName, + AstQualifiedNameData, + AstRegularExpressionLiteral, + AstRegularExpressionLiteralData, + AstRestTypeNode, + AstRestTypeNodeData, + AstReturnStatement, + AstReturnStatementData, + AstSatisfiesExpression, + AstSatisfiesExpressionData, + AstSemicolonClassElement, + AstSemicolonClassElementData, + AstSetAccessorDeclaration, + AstSetAccessorDeclarationData, + AstShorthandPropertyAssignment, + AstShorthandPropertyAssignmentData, + AstSourceFile, + AstSourceFileData, + AstSpreadAssignment, + AstSpreadAssignmentData, + AstSpreadElement, + AstSpreadElementData, + AstStatement, + AstStringLiteral, + AstStringLiteralData, + AstStringLiteralLikeNode, + AstStringLiteralLikeNodeData, + AstSuperExpression, + AstSuperExpressionData, + AstSwitchStatement, + AstSwitchStatementData, + AstSyntaxListData, + AstSyntheticExpression, + AstSyntheticExpressionData, + AstSyntheticReferenceExpression, + AstSyntheticReferenceExpressionData, + AstTaggedTemplateExpression, + AstTaggedTemplateExpressionData, + AstTemplateExpression, + AstTemplateExpressionData, + AstTemplateHead, + AstTemplateHeadData, + AstTemplateLiteralLikeNode, + AstTemplateLiteralLikeNodeData, + AstTemplateLiteralTypeNode, + AstTemplateLiteralTypeNodeData, + AstTemplateLiteralTypeSpan, + AstTemplateLiteralTypeSpanData, + AstTemplateMiddle, + AstTemplateMiddleData, + AstTemplateSpan, + AstTemplateSpanData, + AstTemplateTail, + AstTemplateTailData, + AstThisExpression, + AstThisExpressionData, + AstThisTypeNode, + AstThisTypeNodeData, + AstThrowStatement, + AstThrowStatementData, + AstTokenData, + AstTrueLiteral, + AstTryStatement, + AstTryStatementData, + AstTupleTypeNode, + AstTupleTypeNodeData, + AstTypeAliasDeclaration, + AstTypeAliasDeclarationData, + AstTypeAssertion, + AstTypeAssertionData, + AstTypeElement, + AstTypeLiteralNode, + AstTypeLiteralNodeData, + AstTypeNode, + AstTypeOfExpression, + AstTypeOfExpressionData, + AstTypeOperatorNode, + AstTypeOperatorNodeData, + AstTypeParameterDeclaration, + AstTypeParameterDeclarationData, + AstTypePredicateNode, + AstTypePredicateNodeData, + AstTypeQueryNode, + AstTypeQueryNodeData, + AstTypeReferenceNode, + AstTypeReferenceNodeData, + AstUnaryExpression, + AstUnionTypeNode, + AstUnionTypeNodeData, + AstUpdateExpression, + AstVariableDeclaration, + AstVariableDeclarationData, + AstVariableDeclarationList, + AstVariableDeclarationListData, + AstVariableStatement, + AstVariableStatementData, + AstVoidExpression, + AstVoidExpressionData, + AstWhileStatement, + AstWhileStatementData, + AstWithStatement, + AstWithStatementData, + AstYieldExpression, + AstYieldExpressionData, + AstNodeFactory, + computePositionOfLineAndCharacter, + createChildren, + createMultiMap, CreateSourceFileOptions, + Debug, EmitHelperFactory, + emptyArray, + find, + forEach, + forEachChild, + getAssignmentDeclarationKind, GetCanonicalFileName, + getEffectiveModifierFlagsNoCache, + getEmitFlags, + getLineAndCharacterOfPosition, + getLineStarts, + getNodeChildren, + getNonAssignedNameOfDeclaration, + getParseTreeNode, + getSourceFileOfNode, + getSourceTextOfNodeFromSourceFile, + getTextOfIdentifierOrLiteral, + getTokenPosOfNode, + hasProperty, + hasSyntacticModifier, + idText, + isArrayTypeNode, + isBigIntLiteral, + isBindingPattern, + isCallSignatureDeclaration, + isComputedPropertyName, + isConditionalTypeNode, + isConstructorDeclaration, + isConstructorTypeNode, + isConstructSignatureDeclaration, + isFunctionTypeNode, + isGeneratedIdentifier, + isGetAccessorDeclaration, + isIdentifier, + isImportTypeNode, + isIndexedAccessTypeNode, + isIndexSignatureDeclaration, + isInferTypeNode, + isIntersectionTypeNode, + isLiteralTypeNode, + isMappedTypeNode, + isNamedExports, + isNamedTupleMember, + isNumericLiteral, + isOptionalTypeNode, + isParameter, + isParenthesizedTypeNode, + isParseTreeNode, + isPrivateIdentifier, + isPropertyAccessExpression, + isPropertyName, + isRestTypeNode, + isSetAccessorDeclaration, + isStringLiteral, + isStringOrNumericLiteralLike, + isThisTypeNode, + isTupleTypeNode, + isTypeLiteralNode, + isTypeOperatorNode, + isTypeParameterDeclaration, + isTypePredicateNode, + isTypeQueryNode, + isTypeReferenceNode, + isUnionTypeNode, + lastOrUndefined, MapLike, ModeAwareCache, ModeAwareCacheKey, ModuleResolutionCache, MultiMap, NodeFactoryFlags, + nodeIsSynthesized, OptionsNameMap, PackageJsonInfo, PackageJsonInfoCache, Pattern, + positionIsSynthesized, + setNodeChildren, SymlinkCache, ThisContainer, + updateSourceFile, } from "./_namespaces/ts.js"; // branded string type used to store absolute, normalized and canonicalized paths @@ -693,7 +1228,6 @@ export type KeywordTypeSyntaxKind = | SyntaxKind.UnknownKeyword | SyntaxKind.VoidKeyword; -/** @internal */ export type TypeNodeSyntaxKind = | KeywordTypeSyntaxKind | SyntaxKind.TypePredicate @@ -936,24 +1470,240 @@ export const enum PredicateSemantics { /** @internal */ export type NodeId = number; -export interface Node extends ReadonlyTextRange { - readonly kind: SyntaxKind; - readonly flags: NodeFlags; - /** @internal */ modifierFlagsCache: ModifierFlags; - /** @internal */ readonly transformFlags: TransformFlags; // Flags for transforms - /** @internal */ id?: NodeId | undefined; // Unique id (used to look up NodeLinks) - readonly parent: Node; // Parent node (initialized by binding) - /** @internal */ original?: Node | undefined; // The original node if this is an updated node. - /** @internal */ emitNode?: EmitNode | undefined; // Associated EmitNode (initialized by transforms) - // NOTE: `symbol` and `localSymbol` have been moved to `Declaration` - // `locals` and `nextContainer` have been moved to `LocalsContainer` - // `flowNode` has been moved to `FlowContainer` - // see: https://github.com/microsoft/TypeScript/pull/51682 +export type NodeConstructor = new (ast: AstNode>) => N; // TODO: don't use indexed access type + +// dprint-ignore +export class Node< + K extends SyntaxKind = SyntaxKind, + T extends AstData = AstData +> implements ReadonlyTextRange { + readonly ast: AstNode> = undefined!; + + constructor(ast: AstNode>) { + this.ast = ast; + Object.preventExtensions(this); + } + + get kind(): K { return this.ast.kind; } + get data(): T { return this.ast.data; } + get pos(): number { return this.ast.pos; } + get end(): number { return this.ast.end; } + get flags(): NodeFlags { return this.ast.flags; } + get parent(): Node { return this.ast.parent?.node!; } + + /** @internal */ set pos(value) { this.ast.pos = value; } + /** @internal */ set end(value) { this.ast.end = value; } + /** @internal */ set flags(value) { this.ast.flags = value; } + /** @internal */ set parent(value) { this.ast.parent = value?.ast; } + /** @internal */ get modifierFlagsCache(): ModifierFlags { return this.ast.modifierFlagsCache; } + /** @internal */ set modifierFlagsCache(value) { this.ast.modifierFlagsCache = value; } + /** @internal */ get transformFlags(): TransformFlags { return this.ast.transformFlags; } + /** @internal */ set transformFlags(value) { this.ast.transformFlags = value; } + /** @internal */ get id(): number { return this.ast.id; } + /** @internal */ set id(value) { this.ast.id = value; } + /** @internal */ get original(): Node | undefined { return this.ast.original?.node; } + /** @internal */ set original(value) { this.ast.original = value?.ast; } + /** @internal */ get emitNode(): EmitNode | undefined { return this.ast.emitNode; } + /** @internal */ set emitNode(value) { this.ast.emitNode = value; } + /** @internal */ get __pos(): number | undefined { return this.ast.__pos; } // eslint-disable-line @typescript-eslint/naming-convention + /** @internal */ set __pos(value) { this.ast.__pos = value; } // eslint-disable-line @typescript-eslint/naming-convention + /** @internal */ get __end(): number | undefined { return this.ast.__end; } // eslint-disable-line @typescript-eslint/naming-convention + /** @internal */ set __end(value) { this.ast.__end = value; } // eslint-disable-line @typescript-eslint/naming-convention + + /** @internal @private */ _assertHasRealPosition(message?: string): void { + // eslint-disable-next-line local/debug-assert + Debug.assert(!positionIsSynthesized(this.pos) && !positionIsSynthesized(this.end), message || "Node must have a real position for this operation"); + } + + getSourceFile(): SourceFile { + return getSourceFileOfNode(this); + } + + getStart(sourceFile?: SourceFileLike, includeJsDocComment?: boolean): number { + this._assertHasRealPosition(); + return getTokenPosOfNode(this, sourceFile, includeJsDocComment); + } + + getFullStart(): number { + this._assertHasRealPosition(); + return this.pos; + } + + getEnd(): number { + this._assertHasRealPosition(); + return this.end; + } + + getWidth(sourceFile?: SourceFileLike): number { + this._assertHasRealPosition(); + return this.getEnd() - this.getStart(sourceFile); + } + + getFullWidth(): number { + this._assertHasRealPosition(); + return this.end - this.pos; + } + + getLeadingTriviaWidth(sourceFile?: SourceFileLike): number { + this._assertHasRealPosition(); + return this.getStart(sourceFile) - this.pos; + } + + getFullText(sourceFile?: SourceFileLike): string { + this._assertHasRealPosition(); + sourceFile ??= this.getSourceFile(); + return sourceFile.text.substring(this.pos, this.end); + } + + getText(sourceFile?: SourceFileLike): string { + this._assertHasRealPosition(); + sourceFile ??= this.getSourceFile(); + return sourceFile.text.substring(this.getStart(sourceFile), this.getEnd()); + } + + getChildCount(sourceFile?: SourceFileLike): number { + return this.getChildren(sourceFile).length; + } + + getChildAt(index: number, sourceFile?: SourceFileLike): Node { + return this.getChildren(sourceFile)[index]; + } + + getChildren(sourceFile?: SourceFileLike): readonly Node[] { + this._assertHasRealPosition("Node without a real position cannot be scanned and thus has no token nodes - use forEachChild and collect the result if that's fine"); + sourceFile ??= this.getSourceFile(); + return getNodeChildren(this, sourceFile) ?? setNodeChildren(this, sourceFile, createChildren(this, sourceFile)); + } + + getFirstToken(sourceFile?: SourceFileLike): Node | undefined { + this._assertHasRealPosition(); + sourceFile ??= this.getSourceFile(); + const children = this.getChildren(sourceFile); + if (!children.length) { + return undefined; + } + + const child = find(children, kid => kid.kind < SyntaxKind.FirstJSDocNode || kid.kind > SyntaxKind.LastJSDocNode); + return !child || child.kind < SyntaxKind.FirstNode ? + child : + child.getFirstToken(sourceFile); + } + + getLastToken(sourceFile?: SourceFileLike): Node | undefined { + this._assertHasRealPosition(); + const children = this.getChildren(sourceFile); + const child = lastOrUndefined(children); + if (!child) { + return undefined; + } + + return child.kind < SyntaxKind.FirstNode ? child : child.getLastToken(sourceFile); + } + + forEachChild(cbNode: (node: Node) => T | undefined, cbNodeArray?: (nodes: NodeArray) => T | undefined): T | undefined { + return forEachChild(this, cbNode, cbNodeArray); + } } +Debug.registerDebugInfo(() => { + if (!hasProperty(Node.prototype, "__debugKind")) { + const weakNodeTextMap = new WeakMap(); + + Object.defineProperties(Node.prototype, { + // for use with vscode-js-debug's new customDescriptionGenerator in launch.json + __tsDebuggerDisplay: { + value(this: Node) { // TODO(rbuckton): This is probably no longer needed now that every node has a unique class + const nodeHeader = isGeneratedIdentifier(this) ? "GeneratedIdentifier" : + isIdentifier(this) ? `Identifier '${idText(this)}'` : + isPrivateIdentifier(this) ? `PrivateIdentifier '${idText(this)}'` : + isStringLiteral(this) ? `StringLiteral ${JSON.stringify(this.text.length < 10 ? this.text : this.text.slice(10) + "...")}` : + isNumericLiteral(this) ? `NumericLiteral ${this.text}` : + isBigIntLiteral(this) ? `BigIntLiteral ${this.text}n` : + isTypeParameterDeclaration(this) ? "TypeParameterDeclaration" : + isParameter(this) ? "ParameterDeclaration" : + isConstructorDeclaration(this) ? "ConstructorDeclaration" : + isGetAccessorDeclaration(this) ? "GetAccessorDeclaration" : + isSetAccessorDeclaration(this) ? "SetAccessorDeclaration" : + isCallSignatureDeclaration(this) ? "CallSignatureDeclaration" : + isConstructSignatureDeclaration(this) ? "ConstructSignatureDeclaration" : + isIndexSignatureDeclaration(this) ? "IndexSignatureDeclaration" : + isTypePredicateNode(this) ? "TypePredicateNode" : + isTypeReferenceNode(this) ? "TypeReferenceNode" : + isFunctionTypeNode(this) ? "FunctionTypeNode" : + isConstructorTypeNode(this) ? "ConstructorTypeNode" : + isTypeQueryNode(this) ? "TypeQueryNode" : + isTypeLiteralNode(this) ? "TypeLiteralNode" : + isArrayTypeNode(this) ? "ArrayTypeNode" : + isTupleTypeNode(this) ? "TupleTypeNode" : + isOptionalTypeNode(this) ? "OptionalTypeNode" : + isRestTypeNode(this) ? "RestTypeNode" : + isUnionTypeNode(this) ? "UnionTypeNode" : + isIntersectionTypeNode(this) ? "IntersectionTypeNode" : + isConditionalTypeNode(this) ? "ConditionalTypeNode" : + isInferTypeNode(this) ? "InferTypeNode" : + isParenthesizedTypeNode(this) ? "ParenthesizedTypeNode" : + isThisTypeNode(this) ? "ThisTypeNode" : + isTypeOperatorNode(this) ? "TypeOperatorNode" : + isIndexedAccessTypeNode(this) ? "IndexedAccessTypeNode" : + isMappedTypeNode(this) ? "MappedTypeNode" : + isLiteralTypeNode(this) ? "LiteralTypeNode" : + isNamedTupleMember(this) ? "NamedTupleMember" : + isImportTypeNode(this) ? "ImportTypeNode" : + Debug.formatSyntaxKind(this.kind); + return `${nodeHeader}${this.flags ? ` (${Debug.formatNodeFlags(this.flags)})` : ""}`; + }, + }, + __debugKind: { + get(this: Node) { + return Debug.formatSyntaxKind(this.kind); + }, + }, + __debugNodeFlags: { + get(this: Node) { + return Debug.formatNodeFlags(this.flags); + }, + }, + __debugModifierFlags: { + get(this: Node) { + return Debug.formatModifierFlags(getEffectiveModifierFlagsNoCache(this)); + }, + }, + __debugTransformFlags: { + get(this: Node) { + return Debug.formatTransformFlags(this.transformFlags); + }, + }, + __debugIsParseTreeNode: { + get(this: Node) { + return isParseTreeNode(this); + }, + }, + __debugEmitFlags: { + get(this: Node) { + return Debug.formatEmitFlags(getEmitFlags(this)); + }, + }, + __debugGetText: { + value(this: Node, includeTrivia?: boolean) { + if (nodeIsSynthesized(this)) return ""; + // avoid recomputing + let text = weakNodeTextMap.get(this); + if (text === undefined) { + const parseNode = getParseTreeNode(this); + const sourceFile = parseNode && getSourceFileOfNode(parseNode); + text = sourceFile ? getSourceTextOfNodeFromSourceFile(sourceFile, parseNode, includeTrivia) : ""; + weakNodeTextMap.set(this, text); + } + return text; + }, + }, + }); + } +}); + export interface JSDocContainer extends Node { _jsdocContainerBrand: any; - /** @internal */ jsDoc?: JSDocArray | undefined; // JSDoc that directly precedes this node + /** @internal */ jsDoc: JSDocArray | undefined; } /** @internal */ @@ -963,13 +1713,13 @@ export interface JSDocArray extends Array { export interface LocalsContainer extends Node { _localsContainerBrand: any; - /** @internal */ locals?: SymbolTable | undefined; // Locals associated with node (initialized by binding) - /** @internal */ nextContainer?: HasLocals | undefined; // Next container in declaration order (initialized by binding) + /** @internal */ locals: SymbolTable | undefined; // Locals associated with node (initialized by binding) + /** @internal */ nextContainer: HasLocals | undefined; // Next container in declaration order (initialized by binding) } export interface FlowContainer extends Node { _flowContainerBrand: any; - /** @internal */ flowNode?: FlowNode | undefined; // Associated FlowNode (initialized by binding) + /** @internal */ flowNode: FlowNode | undefined; // Associated FlowNode (initialized by binding) } /** @internal */ @@ -1106,7 +1856,7 @@ export type HasChildren = | CallExpression | NewExpression | TaggedTemplateExpression - | TypeAssertion + | TypeAssertionExpression | ParenthesizedExpression | FunctionExpression | ArrowFunction @@ -1583,18 +2333,88 @@ export interface MutableNodeArray extends Array, TextRange { /** @internal */ transformFlags: TransformFlags; // Flags for transforms, possibly undefined } -export interface NodeArray extends ReadonlyArray, ReadonlyTextRange { - readonly hasTrailingComma: boolean; - /** @internal */ transformFlags: TransformFlags; // Flags for transforms, possibly undefined +const ReadonlyArray = Array as new (...items: readonly T[]) => readonly T[]; + +// dprint-ignore +export class NodeArray extends ReadonlyArray { + readonly ast: AstNodeArray = undefined!; + + constructor(ast: AstNodeArray) { + super(...ast.items.map(item => item.node as N)); + this.ast = ast; + Object.preventExtensions(this); + } + + static get [globalThis.Symbol.species](): ArrayConstructor { return Array; } + + get pos(): number { return this.ast.pos; } + get end(): number { return this.ast.end; } + get hasTrailingComma(): boolean { return this.ast.hasTrailingComma; } + + /** @internal */ set pos(value) { this.ast.pos = value; } + /** @internal */ set end(value) { this.ast.end = value; } + /** @internal */ set hasTrailingComma(value) { this.ast.hasTrailingComma = value; } + /** @internal */ get transformFlags(): TransformFlags { return this.ast.transformFlags; } + /** @internal */ set transformFlags(value) { this.ast.transformFlags = value; } + /** @internal */ get __pos(): number | undefined { return this.ast.__pos; } // eslint-disable-line @typescript-eslint/naming-convention + /** @internal */ set __pos(value) { this.ast.__pos = value; } // eslint-disable-line @typescript-eslint/naming-convention + /** @internal */ get __end(): number | undefined { return this.ast.__end; } // eslint-disable-line @typescript-eslint/naming-convention + /** @internal */ set __end(value) { this.ast.__end = value; } // eslint-disable-line @typescript-eslint/naming-convention } -// TODO(rbuckton): Constraint 'TKind' to 'TokenSyntaxKind' -export interface Token extends Node { - readonly kind: TKind; +Debug.registerDebugInfo(() => { + if (!("__tsDebuggerDisplay" in NodeArray.prototype)) { // eslint-disable-line local/no-in-operator + Object.defineProperties(NodeArray.prototype, { + __tsDebuggerDisplay: { + value(this: NodeArray, defaultValue: string) { + // An `Array` with extra properties is rendered as `[A, B, prop1: 1, prop2: 2]`. Most of + // these aren't immediately useful so we trim off the `prop1: ..., prop2: ...` part from the + // formatted string. + // This regex can trigger slow backtracking because of overlapping potential captures. + // We don't care, this is debug code that's only enabled with a debugger attached - + // we're just taking note of it for anyone checking regex performance in the future. + defaultValue = String(defaultValue).replace(/(?:,[\s\w]+:[^,]+)+\]$/, "]"); + return `NodeArray ${defaultValue}`; + }, + }, + }); + } +}); + +// dprint-ignore +export class Token extends Node { + override getChildCount(_sourceFile?: SourceFileLike): number { + return this.getChildren().length; + } + + override getChildAt(index: number, _sourceFile?: SourceFileLike): Node { + return this.getChildren()[index]; + } + + override getChildren(_sourceFile?: SourceFileLike): readonly Node[] { + return this.kind === SyntaxKind.EndOfFileToken ? (this as Node as EndOfFileToken).jsDoc ?? emptyArray : emptyArray; + } + + override getFirstToken(_sourceFile?: SourceFileLike): Node | undefined { + return undefined; + } + + override getLastToken(_sourceFile?: SourceFileLike): Node | undefined { + return undefined; + } + + override forEachChild(_cbNode: (node: Node) => T | undefined, _cbNodeArray?: (nodes: NodeArray) => T | undefined): T | undefined { + return undefined; + } } -export interface EndOfFileToken extends Token, JSDocContainer { - readonly kind: SyntaxKind.EndOfFileToken; +// dprint-ignore +export class EndOfFileToken extends Token implements JSDocContainer { + declare _jsdocContainerBrand: any; + declare readonly ast: AstEndOfFileToken; + + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } } // Punctuation @@ -1680,6 +2500,11 @@ export type ClassMemberModifier = export type ModifiersArray = NodeArray; +export interface KeywordExpression extends PrimaryExpression, KeywordToken { + readonly ast: AstKeywordExpression; + readonly kind: TKind; +} + // dprint-ignore export const enum GeneratedIdentifierFlags { // Kinds @@ -1697,18 +2522,37 @@ export const enum GeneratedIdentifierFlags { AllowNameSubstitution = 1 << 6, // Used by `module.ts` to indicate generated nodes which can have substitutions performed upon them (as they were generated by an earlier transform phase) } -export interface Identifier extends PrimaryExpression, Declaration, JSDocContainer, FlowContainer { - readonly kind: SyntaxKind.Identifier; +// dprint-ignore +export class Identifier extends Token implements PrimaryExpression, Declaration, JSDocContainer, FlowContainer { + declare _primaryExpressionBrand: any; + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstIdentifier; + /** - * Prefer to use `id.unescapedText`. (Note: This is available only in services, not internally to the TypeScript compiler.) + * Prefer to use {@link text}. * Text of identifier, but if the identifier begins with two underscores, this will begin with three. */ - readonly escapedText: __String; -} + get escapedText(): __String { return this.ast.data.escapedText; } + get text(): string { return idText(this); } -// Transient identifier node (marked by id === -1) -export interface TransientIdentifier extends Identifier { - resolvedSymbol: Symbol; + /** @internal */ set escapedText(value: __String) { this.ast.data.escapedText = value; } + /** @internal */ get resolvedSymbol(): Symbol { return this.ast.data.resolvedSymbol; } + /** @internal */ set resolvedSymbol(value: Symbol) { this.ast.data.resolvedSymbol = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value) { this.ast.data.flowNode = value; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value) { this.ast.data.jsDoc = value; } } // dprint-ignore @@ -1725,10 +2569,18 @@ export interface GeneratedIdentifier extends Identifier { readonly emitNode: EmitNode & { autoGenerate: AutoGenerateInfo; }; } -export interface QualifiedName extends Node, FlowContainer { - readonly kind: SyntaxKind.QualifiedName; - readonly left: EntityName; - readonly right: Identifier; +// dprint-ignore +export class QualifiedName extends Node implements FlowContainer { + declare _flowContainerBrand: any; + declare readonly ast: AstQualifiedName; + + get left(): EntityName { return this.ast.data.left?.node; } + get right(): Identifier { return this.ast.data.right?.node; } + + /** @internal */ set left(value: EntityName) { this.ast.data.left = value?.ast; } + /** @internal */ set right(value: Identifier) { this.ast.data.right = value?.ast; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value) { this.ast.data.flowNode = value; } } export type EntityName = Identifier | QualifiedName; @@ -1754,14 +2606,64 @@ export type DeclarationName = export interface Declaration extends Node { _declarationBrand: any; + readonly ast: AstDeclaration; /** @internal */ symbol: Symbol; // Symbol declared by node (initialized by binding) - /** @internal */ localSymbol?: Symbol | undefined; // Local symbol declared by node (initialized by binding only for exported nodes) + /** @internal */ localSymbol: Symbol | undefined; // Local symbol declared by node (initialized by binding only for exported nodes) } export interface NamedDeclaration extends Declaration { readonly name?: DeclarationName | undefined; } +// NOTE: Changing the following list requires changes to: +// - `canHaveName` in utilitiesPublic.ts +/** @internal */ +export type HasName = + | FunctionDeclaration + | FunctionExpression + | ClassExpression + | ClassDeclaration + | MethodDeclaration + | GetAccessorDeclaration + | SetAccessorDeclaration + | PropertyDeclaration + | InterfaceDeclaration + | MethodSignature + | PropertySignature + | TypeAliasDeclaration + | EnumDeclaration + | EnumMember + | ModuleDeclaration + | VariableDeclaration + | ParameterDeclaration + | BindingElement + | TypeParameterDeclaration + | ImportEqualsDeclaration + | NamespaceExportDeclaration + | ImportClause + | NamespaceImport + | NamespaceExport + | ImportSpecifier + | ExportSpecifier + | JSDocTypedefTag + | JSDocCallbackTag + | PropertyAssignment + | ShorthandPropertyAssignment + | NamedTupleMember + | PropertyAccessExpression + | MetaProperty + | ImportAttribute + | JsxAttribute + | JsxNamespacedName + | JSDocNameReference + | JSDocLink + | JSDocLinkCode + | JSDocLinkPlain + | JSDocParameterTag + | JSDocSeeTag + | JSDocPropertyTag + | MissingDeclaration; + /** @internal */ export interface DynamicNamedDeclaration extends NamedDeclaration { readonly name: ComputedPropertyName; @@ -1789,21 +2691,37 @@ export interface LateBoundElementAccessExpression extends ElementAccessExpressio } export interface DeclarationStatement extends NamedDeclaration, Statement { + readonly ast: AstNode; readonly name?: Identifier | StringLiteral | NumericLiteral | undefined; } -export interface ComputedPropertyName extends Node { - readonly kind: SyntaxKind.ComputedPropertyName; - readonly parent: Declaration; - readonly expression: Expression; +// dprint-ignore +export class ComputedPropertyName extends Node { + declare readonly ast: AstComputedPropertyName; + + override get parent(): Declaration { return super.parent as Declaration; } + + get expression(): Expression { return this.ast.data.expression.node; } + + /** @internal */ override set parent(value: Declaration) { super.parent = value; } + /** @internal */ set expression(value: Expression) { this.ast.data.expression = value.ast; } } // Typed as a PrimaryExpression due to its presence in BinaryExpressions (#field in expr) -export interface PrivateIdentifier extends PrimaryExpression { - readonly kind: SyntaxKind.PrivateIdentifier; - // escaping not strictly necessary - // avoids gotchas in transforms and utils - readonly escapedText: __String; +// dprint-ignore +export class PrivateIdentifier extends Token { + declare _primaryExpressionBrand: any; + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare readonly ast: AstPrivateIdentifier; + + get escapedText(): __String { return this.ast.data.escapedText; } + get text(): string { return idText(this); } + + /** @internal */ set escapedText(value: __String) { this.ast.data.escapedText = value; } } /** @internal */ @@ -1817,26 +2735,51 @@ export interface LateBoundName extends ComputedPropertyName { readonly expression: EntityNameExpression; } -export interface Decorator extends Node { - readonly kind: SyntaxKind.Decorator; - readonly parent: NamedDeclaration; - readonly expression: LeftHandSideExpression; +// dprint-ignore +export class Decorator extends Node { + declare readonly ast: AstDecorator; + + override get parent(): Declaration { return super.parent as Declaration; } + + get expression(): LeftHandSideExpression { return this.ast.data.expression.node; } + + /** @internal */ override set parent(value: Declaration) { super.parent = value; } + /** @internal */ set expression(value: LeftHandSideExpression) { this.ast.data.expression = value.ast; } } -export interface TypeParameterDeclaration extends NamedDeclaration, JSDocContainer { - readonly kind: SyntaxKind.TypeParameter; - readonly parent: DeclarationWithTypeParameterChildren | InferTypeNode; - readonly modifiers?: NodeArray | undefined; - readonly name: Identifier; - /** Note: Consider calling `getEffectiveConstraintOfTypeParameter` */ - readonly constraint?: TypeNode | undefined; - readonly default?: TypeNode | undefined; +// dprint-ignore +export class TypeParameterDeclaration extends Node implements Declaration, JSDocContainer { + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare readonly ast: AstTypeParameterDeclaration; - // For error recovery purposes (see `isGrammarError` in utilities.ts). - expression?: Expression | undefined; + override get parent(): DeclarationWithTypeParameterChildren | InferTypeNode { return super.parent as DeclarationWithTypeParameterChildren | InferTypeNode; } + + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + get name(): Identifier { return this.ast.data.name.node; } + /** + * NOTE: Consider calling `getEffectiveConstraintOfTypeParameter` + */ + get constraint(): TypeNode | undefined { return this.ast.data.constraint?.node; } + get default(): TypeNode | undefined { return this.ast.data.default?.node; } + + /** @internal */ override set parent(value: DeclarationWithTypeParameterChildren | InferTypeNode) { super.parent = value; } + /** @internal */ set modifiers(value: NodeArray | undefined) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set name(value: Identifier) { this.ast.data.name = value.ast; } + /** @internal */ set constraint(value: TypeNode | undefined) { this.ast.data.constraint = value?.ast; } + /** @internal */ set default(value: TypeNode | undefined) { this.ast.data.default = value?.ast; } + /** @internal */ get expression(): Expression | undefined { return this.ast.data.expression?.node; } + /** @internal */ set expression(value: Expression | undefined) { this.ast.data.expression = value?.ast; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value) { this.ast.data.jsDoc = value; } } export interface SignatureDeclarationBase extends NamedDeclaration, JSDocContainer { + readonly ast: AstNode; readonly kind: SignatureDeclaration["kind"]; readonly name?: PropertyName | undefined; readonly typeParameters?: NodeArray | undefined; @@ -1860,84 +2803,268 @@ export type SignatureDeclaration = | FunctionExpression | ArrowFunction; -export interface CallSignatureDeclaration extends SignatureDeclarationBase, TypeElement, LocalsContainer { - readonly kind: SyntaxKind.CallSignature; +// dprint-ignore +export class CallSignatureDeclaration extends Node implements SignatureDeclarationBase, TypeElement, LocalsContainer { + declare _signatureDeclarationBrand: any; + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare _typeElementBrand: any; + declare _localsContainerBrand: any; + declare readonly ast: AstCallSignatureDeclaration; + + get typeParameters(): NodeArray | undefined { return this.ast.data.typeParameters?.nodes; } + get parameters(): NodeArray { return this.ast.data.parameters.nodes; } + get type(): TypeNode | undefined { return this.ast.data.type?.node; } + + /** @internal */ set typeParameters(value) { this.ast.data.typeParameters = value?.ast; } + /** @internal */ set parameters(value) { this.ast.data.parameters = value.ast; } + /** @internal */ set type(value) { this.ast.data.type = value?.ast; } + /** @internal */ get typeArguments(): NodeArray | undefined { return this.ast.data.typeArguments?.nodes; } + /** @internal */ set typeArguments(value) { this.ast.data.typeArguments = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } } -export interface ConstructSignatureDeclaration extends SignatureDeclarationBase, TypeElement, LocalsContainer { - readonly kind: SyntaxKind.ConstructSignature; +// dprint-ignore +export class ConstructSignatureDeclaration extends Node implements SignatureDeclarationBase, TypeElement, LocalsContainer { + declare _signatureDeclarationBrand: any; + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare _typeElementBrand: any; + declare _localsContainerBrand: any; + declare readonly ast: AstConstructSignatureDeclaration; + + get typeParameters(): NodeArray | undefined { return this.ast.data.typeParameters?.nodes; } + get parameters(): NodeArray { return this.ast.data.parameters.nodes; } + get type(): TypeNode | undefined { return this.ast.data.type?.node; } + + /** @internal */ set typeParameters(value) { this.ast.data.typeParameters = value?.ast; } + /** @internal */ set parameters(value) { this.ast.data.parameters = value.ast; } + /** @internal */ set type(value) { this.ast.data.type = value?.ast; } + /** @internal */ get typeArguments(): NodeArray | undefined { return this.ast.data.typeArguments?.nodes; } + /** @internal */ set typeArguments(value) { this.ast.data.typeArguments = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } } export type BindingName = Identifier | BindingPattern; // dprint-ignore -export interface VariableDeclaration extends NamedDeclaration, JSDocContainer { - readonly kind: SyntaxKind.VariableDeclaration; - readonly parent: VariableDeclarationList | CatchClause; - readonly name: BindingName; // Declared variable name - readonly exclamationToken?: ExclamationToken | undefined; // Optional definite assignment assertion - readonly type?: TypeNode | undefined; // Optional type annotation - readonly initializer?: Expression | undefined; // Optional initializer +export class VariableDeclaration extends Node implements Declaration, JSDocContainer { + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare readonly ast: AstVariableDeclaration; + + override get parent() { return super.parent as VariableDeclarationList | CatchClause; } + + /** + * Declared variable name + */ + get name(): BindingName { return this.ast.data.name.node; } + /** + * Optional definite assignment assertion + */ + get exclamationToken(): ExclamationToken | undefined { return this.ast.data.exclamationToken?.node; } + /** + * Optional type annotation + */ + get type(): TypeNode | undefined { return this.ast.data.type?.node; } + /** + * Optional initializer + */ + get initializer(): Expression | undefined { return this.ast.data.initializer?.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set name(value: BindingName) { this.ast.data.name = value.ast; } + /** @internal */ set exclamationToken(value: ExclamationToken | undefined) { this.ast.data.exclamationToken = value?.ast; } + /** @internal */ set type(value: TypeNode | undefined) { this.ast.data.type = value?.ast; } + /** @internal */ set initializer(value: Expression | undefined) { this.ast.data.initializer = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } + /** @internal */ export type InitializedVariableDeclaration = VariableDeclaration & { readonly initializer: Expression; }; -export interface VariableDeclarationList extends Node { - readonly kind: SyntaxKind.VariableDeclarationList; - readonly parent: VariableStatement | ForStatement | ForOfStatement | ForInStatement; - readonly declarations: NodeArray; +// dprint-ignore +export class VariableDeclarationList extends Node { + declare readonly ast: AstVariableDeclarationList; + + override get parent() { return super.parent as VariableStatement | ForStatement | ForOfStatement | ForInStatement; } + + get declarations(): NodeArray { return this.ast.data.declarations.nodes; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set declarations(value) { this.ast.data.declarations = value.ast; } } // dprint-ignore -export interface ParameterDeclaration extends NamedDeclaration, JSDocContainer { - readonly kind: SyntaxKind.Parameter; - readonly parent: SignatureDeclaration; - readonly modifiers?: NodeArray | undefined; - readonly dotDotDotToken?: DotDotDotToken | undefined; // Present on rest parameter +export class ParameterDeclaration extends Node implements Declaration, JSDocContainer { + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare readonly ast: AstParameterDeclaration; + + override get parent(): SignatureDeclaration { return super.parent as SignatureDeclaration; } + + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + get dotDotDotToken(): DotDotDotToken | undefined { return this.ast.data.dotDotDotToken?.node; } // TODO(rbuckton): `name` can be undefined for JSDoc signature parameters - readonly name: BindingName; // Declared parameter name. - readonly questionToken?: QuestionToken | undefined; // Present on optional parameter - readonly type?: TypeNode | undefined; // Optional type annotation - readonly initializer?: Expression | undefined; // Optional initializer + get name(): BindingName { return this.ast.data.name?.node; } + get questionToken(): QuestionToken | undefined { return this.ast.data.questionToken?.node; } + get type(): TypeNode | undefined { return this.ast.data.type?.node; } + get initializer(): Expression | undefined { return this.ast.data.initializer?.node; } + + /** @internal */ override set parent(value: SignatureDeclaration) { super.parent = value; } + /** @internal */ set modifiers(value: NodeArray | undefined) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set dotDotDotToken(value: DotDotDotToken | undefined) { this.ast.data.dotDotDotToken = value?.ast; } + // TODO(rbuckton): `name` can be undefined for JSDoc signature parameters + /** @internal */ set name(value: BindingName) { this.ast.data.name = value?.ast; } + /** @internal */ set questionToken(value: QuestionToken | undefined) { this.ast.data.questionToken = value?.ast; } + /** @internal */ set type(value: TypeNode | undefined) { this.ast.data.type = value?.ast; } + /** @internal */ set initializer(value: Expression | undefined) { this.ast.data.initializer = value?.ast; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value) { this.ast.data.jsDoc = value; } } // dprint-ignore -export interface BindingElement extends NamedDeclaration, FlowContainer { - readonly kind: SyntaxKind.BindingElement; - readonly parent: BindingPattern; - readonly propertyName?: PropertyName | undefined; // Binding property name (in object binding pattern) - readonly dotDotDotToken?: DotDotDotToken | undefined; // Present on rest element (in object binding pattern) - readonly name: BindingName; // Declared binding element name - readonly initializer?: Expression | undefined; // Optional initializer +export class BindingElement extends Node implements Declaration, FlowContainer { + declare _declarationBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstBindingElement; + + override get parent() { return super.parent as BindingPattern; } + + /** + * Binding property name (in object binding pattern) + */ + get propertyName(): PropertyName | undefined { return this.ast.data.propertyName?.node; } + /** + * Present on rest element (in object binding pattern) + */ + get dotDotDotToken(): DotDotDotToken | undefined { return this.ast.data.dotDotDotToken?.node; } + /** + * Declared binding element name + */ + get name(): BindingName { return this.ast.data.name.node; } + /** + * Optional initializer + */ + get initializer(): Expression | undefined { return this.ast.data.initializer?.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set propertyName(value) { this.ast.data.propertyName = value?.ast; } + /** @internal */ set dotDotDotToken(value) { this.ast.data.dotDotDotToken = value?.ast; } + /** @internal */ set name(value) { this.ast.data.name = value.ast; } + /** @internal */ set initializer(value) { this.ast.data.initializer = value?.ast; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value: FlowNode | undefined) { this.ast.data.flowNode = value; } } /** @internal */ export type BindingElementGrandparent = BindingElement["parent"]["parent"]; // dprint-ignore -export interface PropertySignature extends TypeElement, JSDocContainer { - readonly kind: SyntaxKind.PropertySignature; - readonly parent: TypeLiteralNode | InterfaceDeclaration; - readonly modifiers?: NodeArray | undefined; - readonly name: PropertyName; // Declared property name - readonly questionToken?: QuestionToken | undefined; // Present on optional property - readonly type?: TypeNode | undefined; // Optional type annotation +export class PropertySignature extends Node implements TypeElement, JSDocContainer { + declare _typeElementBrand: any; + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare readonly ast: AstPropertySignature; - // The following properties are used only to report grammar errors (see `isGrammarError` in utilities.ts) - /** @internal */ readonly initializer?: Expression | undefined; // A property signature cannot have an initializer + override get parent() { return super.parent as TypeLiteralNode | InterfaceDeclaration; } + + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + /** + * Declared property name + */ + get name(): PropertyName { return this.ast.data.name.node; } + /** + * Present on optional property + */ + get questionToken(): QuestionToken | undefined { return this.ast.data.questionToken?.node; } + /** + * Optional type annotation + */ + get type(): TypeNode | undefined { return this.ast.data.type?.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set modifiers(value: NodeArray | undefined) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set name(value) { this.ast.data.name = value.ast; } + /** @internal */ set questionToken(value) { this.ast.data.questionToken = value?.ast; } + /** @internal */ set type(value) { this.ast.data.type = value?.ast; } + /** @internal */ get initializer(): Expression | undefined { return this.ast.data.initializer?.node; } + /** @internal */ set initializer(value) { this.ast.data.initializer = value?.ast; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } } // dprint-ignore -export interface PropertyDeclaration extends ClassElement, JSDocContainer { - readonly kind: SyntaxKind.PropertyDeclaration; - readonly parent: ClassLikeDeclaration; - readonly modifiers?: NodeArray | undefined; - readonly name: PropertyName; - readonly questionToken?: QuestionToken | undefined; // Present for use with reporting a grammar error for auto-accessors (see `isGrammarError` in utilities.ts) - readonly exclamationToken?: ExclamationToken | undefined; - readonly type?: TypeNode | undefined; - readonly initializer?: Expression | undefined; // Optional initializer +export class PropertyDeclaration extends Node implements ClassElement, JSDocContainer { + declare _classElementBrand: any; + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare readonly ast: AstPropertyDeclaration; + + override get parent() { return super.parent as ClassLikeDeclaration; } + + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + get name(): PropertyName { return this.ast.data.name.node; } + /** + * Optional field. Disallowed for auto-accessors and only used to report a grammar error (see `isGrammarError` in utilities.ts) + */ + get questionToken(): QuestionToken | undefined { return this.ast.data.questionToken?.node; } + get exclamationToken(): ExclamationToken | undefined { return this.ast.data.exclamationToken?.node; } + get type(): TypeNode | undefined { return this.ast.data.type?.node; } + /** + * Optional initializer + */ + get initializer(): Expression | undefined { return this.ast.data.initializer?.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set name(value) { this.ast.data.name = value.ast; } + /** @internal */ set questionToken(value) { this.ast.data.questionToken = value?.ast; } + /** @internal */ set exclamationToken(value) { this.ast.data.exclamationToken = value?.ast; } + /** @internal */ set type(value) { this.ast.data.type = value?.ast; } + /** @internal */ set initializer(value) { this.ast.data.initializer = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } export interface AutoAccessorPropertyDeclaration extends PropertyDeclaration { @@ -1979,6 +3106,9 @@ export type InitializedPropertyDeclaration = PropertyDeclaration & { readonly in export interface ObjectLiteralElement extends NamedDeclaration { _objectLiteralBrand: any; + readonly ast: AstObjectLiteralElement; + + // TODO(rbuckton): remove this? readonly name?: PropertyName | undefined; } @@ -1990,37 +3120,85 @@ export type ObjectLiteralElementLike = | MethodDeclaration | AccessorDeclaration; -export interface PropertyAssignment extends ObjectLiteralElement, JSDocContainer { - readonly kind: SyntaxKind.PropertyAssignment; - readonly parent: ObjectLiteralExpression; - readonly name: PropertyName; - readonly initializer: Expression; +// dprint-ignore +export class PropertyAssignment extends Node implements ObjectLiteralElement, Declaration, JSDocContainer { + declare _objectLiteralBrand: any; + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare readonly ast: AstPropertyAssignment; - // The following properties are used only to report grammar errors (see `isGrammarError` in utilities.ts) - /** @internal */ readonly modifiers?: NodeArray | undefined; // property assignment cannot have decorators or modifiers - /** @internal */ readonly questionToken?: QuestionToken | undefined; // property assignment cannot have a question token - /** @internal */ readonly exclamationToken?: ExclamationToken | undefined; // property assignment cannot have an exclamation token + override get parent() { return super.parent as ObjectLiteralExpression; } + + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + get name(): PropertyName { return this.ast.data.name.node; } + get questionToken(): QuestionToken | undefined { return this.ast.data.questionToken?.node; } + get exclamationToken(): ExclamationToken | undefined { return this.ast.data.exclamationToken?.node; } + get initializer(): Expression { return this.ast.data.initializer.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set name(value) { this.ast.data.name = value.ast; } + /** @internal */ set questionToken(value) { this.ast.data.questionToken = value?.ast; } + /** @internal */ set exclamationToken(value) { this.ast.data.exclamationToken = value?.ast; } + /** @internal */ set initializer(value) { this.ast.data.initializer = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } -export interface ShorthandPropertyAssignment extends ObjectLiteralElement, JSDocContainer { - readonly kind: SyntaxKind.ShorthandPropertyAssignment; - readonly parent: ObjectLiteralExpression; - readonly name: Identifier; - // used when ObjectLiteralExpression is used in ObjectAssignmentPattern - // it is a grammar error to appear in actual object initializer (see `isGrammarError` in utilities.ts): - readonly equalsToken?: EqualsToken | undefined; - readonly objectAssignmentInitializer?: Expression | undefined; +// dprint-ignore +export class ShorthandPropertyAssignment extends Node implements ObjectLiteralElement, Declaration, JSDocContainer { + declare _objectLiteralBrand: any; + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare readonly ast: AstShorthandPropertyAssignment; - // The following properties are used only to report grammar errors (see `isGrammarError` in utilities.ts) - /** @internal */ readonly modifiers?: NodeArray | undefined; // shorthand property assignment cannot have decorators or modifiers - /** @internal */ readonly questionToken?: QuestionToken | undefined; // shorthand property assignment cannot have a question token - /** @internal */ readonly exclamationToken?: ExclamationToken | undefined; // shorthand property assignment cannot have an exclamation token + override get parent() { return super.parent as ObjectLiteralExpression; } + + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + get name(): Identifier { return this.ast.data.name.node; } + get questionToken(): QuestionToken | undefined { return this.ast.data.questionToken?.node; } + get exclamationToken(): ExclamationToken | undefined { return this.ast.data.exclamationToken?.node; } + get equalsToken(): EqualsToken | undefined { return this.ast.data.equalsToken?.node; } + get objectAssignmentInitializer(): Expression | undefined { return this.ast.data.objectAssignmentInitializer?.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set name(value) { this.ast.data.name = value.ast; } + /** @internal */ set questionToken(value) { this.ast.data.questionToken = value?.ast; } + /** @internal */ set exclamationToken(value) { this.ast.data.exclamationToken = value?.ast; } + /** @internal */ set equalsToken(value) { this.ast.data.equalsToken = value?.ast; } + /** @internal */ set objectAssignmentInitializer(value) { this.ast.data.objectAssignmentInitializer = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } -export interface SpreadAssignment extends ObjectLiteralElement, JSDocContainer { - readonly kind: SyntaxKind.SpreadAssignment; - readonly parent: ObjectLiteralExpression; - readonly expression: Expression; +// dprint-ignore +export class SpreadAssignment extends Node implements ObjectLiteralElement, JSDocContainer { + declare _objectLiteralBrand: any; + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare readonly ast: AstSpreadAssignment; + + override get parent() { return super.parent as ObjectLiteralExpression; } + + get expression(): Expression { return this.ast.data.expression.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } export type VariableLikeDeclaration = @@ -2036,16 +3214,28 @@ export type VariableLikeDeclaration = | JSDocPropertyTag | JSDocParameterTag; -export interface ObjectBindingPattern extends Node { - readonly kind: SyntaxKind.ObjectBindingPattern; - readonly parent: VariableDeclaration | ParameterDeclaration | BindingElement; - readonly elements: NodeArray; +// dprint-ignore +export class ObjectBindingPattern extends Node { + declare readonly ast: AstObjectBindingPattern; + + override get parent() { return super.parent as VariableDeclaration | ParameterDeclaration | BindingElement; } + + get elements(): NodeArray { return this.ast.data.elements.nodes; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set elements(value) { this.ast.data.elements = value.ast; } } -export interface ArrayBindingPattern extends Node { - readonly kind: SyntaxKind.ArrayBindingPattern; - readonly parent: VariableDeclaration | ParameterDeclaration | BindingElement; - readonly elements: NodeArray; +// dprint-ignore +export class ArrayBindingPattern extends Node { + declare readonly ast: AstArrayBindingPattern; + + override get parent() { return super.parent as VariableDeclaration | ParameterDeclaration | BindingElement; } + + get elements(): NodeArray { return this.ast.data.elements.nodes; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set elements(value) { this.ast.data.elements = value.ast; } } export type BindingPattern = ObjectBindingPattern | ArrayBindingPattern; @@ -2079,21 +3269,115 @@ export type FunctionLikeDeclaration = | ConstructorDeclaration | FunctionExpression | ArrowFunction; + /** @deprecated Use SignatureDeclaration */ export type FunctionLike = SignatureDeclaration; -export interface FunctionDeclaration extends FunctionLikeDeclarationBase, DeclarationStatement, LocalsContainer { - readonly kind: SyntaxKind.FunctionDeclaration; - readonly modifiers?: NodeArray | undefined; - readonly name?: Identifier | undefined; - readonly body?: FunctionBody | undefined; +// NOTE: Changing the following list requires changes to: +// - `canHaveQuestionToken` in utilitiesPublic.ts +/** @internal */ +export type HasQuestionToken = + | ParameterDeclaration + | PropertySignature + | PropertyDeclaration + | MethodSignature + | MethodDeclaration + | ShorthandPropertyAssignment + | MappedTypeNode + | NamedTupleMember + | ConditionalExpression + | PropertyAssignment; + +// NOTE: Changing the following list requires changes to: +// - `canHaveAsteriskToken` in utilitiesPublic.ts +/** @internal */ +export type HasAsteriskToken = + | FunctionDeclaration + | FunctionExpression + | MethodDeclaration + | YieldExpression; + +// dprint-ignore +export class FunctionDeclaration extends Node implements FunctionLikeDeclarationBase, DeclarationStatement, LocalsContainer { + declare _functionLikeDeclarationBrand: any; + declare _signatureDeclarationBrand: any; + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare _statementBrand: any; + declare _localsContainerBrand: any; + declare readonly ast: AstFunctionDeclaration; + + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + get asteriskToken(): AsteriskToken | undefined { return this.ast.data.asteriskToken?.node; } + get name(): Identifier | undefined { return this.ast.data.name?.node; } + get typeParameters(): NodeArray | undefined { return this.ast.data.typeParameters?.nodes; } + get parameters(): NodeArray { return this.ast.data.parameters.nodes; } + get type(): TypeNode | undefined { return this.ast.data.type?.node; } + get body(): Block | undefined { return this.ast.data.body?.node; } + + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set asteriskToken(value) { this.ast.data.asteriskToken = value?.ast; } + /** @internal */ set name(value) { this.ast.data.name = value?.ast; } + /** @internal */ set typeParameters(value) { this.ast.data.typeParameters = value?.ast; } + /** @internal */ set parameters(value) { this.ast.data.parameters = value.ast; } + /** @internal */ set type(value) { this.ast.data.type = value?.ast; } + /** @internal */ set body(value) { this.ast.data.body = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } + /** @internal */ get endFlowNode(): FlowNode | undefined { return this.ast.data.endFlowNode; } + /** @internal */ set endFlowNode(value) { this.ast.data.endFlowNode = value; } + /** @internal */ get returnFlowNode(): FlowNode | undefined { return this.ast.data.returnFlowNode; } + /** @internal */ set returnFlowNode(value) { this.ast.data.returnFlowNode = value; } + /** @internal */ get typeArguments(): NodeArray | undefined { return this.ast.data.typeArguments?.nodes; } + /** @internal */ set typeArguments(value) { this.ast.data.typeArguments = value?.ast; } } -export interface MethodSignature extends SignatureDeclarationBase, TypeElement, LocalsContainer { - readonly kind: SyntaxKind.MethodSignature; - readonly parent: TypeLiteralNode | InterfaceDeclaration; - readonly modifiers?: NodeArray | undefined; - readonly name: PropertyName; + +// dprint-ignore +export class MethodSignature extends Node implements SignatureDeclarationBase, TypeElement, LocalsContainer { + declare _signatureDeclarationBrand: any; + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare _typeElementBrand: any; + declare _localsContainerBrand: any; + declare readonly ast: AstMethodSignature; + + override get parent() { return super.parent as TypeLiteralNode | InterfaceDeclaration; } + + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + get name(): PropertyName { return this.ast.data.name.node; } + get questionToken(): QuestionToken | undefined { return this.ast.data.questionToken?.node; } + get typeParameters(): NodeArray | undefined { return this.ast.data.typeParameters?.nodes; } + get parameters(): NodeArray { return this.ast.data.parameters.nodes; } + get type(): TypeNode | undefined { return this.ast.data.type?.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set name(value) { this.ast.data.name = value.ast; } + /** @internal */ set questionToken(value) { this.ast.data.questionToken = value?.ast; } + /** @internal */ set typeParameters(value) { this.ast.data.typeParameters = value?.ast; } + /** @internal */ set parameters(value) { this.ast.data.parameters = value.ast; } + /** @internal */ set type(value) { this.ast.data.type = value?.ast; } + /** @internal */ get typeArguments(): NodeArray | undefined { return this.ast.data.typeArguments?.nodes; } + /** @internal */ set typeArguments(value) { this.ast.data.typeArguments = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } } // Note that a MethodDeclaration is considered both a ClassElement and an ObjectLiteralElement. @@ -2105,136 +3389,422 @@ export interface MethodSignature extends SignatureDeclarationBase, TypeElement, // Because of this, it may be necessary to determine what sort of MethodDeclaration you have // at later stages of the compiler pipeline. In that case, you can either check the parent kind // of the method, or use helpers like isObjectLiteralMethodDeclaration -export interface MethodDeclaration extends FunctionLikeDeclarationBase, ClassElement, ObjectLiteralElement, JSDocContainer, LocalsContainer, FlowContainer { - readonly kind: SyntaxKind.MethodDeclaration; - readonly parent: ClassLikeDeclaration | ObjectLiteralExpression; - readonly modifiers?: NodeArray | undefined; - readonly name: PropertyName; - readonly body?: FunctionBody | undefined; +// dprint-ignore +export class MethodDeclaration extends Node implements FunctionLikeDeclarationBase, ClassElement, ObjectLiteralElement, LocalsContainer, FlowContainer { + declare _functionLikeDeclarationBrand: any; + declare _signatureDeclarationBrand: any; + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare _classElementBrand: any; + declare _objectLiteralBrand: any; + declare _localsContainerBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstMethodDeclaration; - // The following properties are used only to report grammar errors (see `isGrammarError` in utilities.ts) - /** @internal */ readonly exclamationToken?: ExclamationToken | undefined; // A method cannot have an exclamation token + override get parent() { return super.parent as ClassLikeDeclaration | ObjectLiteralExpression; } + + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + get asteriskToken(): AsteriskToken | undefined { return this.ast.data.asteriskToken?.node; } + get name(): PropertyName { return this.ast.data.name.node; } + get questionToken(): QuestionToken | undefined { return this.ast.data.questionToken?.node; } + get typeParameters(): NodeArray | undefined { return this.ast.data.typeParameters?.nodes; } + get parameters(): NodeArray { return this.ast.data.parameters.nodes; } + get type(): TypeNode | undefined { return this.ast.data.type?.node; } + get body(): Block | undefined { return this.ast.data.body?.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set asteriskToken(value) { this.ast.data.asteriskToken = value?.ast; } + /** @internal */ set name(value) { this.ast.data.name = value.ast; } + /** @internal */ set questionToken(value) { this.ast.data.questionToken = value?.ast; } + /** + * used only to report grammar errors (see `isGrammarError` in utilities.ts) + * @internal + */ + get exclamationToken(): ExclamationToken | undefined { return this.ast.data.exclamationToken?.node; } + /** @internal */ set exclamationToken(value) { this.ast.data.exclamationToken = value?.ast; } + /** @internal */ set typeParameters(value) { this.ast.data.typeParameters = value?.ast; } + /** @internal */ set parameters(value) { this.ast.data.parameters = value.ast; } + /** @internal */ set type(value) { this.ast.data.type = value?.ast; } + /** @internal */ set body(value) { this.ast.data.body = value?.ast; } + /** @internal */ get typeArguments(): NodeArray | undefined { return this.ast.data.typeArguments?.nodes; } + /** @internal */ set typeArguments(value) { this.ast.data.typeArguments = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value: FlowNode | undefined) { this.ast.data.flowNode = value; } + /** @internal */ get endFlowNode(): FlowNode | undefined { return this.ast.data.endFlowNode; } + /** @internal */ set endFlowNode(value) { this.ast.data.endFlowNode = value; } + /** @internal */ get returnFlowNode(): FlowNode | undefined { return this.ast.data.returnFlowNode; } + /** @internal */ set returnFlowNode(value) { this.ast.data.returnFlowNode = value; } } -export interface ConstructorDeclaration extends FunctionLikeDeclarationBase, ClassElement, JSDocContainer, LocalsContainer { - readonly kind: SyntaxKind.Constructor; - readonly parent: ClassLikeDeclaration; - readonly modifiers?: NodeArray | undefined; - readonly body?: FunctionBody | undefined; +// dprint-ignore +export class ConstructorDeclaration extends Node implements FunctionLikeDeclarationBase, ClassElement, JSDocContainer, LocalsContainer { + declare _functionLikeDeclarationBrand: any; + declare _signatureDeclarationBrand: any; + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare _classElementBrand: any; + declare _localsContainerBrand: any; + declare readonly ast: AstConstructorDeclaration; - // The following properties are used only to report grammar errors (see `isGrammarError` in utilities.ts) - /** @internal */ readonly typeParameters?: NodeArray | undefined; // A constructor cannot have type parameters - /** @internal */ readonly type?: TypeNode | undefined; // A constructor cannot have a return type annotation + override get parent() { return super.parent as ClassLikeDeclaration; } + + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + get body(): Block | undefined { return this.ast.data.body?.node; } + get parameters(): NodeArray { return this.ast.data.parameters.nodes; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set body(value) { this.ast.data.body = value?.ast; } + /** @internal */ get typeParameters(): NodeArray | undefined { return this.ast.data.typeParameters?.nodes; } + /** @internal */ set typeParameters(value) { this.ast.data.typeParameters = value?.ast; } + /** @internal */ set parameters(value) { this.ast.data.parameters = value.ast; } + /** @internal */ get type(): TypeNode | undefined { return this.ast.data.type?.node; } + /** @internal */ set type(value) { this.ast.data.type = value?.ast; } + /** @internal */ get typeArguments(): NodeArray | undefined { return this.ast.data.typeArguments?.nodes; } + /** @internal */ set typeArguments(value) { this.ast.data.typeArguments = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } + /** @internal */ get endFlowNode(): FlowNode | undefined { return this.ast.data.endFlowNode; } + /** @internal */ set endFlowNode(value) { this.ast.data.endFlowNode = value; } + /** @internal */ get returnFlowNode(): FlowNode | undefined { return this.ast.data.returnFlowNode; } + /** @internal */ set returnFlowNode(value) { this.ast.data.returnFlowNode = value; } } /** For when we encounter a semicolon in a class declaration. ES6 allows these as class elements. */ -export interface SemicolonClassElement extends ClassElement, JSDocContainer { - readonly kind: SyntaxKind.SemicolonClassElement; - readonly parent: ClassLikeDeclaration; +// dprint-ignore +export class SemicolonClassElement extends Node implements ClassElement, JSDocContainer { + declare _classElementBrand: any; + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare symbol: never; + declare localSymbol: never; + declare readonly ast: AstSemicolonClassElement; + + override get parent() { return super.parent as ClassLikeDeclaration; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } } // See the comment on MethodDeclaration for the intuition behind GetAccessorDeclaration being a // ClassElement and an ObjectLiteralElement. -export interface GetAccessorDeclaration extends FunctionLikeDeclarationBase, ClassElement, TypeElement, ObjectLiteralElement, JSDocContainer, LocalsContainer, FlowContainer { - readonly kind: SyntaxKind.GetAccessor; - readonly parent: ClassLikeDeclaration | ObjectLiteralExpression | TypeLiteralNode | InterfaceDeclaration; - readonly modifiers?: NodeArray | undefined; - readonly name: PropertyName; - readonly body?: FunctionBody | undefined; +// dprint-ignore +export class GetAccessorDeclaration extends Node implements FunctionLikeDeclarationBase, ClassElement, TypeElement, ObjectLiteralElement, JSDocContainer, LocalsContainer, FlowContainer { + declare _functionLikeDeclarationBrand: any; + declare _signatureDeclarationBrand: any; + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare _classElementBrand: any; + declare _typeElementBrand: any; + declare _objectLiteralBrand: any; + declare _localsContainerBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstGetAccessorDeclaration; - // The following properties are used only to report grammar errors (see `isGrammarError` in utilities.ts) - /** @internal */ readonly typeParameters?: NodeArray | undefined; // A get accessor cannot have type parameters + override get parent() { return super.parent as ClassLikeDeclaration | ObjectLiteralExpression | InterfaceDeclaration | TypeLiteralNode; } + + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + get name(): PropertyName { return this.ast.data.name.node; } + get body(): Block | undefined { return this.ast.data.body?.node; } + get parameters(): NodeArray { return this.ast.data.parameters.nodes; } + get type(): TypeNode | undefined { return this.ast.data.type?.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set name(value) { this.ast.data.name = value.ast; } + /** @internal */ set body(value) { this.ast.data.body = value?.ast; } + /** @internal */ get typeParameters(): NodeArray | undefined { return this.ast.data.typeParameters?.nodes; } + /** @internal */ set typeParameters(value) { this.ast.data.typeParameters = value?.ast; } + /** @internal */ set parameters(value) { this.ast.data.parameters = value.ast; } + /** @internal */ set type(value) { this.ast.data.type = value?.ast; } + /** @internal */ get typeArguments(): NodeArray | undefined { return this.ast.data.typeArguments?.nodes; } + /** @internal */ set typeArguments(value) { this.ast.data.typeArguments = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value: FlowNode | undefined) { this.ast.data.flowNode = value; } + /** @internal */ get endFlowNode(): FlowNode | undefined { return this.ast.data.endFlowNode; } + /** @internal */ set endFlowNode(value) { this.ast.data.endFlowNode = value; } + /** @internal */ get returnFlowNode(): FlowNode | undefined { return this.ast.data.returnFlowNode; } + /** @internal */ set returnFlowNode(value) { this.ast.data.returnFlowNode = value; } } // See the comment on MethodDeclaration for the intuition behind SetAccessorDeclaration being a // ClassElement and an ObjectLiteralElement. -export interface SetAccessorDeclaration extends FunctionLikeDeclarationBase, ClassElement, TypeElement, ObjectLiteralElement, JSDocContainer, LocalsContainer, FlowContainer { - readonly kind: SyntaxKind.SetAccessor; - readonly parent: ClassLikeDeclaration | ObjectLiteralExpression | TypeLiteralNode | InterfaceDeclaration; - readonly modifiers?: NodeArray | undefined; - readonly name: PropertyName; - readonly body?: FunctionBody | undefined; +// dprint-ignore +export class SetAccessorDeclaration extends Node implements FunctionLikeDeclarationBase, ClassElement, TypeElement, ObjectLiteralElement, JSDocContainer, LocalsContainer, FlowContainer { + declare _functionLikeDeclarationBrand: any; + declare _signatureDeclarationBrand: any; + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare _classElementBrand: any; + declare _typeElementBrand: any; + declare _objectLiteralBrand: any; + declare _localsContainerBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstSetAccessorDeclaration; - // The following properties are used only to report grammar errors (see `isGrammarError` in utilities.ts) - /** @internal */ readonly typeParameters?: NodeArray | undefined; // A set accessor cannot have type parameters - /** @internal */ readonly type?: TypeNode | undefined; // A set accessor cannot have a return type + override get parent() { return super.parent as ClassLikeDeclaration | ObjectLiteralExpression | InterfaceDeclaration | TypeLiteralNode; } + + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + get name(): PropertyName { return this.ast.data.name.node; } + get body(): Block | undefined { return this.ast.data.body?.node; } + get parameters(): NodeArray { return this.ast.data.parameters.nodes; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set name(value) { this.ast.data.name = value.ast; } + /** @internal */ set body(value) { this.ast.data.body = value?.ast; } + /** @internal */ get typeParameters(): NodeArray | undefined { return this.ast.data.typeParameters?.nodes; } + /** @internal */ set typeParameters(value) { this.ast.data.typeParameters = value?.ast; } + /** @internal */ set parameters(value) { this.ast.data.parameters = value.ast; } + /** @internal */ get type(): TypeNode | undefined { return this.ast.data.type?.node; } + /** @internal */ set type(value) { this.ast.data.type = value?.ast; } + /** @internal */ get typeArguments(): NodeArray | undefined { return this.ast.data.typeArguments?.nodes; } + /** @internal */ set typeArguments(value) { this.ast.data.typeArguments = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value: FlowNode | undefined) { this.ast.data.flowNode = value; } + /** @internal */ get endFlowNode(): FlowNode | undefined { return this.ast.data.endFlowNode; } + /** @internal */ set endFlowNode(value) { this.ast.data.endFlowNode = value; } + /** @internal */ get returnFlowNode(): FlowNode | undefined { return this.ast.data.returnFlowNode; } + /** @internal */ set returnFlowNode(value) { this.ast.data.returnFlowNode = value; } } export type AccessorDeclaration = GetAccessorDeclaration | SetAccessorDeclaration; -export interface IndexSignatureDeclaration extends SignatureDeclarationBase, ClassElement, TypeElement, LocalsContainer { - readonly kind: SyntaxKind.IndexSignature; - readonly parent: ObjectTypeDeclaration; - readonly modifiers?: NodeArray | undefined; - readonly type: TypeNode; +// dprint-ignore +export class IndexSignatureDeclaration extends Node implements SignatureDeclarationBase, ClassElement, TypeElement, LocalsContainer { + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare _classElementBrand: any; + declare _typeElementBrand: any; + declare _localsContainerBrand: any; + declare readonly ast: AstIndexSignatureDeclaration; + + override get parent() { return super.parent as ObjectTypeDeclaration; } + + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + get parameters(): NodeArray { return this.ast.data.parameters.nodes; } + get type(): TypeNode { return this.ast.data.type?.node!; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ get typeParameters(): NodeArray | undefined { return this.ast.data.typeParameters?.nodes; } + /** @internal */ set typeParameters(value) { this.ast.data.typeParameters = value?.ast; } + /** @internal */ set parameters(value) { this.ast.data.parameters = value.ast; } + /** @internal */ set type(value) { this.ast.data.type = value?.ast; } + /** @internal */ get typeArguments(): NodeArray | undefined { return this.ast.data.typeArguments?.nodes; } + /** @internal */ set typeArguments(value) { this.ast.data.typeArguments = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } } -export interface ClassStaticBlockDeclaration extends ClassElement, JSDocContainer, LocalsContainer { - readonly kind: SyntaxKind.ClassStaticBlockDeclaration; - readonly parent: ClassDeclaration | ClassExpression; - readonly body: Block; +// dprint-ignore +export class ClassStaticBlockDeclaration extends Node implements ClassElement, JSDocContainer, LocalsContainer { + declare _signatureDeclarationBrand: any; + declare _classElementBrand: any; + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare _localsContainerBrand: any; + declare readonly ast: AstClassStaticBlockDeclaration; - /** @internal */ endFlowNode?: FlowNode | undefined; - /** @internal */ returnFlowNode?: FlowNode | undefined; + override get parent() { return super.parent as ClassLikeDeclaration; } - // The following properties are used only to report grammar errors (see `isGrammarError` in utilities.ts) - /** @internal */ readonly modifiers?: NodeArray | undefined; + get body(): Block { return this.ast.data.body.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set body(value) { this.ast.data.body = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } + /** @internal */ get endFlowNode(): FlowNode | undefined { return this.ast.data.endFlowNode; } + /** @internal */ set endFlowNode(value) { this.ast.data.endFlowNode = value; } + /** @internal */ get returnFlowNode(): FlowNode | undefined { return this.ast.data.returnFlowNode; } + /** @internal */ set returnFlowNode(value) { this.ast.data.returnFlowNode = value; } } -export interface TypeNode extends Node { +export interface TypeNode extends Node { _typeNodeBrand: any; + readonly ast: AstTypeNode; } -/** @internal */ -export interface TypeNode extends Node { - readonly kind: TypeNodeSyntaxKind; -} - -export interface KeywordTypeNode extends KeywordToken, TypeNode { +export interface KeywordTypeNode extends KeywordToken, TypeNode { + readonly ast: AstKeywordTypeNode; readonly kind: TKind; } /** @deprecated */ -export interface ImportTypeAssertionContainer extends Node { - readonly kind: SyntaxKind.ImportTypeAssertionContainer; - readonly parent: ImportTypeNode; - /** @deprecated */ readonly assertClause: AssertClause; - readonly multiLine?: boolean | undefined; +// dprint-ignore +export class ImportTypeAssertionContainer extends Node { + declare readonly ast: AstImportTypeAssertionContainer; + + override get parent() { return super.parent as ImportTypeNode; } + + /** @deprecated */ + get assertClause(): ImportAttributes { return this.ast.data.assertClause.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set assertClause(value) { this.ast.data.assertClause = value.ast; } + /** @internal */ get multiLine(): boolean { return this.ast.data.multiLine; } + /** @internal */ set multiLine(value) { this.ast.data.multiLine = value; } } -export interface ImportTypeNode extends NodeWithTypeArguments { - readonly kind: SyntaxKind.ImportType; - readonly isTypeOf: boolean; - readonly argument: TypeNode; - /** @deprecated */ readonly assertions?: ImportTypeAssertionContainer | undefined; - readonly attributes?: ImportAttributes | undefined; - readonly qualifier?: EntityName | undefined; +// dprint-ignore +export class ImportTypeNode extends Node implements TypeNode, NodeWithTypeArguments { + declare _typeNodeBrand: any; + declare readonly ast: AstImportTypeNode; + + get isTypeOf(): boolean { return this.ast.data.isTypeOf; } + get argument(): TypeNode { return this.ast.data.argument.node; } + get attributes(): ImportAttributes | undefined { return this.ast.data.attributes?.node; } + /** @deprecated */ + get assertions(): ImportTypeAssertionContainer | undefined { return this.ast.data.assertions?.node; } + get qualifier(): EntityName | undefined { return this.ast.data.qualifier?.node; } + get typeArguments(): NodeArray | undefined { return this.ast.data.typeArguments?.nodes; } + + /** @internal */ set isTypeOf(value) { this.ast.data.isTypeOf = value; } + /** @internal */ set argument(value) { this.ast.data.argument = value.ast; } + /** @internal */ set attributes(value) { this.ast.data.attributes = value?.ast; } + /** @internal */ set assertions(value) { this.ast.data.assertions = value?.ast; } + /** @internal */ set qualifier(value) { this.ast.data.qualifier = value?.ast; } + /** @internal */ set typeArguments(value) { this.ast.data.typeArguments = value?.ast; } } /** @internal */ export type LiteralImportTypeNode = ImportTypeNode & { readonly argument: LiteralTypeNode & { readonly literal: StringLiteral; }; }; -export interface ThisTypeNode extends TypeNode { - readonly kind: SyntaxKind.ThisType; +// dprint-ignore +export class ThisTypeNode extends Node implements TypeNode { + declare _typeNodeBrand: any; + declare readonly ast: AstThisTypeNode; } export type FunctionOrConstructorTypeNode = FunctionTypeNode | ConstructorTypeNode; export interface FunctionOrConstructorTypeNodeBase extends TypeNode, SignatureDeclarationBase { + readonly ast: AstNode; readonly kind: SyntaxKind.FunctionType | SyntaxKind.ConstructorType; readonly type: TypeNode; } -export interface FunctionTypeNode extends FunctionOrConstructorTypeNodeBase, LocalsContainer { - readonly kind: SyntaxKind.FunctionType; +// dprint-ignore +export class FunctionTypeNode extends Node implements FunctionOrConstructorTypeNodeBase, LocalsContainer { + declare _signatureDeclarationBrand: any; + declare _typeNodeBrand: any; + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare _localsContainerBrand: any; + declare readonly ast: AstFunctionTypeNode; - // A function type cannot have modifiers - /** @internal */ readonly modifiers?: NodeArray | undefined; + get typeParameters(): NodeArray | undefined { return this.ast.data.typeParameters?.nodes; } + get parameters(): NodeArray { return this.ast.data.parameters.nodes; } + get type(): TypeNode { return this.ast.data.type.node; } + + /** @internal */ get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set typeParameters(value) { this.ast.data.typeParameters = value?.ast; } + /** @internal */ set parameters(value) { this.ast.data.parameters = value.ast; } + /** @internal */ set type(value) { this.ast.data.type = value.ast; } + /** @internal */ get typeArguments(): NodeArray | undefined { return this.ast.data.typeArguments?.nodes; } + /** @internal */ set typeArguments(value) { this.ast.data.typeArguments = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } } -export interface ConstructorTypeNode extends FunctionOrConstructorTypeNodeBase, LocalsContainer { - readonly kind: SyntaxKind.ConstructorType; - readonly modifiers?: NodeArray | undefined; +// dprint-ignore +export class ConstructorTypeNode extends Node implements FunctionOrConstructorTypeNodeBase, LocalsContainer { + declare readonly ast: AstConstructorTypeNode; + + declare _signatureDeclarationBrand: any; + declare _typeNodeBrand: any; + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare _localsContainerBrand: any; + + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + get typeParameters(): NodeArray | undefined { return this.ast.data.typeParameters?.nodes; } + get parameters(): NodeArray { return this.ast.data.parameters.nodes; } + get type(): TypeNode { return this.ast.data.type.node; } + + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set typeParameters(value) { this.ast.data.typeParameters = value?.ast; } + /** @internal */ set parameters(value) { this.ast.data.parameters = value.ast; } + /** @internal */ set type(value) { this.ast.data.type = value.ast; } + /** @internal */ get typeArguments(): NodeArray | undefined { return this.ast.data.typeArguments?.nodes; } + /** @internal */ set typeArguments(value) { this.ast.data.typeArguments = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } } export interface NodeWithTypeArguments extends TypeNode { @@ -2243,92 +3813,200 @@ export interface NodeWithTypeArguments extends TypeNode { export type TypeReferenceType = TypeReferenceNode | ExpressionWithTypeArguments; -export interface TypeReferenceNode extends NodeWithTypeArguments { - readonly kind: SyntaxKind.TypeReference; - readonly typeName: EntityName; +// dprint-ignore +export class TypeReferenceNode extends Node implements NodeWithTypeArguments { + declare _typeNodeBrand: any; + declare readonly ast: AstTypeReferenceNode; + + get typeName(): Identifier | QualifiedName { return this.ast.data.typeName.node; } + get typeArguments(): NodeArray | undefined { return this.ast.data.typeArguments?.nodes; } + + /** @internal */ set typeName(value) { this.ast.data.typeName = value.ast; } + /** @internal */ set typeArguments(value) { this.ast.data.typeArguments = value?.ast; } } -export interface TypePredicateNode extends TypeNode { - readonly kind: SyntaxKind.TypePredicate; - readonly parent: SignatureDeclaration | JSDocTypeExpression; - readonly assertsModifier?: AssertsKeyword | undefined; - readonly parameterName: Identifier | ThisTypeNode; - readonly type?: TypeNode | undefined; +// dprint-ignore +export class TypePredicateNode extends Node implements TypeNode { + declare _typeNodeBrand: any; + declare readonly ast: AstTypePredicateNode; + + override get parent() { return super.parent as SignatureDeclaration | JSDocTypeExpression; } + + get assertsModifier(): AssertsKeyword | undefined { return this.ast.data.assertsModifier?.node; } + get parameterName(): Identifier | ThisTypeNode { return this.ast.data.parameterName.node; } + get type(): TypeNode | undefined { return this.ast.data.type?.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set assertsModifier(value) { this.ast.data.assertsModifier = value?.ast; } + /** @internal */ set parameterName(value) { this.ast.data.parameterName = value.ast; } + /** @internal */ set type(value) { this.ast.data.type = value?.ast; } } -export interface TypeQueryNode extends NodeWithTypeArguments { - readonly kind: SyntaxKind.TypeQuery; - readonly exprName: EntityName; +// dprint-ignore +export class TypeQueryNode extends Node implements NodeWithTypeArguments { + declare _typeNodeBrand: any; + declare readonly ast: AstTypeQueryNode; + + get exprName(): Identifier | QualifiedName { return this.ast.data.exprName.node; } + get typeArguments(): NodeArray | undefined { return this.ast.data.typeArguments?.nodes; } + + /** @internal */ set exprName(value) { this.ast.data.exprName = value.ast; } + /** @internal */ set typeArguments(value) { this.ast.data.typeArguments = value?.ast; } } // A TypeLiteral is the declaration node for an anonymous symbol. -export interface TypeLiteralNode extends TypeNode, Declaration { - readonly kind: SyntaxKind.TypeLiteral; - readonly members: NodeArray; +// dprint-ignore +export class TypeLiteralNode extends Node implements TypeNode, Declaration { + declare _typeNodeBrand: any; + declare _declarationBrand: any; + declare readonly ast: AstTypeLiteralNode; + + get members(): NodeArray { return this.ast.data.members.nodes; } + + /** @internal */ set members(value) { this.ast.data.members = value.ast; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } -export interface ArrayTypeNode extends TypeNode { - readonly kind: SyntaxKind.ArrayType; - readonly elementType: TypeNode; +// dprint-ignore +export class ArrayTypeNode extends Node implements TypeNode { + declare _typeNodeBrand: any; + declare readonly ast: AstArrayTypeNode; + + get elementType(): TypeNode { return this.ast.data.elementType.node; } + + /** @internal */ set elementType(value) { this.ast.data.elementType = value.ast; } } -export interface TupleTypeNode extends TypeNode { - readonly kind: SyntaxKind.TupleType; - readonly elements: NodeArray; +// dprint-ignore +export class TupleTypeNode extends Node implements TypeNode { + declare _typeNodeBrand: any; + declare readonly ast: AstTupleTypeNode; + + get elements(): NodeArray { return this.ast.data.elements.nodes; } + + /** @internal */ set elements(value: NodeArray) { this.ast.data.elements = value.ast; } } -export interface NamedTupleMember extends TypeNode, Declaration, JSDocContainer { - readonly kind: SyntaxKind.NamedTupleMember; - readonly dotDotDotToken?: DotDotDotToken | undefined; - readonly name: Identifier; - readonly questionToken?: QuestionToken | undefined; - readonly type: TypeNode; +// dprint-ignore +export class NamedTupleMember extends Node implements TypeNode, Declaration, JSDocContainer { + declare _typeNodeBrand: any; + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare readonly ast: AstNamedTupleMember; + + get dotDotDotToken(): DotDotDotToken | undefined { return this.ast.data.dotDotDotToken?.node; } + get name(): Identifier { return this.ast.data.name.node; } + get questionToken(): QuestionToken | undefined { return this.ast.data.questionToken?.node; } + get type(): TypeNode { return this.ast.data.type.node; } + + /** @internal */ set dotDotDotToken(value) { this.ast.data.dotDotDotToken = value?.ast; } + /** @internal */ set name(value) { this.ast.data.name = value.ast; } + /** @internal */ set questionToken(value) { this.ast.data.questionToken = value?.ast; } + /** @internal */ set type(value) { this.ast.data.type = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } -export interface OptionalTypeNode extends TypeNode { - readonly kind: SyntaxKind.OptionalType; - readonly type: TypeNode; +// dprint-ignore +export class OptionalTypeNode extends Node implements TypeNode { + declare _typeNodeBrand: any; + declare readonly ast: AstOptionalTypeNode; + + get type(): TypeNode { return this.ast.data.type.node; } + + /** @internal */ set type(value) { this.ast.data.type = value.ast; } } -export interface RestTypeNode extends TypeNode { - readonly kind: SyntaxKind.RestType; - readonly type: TypeNode; +// dprint-ignore +export class RestTypeNode extends Node implements TypeNode { + declare _typeNodeBrand: any; + declare readonly ast: AstRestTypeNode; + + get type(): TypeNode { return this.ast.data.type.node; } + + /** @internal */ set type(value) { this.ast.data.type = value.ast; } } export type UnionOrIntersectionTypeNode = UnionTypeNode | IntersectionTypeNode; -export interface UnionTypeNode extends TypeNode { - readonly kind: SyntaxKind.UnionType; - readonly types: NodeArray; +// dprint-ignore +export class UnionTypeNode extends Node implements TypeNode { + declare _typeNodeBrand: any; + declare readonly ast: AstUnionTypeNode; + + get types(): NodeArray { return this.ast.data.types.nodes; } + + /** @internal */ set types(value) { this.ast.data.types = value.ast; } } -export interface IntersectionTypeNode extends TypeNode { - readonly kind: SyntaxKind.IntersectionType; - readonly types: NodeArray; +// dprint-ignore +export class IntersectionTypeNode extends Node implements TypeNode { + declare _typeNodeBrand: any; + declare readonly ast: AstIntersectionTypeNode; + + get types(): NodeArray { return this.ast.data.types.nodes; } + + /** @internal */ set types(value) { this.ast.data.types = value.ast; } } -export interface ConditionalTypeNode extends TypeNode, LocalsContainer { - readonly kind: SyntaxKind.ConditionalType; - readonly checkType: TypeNode; - readonly extendsType: TypeNode; - readonly trueType: TypeNode; - readonly falseType: TypeNode; +// dprint-ignore +export class ConditionalTypeNode extends Node implements TypeNode, LocalsContainer { + declare _typeNodeBrand: any; + declare _localsContainerBrand: any; + declare readonly ast: AstConditionalTypeNode; + + get checkType(): TypeNode { return this.ast.data.checkType.node; } + get extendsType(): TypeNode { return this.ast.data.extendsType.node; } + get trueType(): TypeNode { return this.ast.data.trueType.node; } + get falseType(): TypeNode { return this.ast.data.falseType.node; } + + /** @internal */ set checkType(value) { this.ast.data.checkType = value.ast; } + /** @internal */ set extendsType(value) { this.ast.data.extendsType = value.ast; } + /** @internal */ set trueType(value) { this.ast.data.trueType = value.ast; } + /** @internal */ set falseType(value) { this.ast.data.falseType = value.ast; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } } -export interface InferTypeNode extends TypeNode { - readonly kind: SyntaxKind.InferType; - readonly typeParameter: TypeParameterDeclaration; +// dprint-ignore +export class InferTypeNode extends Node implements TypeNode { + declare _typeNodeBrand: any; + declare readonly ast: AstInferTypeNode; + + get typeParameter(): TypeParameterDeclaration { return this.ast.data.typeParameter.node; } + + /** @internal */ set typeParameter(value) { this.ast.data.typeParameter = value.ast; } } -export interface ParenthesizedTypeNode extends TypeNode { - readonly kind: SyntaxKind.ParenthesizedType; - readonly type: TypeNode; +// dprint-ignore +export class ParenthesizedTypeNode extends Node implements TypeNode { + declare _typeNodeBrand: any; + declare readonly ast: AstParenthesizedTypeNode; + + get type(): TypeNode { return this.ast.data.type.node; } + + /** @internal */ set type(value) { this.ast.data.type = value.ast; } } -export interface TypeOperatorNode extends TypeNode { - readonly kind: SyntaxKind.TypeOperator; - readonly operator: SyntaxKind.KeyOfKeyword | SyntaxKind.UniqueKeyword | SyntaxKind.ReadonlyKeyword; - readonly type: TypeNode; +// dprint-ignore +export class TypeOperatorNode extends Node implements TypeNode { + declare _typeNodeBrand: any; + declare readonly ast: AstTypeOperatorNode; + + get operator(): SyntaxKind.KeyOfKeyword | SyntaxKind.ReadonlyKeyword | SyntaxKind.UniqueKeyword { return this.ast.data.operator; } + get type(): TypeNode { return this.ast.data.type.node; } + + /** @internal */ set operator(value) { this.ast.data.operator = value; } + /** @internal */ set type(value) { this.ast.data.type = value.ast; } } /** @internal @knipignore */ @@ -2336,54 +4014,120 @@ export interface UniqueTypeOperatorNode extends TypeOperatorNode { readonly operator: SyntaxKind.UniqueKeyword; } -export interface IndexedAccessTypeNode extends TypeNode { - readonly kind: SyntaxKind.IndexedAccessType; - readonly objectType: TypeNode; - readonly indexType: TypeNode; +// dprint-ignore +export class IndexedAccessTypeNode extends Node implements TypeNode { + declare _typeNodeBrand: any; + declare readonly ast: AstIndexedAccessTypeNode; + + get objectType(): TypeNode { return this.ast.data.objectType.node; } + get indexType(): TypeNode { return this.ast.data.indexType.node; } + + /** @internal */ set objectType(value) { this.ast.data.objectType = value.ast; } + /** @internal */ set indexType(value) { this.ast.data.indexType = value.ast; } } -export interface MappedTypeNode extends TypeNode, Declaration, LocalsContainer { - readonly kind: SyntaxKind.MappedType; - readonly readonlyToken?: ReadonlyKeyword | PlusToken | MinusToken | undefined; - readonly typeParameter: TypeParameterDeclaration; - readonly nameType?: TypeNode | undefined; - readonly questionToken?: QuestionToken | PlusToken | MinusToken | undefined; - readonly type?: TypeNode | undefined; - /** Used only to produce grammar errors */ - readonly members?: NodeArray | undefined; +// dprint-ignore +export class MappedTypeNode extends Node implements TypeNode, Declaration, LocalsContainer { + declare _typeNodeBrand: any; + declare _declarationBrand: any; + declare _localsContainerBrand: any; + declare readonly ast: AstMappedTypeNode; + + get readonlyToken(): PlusToken | MinusToken | ReadonlyKeyword | undefined { return this.ast.data.readonlyToken?.node; } + get typeParameter(): TypeParameterDeclaration { return this.ast.data.typeParameter.node; } + get nameType(): TypeNode | undefined { return this.ast.data.nameType?.node; } + get questionToken(): QuestionToken | PlusToken | MinusToken | undefined { return this.ast.data.questionToken?.node; } + get type(): TypeNode | undefined { return this.ast.data.type?.node; } + get members(): NodeArray | undefined { return this.ast.data.members?.nodes; } + + /** @internal */ set readonlyToken(value) { this.ast.data.readonlyToken = value?.ast; } + /** @internal */ set typeParameter(value) { this.ast.data.typeParameter = value.ast; } + /** @internal */ set nameType(value) { this.ast.data.nameType = value?.ast; } + /** @internal */ set questionToken(value) { this.ast.data.questionToken = value?.ast; } + /** @internal */ set type(value) { this.ast.data.type = value?.ast; } + /** @internal */ set members(value) { this.ast.data.members = value?.ast; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } } -export interface LiteralTypeNode extends TypeNode { - readonly kind: SyntaxKind.LiteralType; - readonly literal: NullLiteral | BooleanLiteral | LiteralExpression | PrefixUnaryExpression; +// dprint-ignore +export class LiteralTypeNode extends Node implements TypeNode { + declare _typeNodeBrand: any; + declare readonly ast: AstLiteralTypeNode; + + get literal(): NullLiteral | TrueLiteral | FalseLiteral | PrefixUnaryExpression | LiteralExpression { return this.ast.data.literal.node; } + + /** @internal */ set literal(value) { this.ast.data.literal = value.ast; } } -export interface StringLiteral extends LiteralExpression, Declaration { - readonly kind: SyntaxKind.StringLiteral; - /** @internal */ - readonly textSourceNode?: Identifier | StringLiteralLike | NumericLiteral | PrivateIdentifier | JsxNamespacedName | BigIntLiteral | undefined; // Allows a StringLiteral to get its text from another node (used by transforms). +// TODO(rbuckton): Move string literal adjacent to tokens and other literals. +// dprint-ignore +export class StringLiteral extends Token implements LiteralExpression, StringLiteralLikeNode, Declaration { + declare _literalExpressionBrand: any; + declare _primaryExpressionBrand: any; + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare _declarationBrand: any; + declare readonly ast: AstStringLiteral; + + get text(): string { return this.ast.data.text; } + get isUnterminated(): boolean { return this.ast.data.isUnterminated; } + get hasExtendedUnicodeEscape(): boolean { return this.ast.data.hasExtendedUnicodeEscape; } + + /** @internal */ set text(value) { this.ast.data.text = value; } /** - * Note: this is only set when synthesizing a node, not during parsing. - * + * NOTE: This is only set when synthesizing a node, not during parsing. * @internal */ - readonly singleQuote?: boolean | undefined; + get singleQuote(): boolean | undefined { return this.ast.data.singleQuote; } + /** @internal */ set singleQuote(value) { this.ast.data.singleQuote = value; } + /** @internal */ set isUnterminated(value) { this.ast.data.isUnterminated = value; } + /** @internal */ set hasExtendedUnicodeEscape(value) { this.ast.data.hasExtendedUnicodeEscape = value; } + /** @internal */ get textSourceNode(): Identifier | PrivateIdentifier | NumericLiteral | BigIntLiteral | JsxNamespacedName | StringLiteralLike | undefined { return this.ast.data.textSourceNode?.node; } + /** @internal */ set textSourceNode(value) { this.ast.data.textSourceNode = value?.ast; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } export type StringLiteralLike = StringLiteral | NoSubstitutionTemplateLiteral; export type PropertyNameLiteral = Identifier | StringLiteralLike | NumericLiteral | JsxNamespacedName | BigIntLiteral; -export interface TemplateLiteralTypeNode extends TypeNode { - readonly kind: SyntaxKind.TemplateLiteralType; - readonly head: TemplateHead; - readonly templateSpans: NodeArray; +// dprint-ignore +export class TemplateLiteralTypeNode extends Node implements TypeNode { + declare _typeNodeBrand: any; + declare readonly ast: AstTemplateLiteralTypeNode; + + get head(): TemplateHead { return this.ast.data.head.node; } + get templateSpans(): NodeArray { return this.ast.data.templateSpans.nodes; } + + /** @internal */ set head(value) { this.ast.data.head = value.ast; } + /** @internal */ set templateSpans(value) { this.ast.data.templateSpans = value.ast; } } -export interface TemplateLiteralTypeSpan extends TypeNode { - readonly kind: SyntaxKind.TemplateLiteralTypeSpan; - readonly parent: TemplateLiteralTypeNode; - readonly type: TypeNode; - readonly literal: TemplateMiddle | TemplateTail; +// dprint-ignore +export class TemplateLiteralTypeSpan extends Node { + declare _typeNodeBrand: any; + declare readonly ast: AstTemplateLiteralTypeSpan; + + override get parent() { return super.parent as TemplateLiteralTypeNode; } + + get type(): TypeNode { return this.ast.data.type.node; } + get literal(): TemplateMiddle | TemplateTail { return this.ast.data.literal.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set type(value) { this.ast.data.type = value.ast; } + /** @internal */ set literal(value) { this.ast.data.literal = value.ast; } } // Note: 'brands' in our syntax nodes serve to give us a small amount of nominal typing. @@ -2395,27 +4139,41 @@ export interface TemplateLiteralTypeSpan extends TypeNode { export interface Expression extends Node { _expressionBrand: any; + readonly ast: AstExpression; } -export interface OmittedExpression extends Expression { - readonly kind: SyntaxKind.OmittedExpression; +// dprint-ignore +export class OmittedExpression extends Node implements Expression { + declare _expressionBrand: any; + declare readonly ast: AstOmittedExpression; } // Represents an expression that is elided as part of a transformation to emit comments on a // not-emitted node. The 'expression' property of a PartiallyEmittedExpression should be emitted. -export interface PartiallyEmittedExpression extends LeftHandSideExpression { - readonly kind: SyntaxKind.PartiallyEmittedExpression; - readonly expression: Expression; +// dprint-ignore +export class PartiallyEmittedExpression extends Node implements LeftHandSideExpression { + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare readonly ast: AstPartiallyEmittedExpression; + + get expression(): Expression { return this.ast.data.expression.node; } + + /** @internal */ set expression(value: Expression) { this.ast.data.expression = value.ast; } } export interface UnaryExpression extends Expression { _unaryExpressionBrand: any; + readonly ast: AstUnaryExpression; } -/** Deprecated, please use UpdateExpression */ +/** @deprecated use UpdateExpression instead */ export type IncrementExpression = UpdateExpression; + export interface UpdateExpression extends UnaryExpression { _updateExpressionBrand: any; + readonly ast: AstUpdateExpression; } // see: https://tc39.github.io/ecma262/#prod-UpdateExpression @@ -2428,10 +4186,18 @@ export type PrefixUnaryOperator = | SyntaxKind.TildeToken | SyntaxKind.ExclamationToken; -export interface PrefixUnaryExpression extends UpdateExpression { - readonly kind: SyntaxKind.PrefixUnaryExpression; - readonly operator: PrefixUnaryOperator; - readonly operand: UnaryExpression; +// dprint-ignore +export class PrefixUnaryExpression extends Node implements UpdateExpression { + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare readonly ast: AstPrefixUnaryExpression; + + get operator(): PrefixUnaryOperator { return this.ast.data.operator; } + get operand(): UnaryExpression { return this.ast.data.operand.node; } + + /** @internal */ set operator(value) { this.ast.data.operator = value; } + /** @internal */ set operand(value) { this.ast.data.operand = value.ast; } } // see: https://tc39.github.io/ecma262/#prod-UpdateExpression @@ -2439,81 +4205,182 @@ export type PostfixUnaryOperator = | SyntaxKind.PlusPlusToken | SyntaxKind.MinusMinusToken; -export interface PostfixUnaryExpression extends UpdateExpression { - readonly kind: SyntaxKind.PostfixUnaryExpression; - readonly operand: LeftHandSideExpression; - readonly operator: PostfixUnaryOperator; +// dprint-ignore +export class PostfixUnaryExpression extends Node implements UpdateExpression { + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare readonly ast: AstPostfixUnaryExpression; + + get operand(): LeftHandSideExpression { return this.ast.data.operand.node; } + get operator(): PostfixUnaryOperator { return this.ast.data.operator; } + + /** @internal */ set operand(value) { this.ast.data.operand = value.ast; } + /** @internal */ set operator(value) { this.ast.data.operator = value; } } export interface LeftHandSideExpression extends UpdateExpression { _leftHandSideExpressionBrand: any; + readonly ast: AstLeftHandSideExpression; } export interface MemberExpression extends LeftHandSideExpression { _memberExpressionBrand: any; + readonly ast: AstMemberExpression; } export interface PrimaryExpression extends MemberExpression { _primaryExpressionBrand: any; + readonly ast: AstPrimaryExpression; } -export interface NullLiteral extends PrimaryExpression { - readonly kind: SyntaxKind.NullKeyword; +// TODO(rbuckton): Move literal token nodes adjacent to other tokens and literals. +// dprint-ignore +export class NullLiteral extends Token implements KeywordExpression { + declare _primaryExpressionBrand: any; + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare readonly ast: AstNullLiteral; } -export interface TrueLiteral extends PrimaryExpression { - readonly kind: SyntaxKind.TrueKeyword; +// TODO(rbuckton): Move literal token nodes adjacent to other tokens and literals. +// dprint-ignore +export class TrueLiteral extends Token implements KeywordExpression { + declare _primaryExpressionBrand: any; + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare readonly ast: AstTrueLiteral; } -export interface FalseLiteral extends PrimaryExpression { - readonly kind: SyntaxKind.FalseKeyword; +// TODO(rbuckton): Move literal token nodes adjacent to other tokens and literals. +// dprint-ignore +export class FalseLiteral extends Token implements KeywordExpression { + declare _primaryExpressionBrand: any; + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare readonly ast: AstFalseLiteral; } export type BooleanLiteral = TrueLiteral | FalseLiteral; -export interface ThisExpression extends PrimaryExpression, FlowContainer { - readonly kind: SyntaxKind.ThisKeyword; +// dprint-ignore +export class ThisExpression extends Token implements KeywordExpression, FlowContainer { + declare _primaryExpressionBrand: any; + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstThisExpression; + + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value: FlowNode | undefined) { this.ast.data.flowNode = value; } } -export interface SuperExpression extends PrimaryExpression, FlowContainer { - readonly kind: SyntaxKind.SuperKeyword; +// dprint-ignore +export class SuperExpression extends Token implements KeywordExpression, FlowContainer { + declare _primaryExpressionBrand: any; + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstSuperExpression; + + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value: FlowNode | undefined) { this.ast.data.flowNode = value; } } -export interface ImportExpression extends PrimaryExpression { - readonly kind: SyntaxKind.ImportKeyword; +// dprint-ignore +export class ImportExpression extends Token implements KeywordExpression { + declare _primaryExpressionBrand: any; + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare readonly ast: AstImportExpression; } -export interface DeleteExpression extends UnaryExpression { - readonly kind: SyntaxKind.DeleteExpression; - readonly expression: UnaryExpression; +// dprint-ignore +export class DeleteExpression extends Node implements UnaryExpression { + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare readonly ast: AstDeleteExpression; + + get expression(): UnaryExpression { return this.ast.data.expression.node; } + + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } } -export interface TypeOfExpression extends UnaryExpression { - readonly kind: SyntaxKind.TypeOfExpression; - readonly expression: UnaryExpression; +// dprint-ignore +export class TypeOfExpression extends Node implements UnaryExpression { + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare readonly ast: AstTypeOfExpression; + + get expression(): UnaryExpression { return this.ast.data.expression.node; } + + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } } -export interface VoidExpression extends UnaryExpression { - readonly kind: SyntaxKind.VoidExpression; - readonly expression: UnaryExpression; +// dprint-ignore +export class VoidExpression extends Node implements UnaryExpression { + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare readonly ast: AstVoidExpression; + + get expression(): UnaryExpression { return this.ast.data.expression.node; } + + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } } -export interface AwaitExpression extends UnaryExpression { - readonly kind: SyntaxKind.AwaitExpression; - readonly expression: UnaryExpression; +// dprint-ignore +export class AwaitExpression extends Node implements UnaryExpression { + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare readonly ast: AstAwaitExpression; + + get expression(): UnaryExpression { return this.ast.data.expression.node; } + + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } } -export interface YieldExpression extends Expression { - readonly kind: SyntaxKind.YieldExpression; - readonly asteriskToken?: AsteriskToken | undefined; - readonly expression?: Expression | undefined; +// dprint-ignore +export class YieldExpression extends Node implements Expression { + declare _expressionBrand: any; + declare readonly ast: AstYieldExpression; + + get asteriskToken(): AsteriskToken | undefined { return this.ast.data.asteriskToken?.node; } + get expression(): Expression | undefined { return this.ast.data.expression?.node; } + + /** @internal */ set asteriskToken(value) { this.ast.data.asteriskToken = value?.ast; } + /** @internal */ set expression(value) { this.ast.data.expression = value?.ast; } } -export interface SyntheticExpression extends Expression { - readonly kind: SyntaxKind.SyntheticExpression; - readonly isSpread: boolean; - readonly type: Type; - readonly tupleNameSource?: ParameterDeclaration | NamedTupleMember | undefined; +// dprint-ignore +export class SyntheticExpression extends Node implements Expression { + declare _expressionBrand: any; + declare readonly ast: AstSyntheticExpression; + + get isSpread(): boolean { return this.ast.data.isSpread; } + get type(): Type { return this.ast.data.type; } + get tupleNameSource(): ParameterDeclaration | NamedTupleMember | undefined { return this.ast.data.tupleNameSource?.node; } + + /** @internal */ set isSpread(value: boolean) { this.ast.data.isSpread = value; } + /** @internal */ set type(value: Type) { this.ast.data.type = value; } + /** @internal */ set tupleNameSource(value: ParameterDeclaration | NamedTupleMember | undefined) { this.ast.data.tupleNameSource = value?.ast; } } // see: https://tc39.github.io/ecma262/#prod-ExponentiationExpression @@ -2645,11 +4512,26 @@ export type LogicalOrCoalescingAssignmentOperator = export type BinaryOperatorToken = Token; -export interface BinaryExpression extends Expression, Declaration, JSDocContainer { - readonly kind: SyntaxKind.BinaryExpression; - readonly left: Expression; - readonly operatorToken: BinaryOperatorToken; - readonly right: Expression; +// dprint-ignore +export class BinaryExpression extends Node implements Expression, Declaration, JSDocContainer { + declare _expressionBrand: any; + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare readonly ast: AstBinaryExpression; + + get left(): Expression { return this.ast.data.left.node; } + get operatorToken(): BinaryOperatorToken { return this.ast.data.operatorToken.node; } + get right(): Expression { return this.ast.data.right.node; } + + /** @internal */ set left(value) { this.ast.data.left = value.ast; } + /** @internal */ set operatorToken(value) { this.ast.data.operatorToken = value.ast; } + /** @internal */ set right(value) { this.ast.data.right = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } export type AssignmentOperatorToken = Token; @@ -2732,59 +4614,195 @@ export type AssignmentPattern = ObjectLiteralExpression | ArrayLiteralExpression export type BindingOrAssignmentPattern = ObjectBindingOrAssignmentPattern | ArrayBindingOrAssignmentPattern; -export interface ConditionalExpression extends Expression { - readonly kind: SyntaxKind.ConditionalExpression; - readonly condition: Expression; - readonly questionToken: QuestionToken; - readonly whenTrue: Expression; - readonly colonToken: ColonToken; - readonly whenFalse: Expression; +export interface InstanceofExpression extends BinaryExpression { + readonly operatorToken: Token; +} + +// dprint-ignore +export class ConditionalExpression extends Node implements Expression { + declare _expressionBrand: any; + declare readonly ast: AstConditionalExpression; + + get condition(): Expression { return this.ast.data.condition.node; } + get questionToken(): QuestionToken { return this.ast.data.questionToken.node; } + get whenTrue(): Expression { return this.ast.data.whenTrue.node; } + get colonToken(): ColonToken { return this.ast.data.colonToken.node; } + get whenFalse(): Expression { return this.ast.data.whenFalse.node; } + + /** @internal */ set condition(value) { this.ast.data.condition = value.ast; } + /** @internal */ set questionToken(value) { this.ast.data.questionToken = value.ast; } + /** @internal */ set whenTrue(value) { this.ast.data.whenTrue = value.ast; } + /** @internal */ set colonToken(value) { this.ast.data.colonToken = value.ast; } + /** @internal */ set whenFalse(value) { this.ast.data.whenFalse = value.ast; } } export type FunctionBody = Block; export type ConciseBody = FunctionBody | Expression; -export interface FunctionExpression extends PrimaryExpression, FunctionLikeDeclarationBase, JSDocContainer, LocalsContainer, FlowContainer { - readonly kind: SyntaxKind.FunctionExpression; - readonly modifiers?: NodeArray | undefined; - readonly name?: Identifier | undefined; - readonly body: FunctionBody; // Required, whereas the member inherited from FunctionDeclaration is optional +// dprint-ignore +export class FunctionExpression extends Node implements PrimaryExpression, FunctionLikeDeclarationBase, JSDocContainer, LocalsContainer, FlowContainer { + declare _primaryExpressionBrand: any; + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare _functionLikeDeclarationBrand: any; + declare _signatureDeclarationBrand: any; + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare _localsContainerBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstFunctionExpression; + + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + get asteriskToken(): AsteriskToken | undefined { return this.ast.data.asteriskToken?.node; } + get name(): Identifier | undefined { return this.ast.data.name?.node; } + get typeParameters(): NodeArray | undefined { return this.ast.data.typeParameters?.nodes; } + get parameters(): NodeArray { return this.ast.data.parameters.nodes; } + get type(): TypeNode | undefined { return this.ast.data.type?.node; } + get body(): Block { return this.ast.data.body.node; } + + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set asteriskToken(value) { this.ast.data.asteriskToken = value?.ast; } + /** @internal */ set name(value) { this.ast.data.name = value?.ast; } + /** @internal */ set typeParameters(value) { this.ast.data.typeParameters = value?.ast; } + /** @internal */ get typeArguments(): NodeArray | undefined { return this.ast.data.typeArguments?.nodes; } + /** @internal */ set typeArguments(value) { this.ast.data.typeArguments = value?.ast; } + /** @internal */ set parameters(value) { this.ast.data.parameters = value.ast; } + /** @internal */ set type(value) { this.ast.data.type = value?.ast; } + /** @internal */ set body(value) { this.ast.data.body = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value: FlowNode | undefined) { this.ast.data.flowNode = value; } + /** @internal */ get endFlowNode(): FlowNode | undefined { return this.ast.data.endFlowNode; } + /** @internal */ set endFlowNode(value) { this.ast.data.endFlowNode = value; } + /** @internal */ get returnFlowNode(): FlowNode | undefined { return this.ast.data.returnFlowNode; } + /** @internal */ set returnFlowNode(value) { this.ast.data.returnFlowNode = value; } } -export interface ArrowFunction extends Expression, FunctionLikeDeclarationBase, JSDocContainer, LocalsContainer, FlowContainer { - readonly kind: SyntaxKind.ArrowFunction; - readonly modifiers?: NodeArray | undefined; - readonly equalsGreaterThanToken: EqualsGreaterThanToken; - readonly body: ConciseBody; - readonly name: never; +// dprint-ignore +export class ArrowFunction extends Node implements Expression, FunctionLikeDeclarationBase, JSDocContainer, LocalsContainer, FlowContainer { + declare _expressionBrand: any; + declare _functionLikeDeclarationBrand: any; + declare _signatureDeclarationBrand: any; + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare _localsContainerBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstArrowFunction; + + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + get equalsGreaterThanToken(): EqualsGreaterThanToken { return this.ast.data.equalsGreaterThanToken.node; } + get typeParameters(): NodeArray | undefined { return this.ast.data.typeParameters?.nodes; } + get parameters(): NodeArray { return this.ast.data.parameters.nodes; } + get type(): TypeNode | undefined { return this.ast.data.type?.node; } + get body(): Block | Expression { return this.ast.data.body.node; } + + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set equalsGreaterThanToken(value) { this.ast.data.equalsGreaterThanToken = value.ast; } + /** @internal */ set typeParameters(value) { this.ast.data.typeParameters = value?.ast; } + /** @internal */ set parameters(value) { this.ast.data.parameters = value.ast; } + /** @internal */ set type(value) { this.ast.data.type = value?.ast; } + /** @internal */ set body(value) { this.ast.data.body = value.ast; } + /** @internal */ get typeArguments(): NodeArray | undefined { return this.ast.data.typeArguments?.nodes; } + /** @internal */ set typeArguments(value) { this.ast.data.typeArguments = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value: FlowNode | undefined) { this.ast.data.flowNode = value; } + /** @internal */ get endFlowNode(): FlowNode | undefined { return this.ast.data.endFlowNode; } + /** @internal */ set endFlowNode(value) { this.ast.data.endFlowNode = value; } + /** @internal */ get returnFlowNode(): FlowNode | undefined { return this.ast.data.returnFlowNode; } + /** @internal */ set returnFlowNode(value) { this.ast.data.returnFlowNode = value; } } +// TODO(rbuckton): Move adjacent to tokens and other literals. // The text property of a LiteralExpression stores the interpreted value of the literal in text form. For a StringLiteral, // or any literal of a template, this means quotes have been removed and escapes have been converted to actual characters. // For a NumericLiteral, the stored value is the toString() representation of the number. For example 1, 1.00, and 1e0 are all stored as just "1". export interface LiteralLikeNode extends Node { - text: string; - isUnterminated?: boolean | undefined; - hasExtendedUnicodeEscape?: boolean | undefined; + readonly ast: AstLiteralLikeNode; + readonly data: AstLiteralLikeNodeData; + + get text(): string; + + /** @internal */ set text(value: string); } -export interface TemplateLiteralLikeNode extends LiteralLikeNode { - rawText?: string | undefined; - /** @internal */ - templateFlags?: TokenFlags | undefined; +// TODO(rbuckton): Move adjacent to tokens and other literals. +export interface StringLiteralLikeNode extends LiteralLikeNode { + readonly ast: AstStringLiteralLikeNode; + readonly data: AstStringLiteralLikeNodeData; + + get isUnterminated(): boolean | undefined; + get hasExtendedUnicodeEscape(): boolean | undefined; + + /** @internal */ set isUnterminated(value: boolean | undefined); + /** @internal */ set hasExtendedUnicodeEscape(value: boolean | undefined); } +// TODO(rbuckton): Move adjacent to tokens and other literals. +export interface TemplateLiteralLikeNode extends StringLiteralLikeNode { + readonly ast: AstTemplateLiteralLikeNode; + readonly data: AstTemplateLiteralLikeNodeData; + + get rawText(): string | undefined; + + /** @internal */ set rawText(value: string | undefined); + /** @internal */ get templateFlags(): TokenFlags | undefined; + /** @internal */ set templateFlags(value: TokenFlags | undefined); +} + +// TODO(rbuckton): Move adjacent to tokens and other literals. // The text property of a LiteralExpression stores the interpreted value of the literal in text form. For a StringLiteral, // or any literal of a template, this means quotes have been removed and escapes have been converted to actual characters. // For a NumericLiteral, the stored value is the toString() representation of the number. For example 1, 1.00, and 1e0 are all stored as just "1". export interface LiteralExpression extends LiteralLikeNode, PrimaryExpression { _literalExpressionBrand: any; + readonly ast: AstLiteralExpression; + readonly data: AstLiteralExpressionData; } -export interface RegularExpressionLiteral extends LiteralExpression { - readonly kind: SyntaxKind.RegularExpressionLiteral; +// TODO(rbuckton): Move adjacent to tokens and other literals. +// dprint-ignore +export class RegularExpressionLiteral extends Token implements StringLiteralLikeNode { + declare _literalExpressionBrand: any; + declare _primaryExpressionBrand: any; + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare readonly ast: AstRegularExpressionLiteral; + + get text(): string { return this.ast.data.text; } + get isUnterminated(): boolean | undefined { return this.ast.data.isUnterminated; } + get hasExtendedUnicodeEscape(): boolean | undefined { return this.ast.data.hasExtendedUnicodeEscape; } + + /** @internal */ set text(value) { this.ast.data.text = value; } + /** @internal */ set isUnterminated(value) { this.ast.data.isUnterminated = value; } + /** @internal */ set hasExtendedUnicodeEscape(value) { this.ast.data.hasExtendedUnicodeEscape = value; } } +// TODO(rbuckton): Move adjacent to tokens and other literals. // dprint-ignore /** @internal */ export const enum RegularExpressionFlags { @@ -2801,12 +4819,37 @@ export const enum RegularExpressionFlags { Modifiers = IgnoreCase | Multiline | DotAll, } -export interface NoSubstitutionTemplateLiteral extends LiteralExpression, TemplateLiteralLikeNode, Declaration { - readonly kind: SyntaxKind.NoSubstitutionTemplateLiteral; - /** @internal */ - templateFlags?: TokenFlags | undefined; +// TODO(rbuckton): Move adjacent to tokens and other literals. +// dprint-ignore +export class NoSubstitutionTemplateLiteral extends Token implements LiteralExpression, TemplateLiteralLikeNode, Declaration { + declare _literalExpressionBrand: any; + declare _primaryExpressionBrand: any; + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare _declarationBrand: any; + declare readonly ast: AstNoSubstitutionTemplateLiteral; + + get text(): string { return this.ast.data.text; } + get rawText(): string | undefined { return this.ast.data.rawText; } + get isUnterminated(): boolean | undefined { return this.ast.data.isUnterminated; } + get hasExtendedUnicodeEscape(): boolean | undefined { return this.ast.data.hasExtendedUnicodeEscape; } + + /** @internal */ set text(value) { this.ast.data.text = value; } + /** @internal */ set rawText(value) { this.ast.data.rawText = value; } + /** @internal */ set isUnterminated(value) { this.ast.data.isUnterminated = value; } + /** @internal */ set hasExtendedUnicodeEscape(value) { this.ast.data.hasExtendedUnicodeEscape = value; } + /** @internal */ get templateFlags(): TokenFlags { return this.ast.data.templateFlags; } + /** @internal */ set templateFlags(value) { this.ast.data.templateFlags = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } +// TODO(rbuckton): Move adjacent to tokens and other literals. // dprint-ignore export const enum TokenFlags { None = 0, @@ -2851,16 +4894,47 @@ export const enum TokenFlags { IsInvalid = Octal | ContainsLeadingZero | ContainsInvalidSeparator | ContainsInvalidEscape, } -export interface NumericLiteral extends LiteralExpression, Declaration { - readonly kind: SyntaxKind.NumericLiteral; - /** @internal */ - readonly numericLiteralFlags: TokenFlags; +// TODO(rbuckton): Move adjacent to tokens and other literals. +// dprint-ignore +export class NumericLiteral extends Token implements LiteralExpression, LiteralLikeNode, Declaration { + declare _literalExpressionBrand: any; + declare _primaryExpressionBrand: any; + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare _declarationBrand: any; + declare readonly ast: AstNumericLiteral; + + get text(): string { return this.ast.data.text; } + + /** @internal */ set text(value) { this.ast.data.text = value; } + /** @internal */ get numericLiteralFlags(): TokenFlags { return this.ast.data.numericLiteralFlags; } + /** @internal */ set numericLiteralFlags(value) { this.ast.data.numericLiteralFlags = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } -export interface BigIntLiteral extends LiteralExpression { - readonly kind: SyntaxKind.BigIntLiteral; +// TODO(rbuckton): Move adjacent to tokens and other literals. +// dprint-ignore +export class BigIntLiteral extends Token implements LiteralExpression, LiteralLikeNode { + declare _literalExpressionBrand: any; + declare _primaryExpressionBrand: any; + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare readonly ast: AstBigIntLiteral; + + get text(): string { return this.ast.data.text; } + /** @internal */ set text(value) { this.ast.data.text = value; } } +// TODO(rbuckton): Move adjacent to tokens and other literals. export type LiteralToken = | NumericLiteral | BigIntLiteral @@ -2869,40 +4943,95 @@ export type LiteralToken = | RegularExpressionLiteral | NoSubstitutionTemplateLiteral; -export interface TemplateHead extends TemplateLiteralLikeNode { - readonly kind: SyntaxKind.TemplateHead; - readonly parent: TemplateExpression | TemplateLiteralTypeNode; - /** @internal */ - templateFlags?: TokenFlags | undefined; +// TODO(rbuckton): Move adjacent to tokens and other literals. +// dprint-ignore +export class TemplateHead extends Token implements TemplateLiteralLikeNode { + declare readonly ast: AstTemplateHead; + + override get parent() { return super.parent as TemplateExpression | TemplateLiteralTypeNode; } + + get text(): string { return this.ast.data.text; } + get isUnterminated(): boolean | undefined { return this.ast.data.isUnterminated; } + get hasExtendedUnicodeEscape(): boolean | undefined { return this.ast.data.hasExtendedUnicodeEscape; } + get rawText(): string | undefined { return this.ast.data.rawText; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set text(value) { this.ast.data.text = value; } + /** @internal */ set isUnterminated(value) { this.ast.data.isUnterminated = value; } + /** @internal */ set hasExtendedUnicodeEscape(value) { this.ast.data.hasExtendedUnicodeEscape = value; } + /** @internal */ set rawText(value) { this.ast.data.rawText = value; } + /** @internal */ get templateFlags(): TokenFlags { return this.ast.data.templateFlags; } + /** @internal */ set templateFlags(value) { this.ast.data.templateFlags = value; } } -export interface TemplateMiddle extends TemplateLiteralLikeNode { - readonly kind: SyntaxKind.TemplateMiddle; - readonly parent: TemplateSpan | TemplateLiteralTypeSpan; - /** @internal */ - templateFlags?: TokenFlags | undefined; +// TODO(rbuckton): Move adjacent to tokens and other literals. +// dprint-ignore +export class TemplateMiddle extends Token implements TemplateLiteralLikeNode { + declare readonly ast: AstTemplateMiddle; + + override get parent() { return super.parent as TemplateSpan | TemplateLiteralTypeSpan; } + + get text(): string { return this.ast.data.text; } + get isUnterminated(): boolean | undefined { return this.ast.data.isUnterminated; } + get hasExtendedUnicodeEscape(): boolean | undefined { return this.ast.data.hasExtendedUnicodeEscape; } + get rawText(): string | undefined { return this.ast.data.rawText; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set text(value) { this.ast.data.text = value; } + /** @internal */ set isUnterminated(value) { this.ast.data.isUnterminated = value; } + /** @internal */ set hasExtendedUnicodeEscape(value) { this.ast.data.hasExtendedUnicodeEscape = value; } + /** @internal */ set rawText(value) { this.ast.data.rawText = value; } + /** @internal */ get templateFlags(): TokenFlags { return this.ast.data.templateFlags; } + /** @internal */ set templateFlags(value) { this.ast.data.templateFlags = value; } } -export interface TemplateTail extends TemplateLiteralLikeNode { - readonly kind: SyntaxKind.TemplateTail; - readonly parent: TemplateSpan | TemplateLiteralTypeSpan; - /** @internal */ - templateFlags?: TokenFlags | undefined; +// TODO(rbuckton): Move adjacent to tokens and other literals. +// dprint-ignore +export class TemplateTail extends Token implements TemplateLiteralLikeNode { + declare readonly ast: AstTemplateTail; + + override get parent() { return super.parent as TemplateSpan | TemplateLiteralTypeSpan; } + + get text(): string { return this.ast.data.text; } + get isUnterminated(): boolean | undefined { return this.ast.data.isUnterminated; } + get hasExtendedUnicodeEscape(): boolean | undefined { return this.ast.data.hasExtendedUnicodeEscape; } + get rawText(): string | undefined { return this.ast.data.rawText; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set text(value) { this.ast.data.text = value; } + /** @internal */ set isUnterminated(value) { this.ast.data.isUnterminated = value; } + /** @internal */ set hasExtendedUnicodeEscape(value) { this.ast.data.hasExtendedUnicodeEscape = value; } + /** @internal */ set rawText(value) { this.ast.data.rawText = value; } + /** @internal */ get templateFlags(): TokenFlags { return this.ast.data.templateFlags; } + /** @internal */ set templateFlags(value) { this.ast.data.templateFlags = value; } } +// TODO(rbuckton): Move adjacent to tokens and other literals. export type PseudoLiteralToken = | TemplateHead | TemplateMiddle | TemplateTail; +// TODO(rbuckton): Move adjacent to tokens and other literals. export type TemplateLiteralToken = | NoSubstitutionTemplateLiteral | PseudoLiteralToken; -export interface TemplateExpression extends PrimaryExpression { - readonly kind: SyntaxKind.TemplateExpression; - readonly head: TemplateHead; - readonly templateSpans: NodeArray; +// dprint-ignore +export class TemplateExpression extends Node implements PrimaryExpression { + declare _primaryExpressionBrand: any; + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare readonly ast: AstTemplateExpression; + + get head(): TemplateHead { return this.ast.data.head.node; } + get templateSpans(): NodeArray { return this.ast.data.templateSpans.nodes; } + + /** @internal */ set head(value) { this.ast.data.head = value.ast; } + /** @internal */ set templateSpans(value) { this.ast.data.templateSpans = value.ast; } } export type TemplateLiteral = @@ -2911,16 +5040,36 @@ export type TemplateLiteral = // Each of these corresponds to a substitution expression and a template literal, in that order. // The template literal must have kind TemplateMiddleLiteral or TemplateTailLiteral. -export interface TemplateSpan extends Node { - readonly kind: SyntaxKind.TemplateSpan; - readonly parent: TemplateExpression; - readonly expression: Expression; - readonly literal: TemplateMiddle | TemplateTail; +// dprint-ignore +export class TemplateSpan extends Node { + declare readonly ast: AstTemplateSpan; + + override get parent() { return super.parent as TemplateExpression; } + + get expression(): Expression { return this.ast.data.expression.node; } + get literal(): TemplateMiddle | TemplateTail { return this.ast.data.literal.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } + /** @internal */ set literal(value) { this.ast.data.literal = value.ast; } } -export interface ParenthesizedExpression extends PrimaryExpression, JSDocContainer { - readonly kind: SyntaxKind.ParenthesizedExpression; - readonly expression: Expression; +// dprint-ignore +export class ParenthesizedExpression extends Node implements PrimaryExpression, JSDocContainer { + declare _primaryExpressionBrand: any; + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare _jsdocContainerBrand: any; + declare readonly ast: AstParenthesizedExpression; + + get expression(): Expression { return this.ast.data.expression.node; } + + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } } /** @internal */ @@ -2928,19 +5077,37 @@ export interface JSDocTypeAssertion extends ParenthesizedExpression { readonly _jsDocTypeAssertionBrand: never; } -export interface ArrayLiteralExpression extends PrimaryExpression { - readonly kind: SyntaxKind.ArrayLiteralExpression; - readonly elements: NodeArray; - /** @internal */ - multiLine?: boolean | undefined; +// dprint-ignore +export class ArrayLiteralExpression extends Node implements PrimaryExpression { + declare _primaryExpressionBrand: any; + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare readonly ast: AstArrayLiteralExpression; + + get elements(): NodeArray { return this.ast.data.elements.nodes; } + + /** @internal */ set elements(value: NodeArray) { this.ast.data.elements = value.ast; } + /** @internal */ get multiLine(): boolean | undefined { return this.ast.data.multiLine; } + /** @internal */ set multiLine(value) { this.ast.data.multiLine = value; } } -export interface SpreadElement extends Expression { - readonly kind: SyntaxKind.SpreadElement; - readonly parent: ArrayLiteralExpression | CallExpression | NewExpression; - readonly expression: Expression; +// dprint-ignore +export class SpreadElement extends Node implements Expression { + declare _expressionBrand: any; + declare readonly ast: AstSpreadElement; + + override get parent() { return super.parent as ArrayLiteralExpression | CallExpression | NewExpression; } + + get expression(): Expression { return this.ast.data.expression.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } } +// TODO(rbuckton): Is this still needed? /** * This interface is a base interface for ObjectLiteralExpression and JSXAttributes to extend from. JSXAttributes is similar to * ObjectLiteralExpression in that it contains array of properties; however, JSXAttributes' properties can only be @@ -2948,25 +5115,67 @@ export interface SpreadElement extends Expression { * ObjectLiteralElement (e.g. PropertyAssignment, ShorthandPropertyAssignment etc.) */ export interface ObjectLiteralExpressionBase extends PrimaryExpression, Declaration { + readonly ast: AstNode; readonly properties: NodeArray; } // An ObjectLiteralExpression is the declaration node for an anonymous symbol. -export interface ObjectLiteralExpression extends ObjectLiteralExpressionBase, JSDocContainer { - readonly kind: SyntaxKind.ObjectLiteralExpression; - /** @internal */ - multiLine?: boolean | undefined; +// dprint-ignore +export class ObjectLiteralExpression extends Node implements ObjectLiteralExpressionBase, JSDocContainer { + declare _primaryExpressionBrand: any; + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare readonly ast: AstObjectLiteralExpression; + + get properties(): NodeArray { return this.ast.data.properties.nodes; } + + /** @internal */ set properties(value) { this.ast.data.properties = value.ast; } + /** @internal */ get multiLine(): boolean | undefined { return this.ast.data.multiLine; } + /** @internal */ set multiLine(value) { this.ast.data.multiLine = value; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } export type EntityNameExpression = Identifier | PropertyAccessEntityNameExpression; export type EntityNameOrEntityNameExpression = EntityName | EntityNameExpression; export type AccessExpression = PropertyAccessExpression | ElementAccessExpression; -export interface PropertyAccessExpression extends MemberExpression, NamedDeclaration, JSDocContainer, FlowContainer { - readonly kind: SyntaxKind.PropertyAccessExpression; - readonly expression: LeftHandSideExpression; - readonly questionDotToken?: QuestionDotToken | undefined; - readonly name: MemberName; +// dprint-ignore +export class PropertyAccessExpression extends Node implements MemberExpression, NamedDeclaration, JSDocContainer, FlowContainer { + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstPropertyAccessExpression; + + get expression(): LeftHandSideExpression { return this.ast.data.expression.node; } + get questionDotToken(): QuestionDotToken | undefined { return this.ast.data.questionDotToken?.node; } + get name(): Identifier | PrivateIdentifier { return this.ast.data.name.node; } + + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } + /** @internal */ set questionDotToken(value) { this.ast.data.questionDotToken = value?.ast; } + /** @internal */ set name(value) { this.ast.data.name = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value: FlowNode | undefined) { this.ast.data.flowNode = value; } } /** @internal */ @@ -2974,8 +5183,15 @@ export interface PrivateIdentifierPropertyAccessExpression extends PropertyAcces readonly name: PrivateIdentifier; } +export interface JsxTagNamePropertyAccess extends PropertyAccessExpression { + readonly ast: AstJsxTagNamePropertyAccess; + readonly data: AstJsxTagNamePropertyAccessData; + readonly expression: Identifier | ThisExpression | JsxTagNamePropertyAccess; +} + export interface PropertyAccessChain extends PropertyAccessExpression { _optionalChainBrand: any; + readonly ast: AstPropertyAccessChain; readonly name: MemberName; } @@ -2995,15 +5211,38 @@ export interface PropertyAccessEntityNameExpression extends PropertyAccessExpres readonly name: Identifier; } -export interface ElementAccessExpression extends MemberExpression, Declaration, JSDocContainer, FlowContainer { - readonly kind: SyntaxKind.ElementAccessExpression; - readonly expression: LeftHandSideExpression; - readonly questionDotToken?: QuestionDotToken | undefined; - readonly argumentExpression: Expression; +// dprint-ignore +export class ElementAccessExpression extends Node implements MemberExpression, Declaration, JSDocContainer, FlowContainer { + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstElementAccessExpression; + + get expression(): LeftHandSideExpression { return this.ast.data.expression.node; } + get questionDotToken(): QuestionDotToken | undefined { return this.ast.data.questionDotToken?.node; } + get argumentExpression(): Expression { return this.ast.data.argumentExpression.node; } + + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } + /** @internal */ set questionDotToken(value) { this.ast.data.questionDotToken = value?.ast; } + /** @internal */ set argumentExpression(value) { this.ast.data.argumentExpression = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value: FlowNode | undefined) { this.ast.data.flowNode = value; } } export interface ElementAccessChain extends ElementAccessExpression { _optionalChainBrand: any; + readonly ast: AstElementAccessChain; } /** @internal */ @@ -3018,16 +5257,33 @@ export interface SuperElementAccessExpression extends ElementAccessExpression { // see: https://tc39.github.io/ecma262/#prod-SuperProperty export type SuperProperty = SuperPropertyAccessExpression | SuperElementAccessExpression; -export interface CallExpression extends LeftHandSideExpression, Declaration { - readonly kind: SyntaxKind.CallExpression; - readonly expression: LeftHandSideExpression; - readonly questionDotToken?: QuestionDotToken | undefined; - readonly typeArguments?: NodeArray | undefined; - readonly arguments: NodeArray; +// dprint-ignore +export class CallExpression extends Node implements LeftHandSideExpression, Declaration { + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare _declarationBrand: any; + declare readonly ast: AstCallExpression; + + get expression(): LeftHandSideExpression { return this.ast.data.expression.node; } + get questionDotToken(): QuestionDotToken | undefined { return this.ast.data.questionDotToken?.node; } + get typeArguments(): NodeArray | undefined { return this.ast.data.typeArguments?.nodes; } + get arguments(): NodeArray { return this.ast.data.arguments.nodes; } + + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } + /** @internal */ set questionDotToken(value) { this.ast.data.questionDotToken = value?.ast; } + /** @internal */ set typeArguments(value) { this.ast.data.typeArguments = value?.ast; } + /** @internal */ set arguments(value) { this.ast.data.arguments = value.ast; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } export interface CallChain extends CallExpression { _optionalChainBrand: any; + readonly ast: AstCallChain; } /** @internal */ @@ -3101,28 +5357,65 @@ export interface ImportCall extends CallExpression { readonly expression: ImportExpression; } -export interface ExpressionWithTypeArguments extends MemberExpression, NodeWithTypeArguments { - readonly kind: SyntaxKind.ExpressionWithTypeArguments; - readonly expression: LeftHandSideExpression; +// dprint-ignore +export class ExpressionWithTypeArguments extends Node implements MemberExpression, NodeWithTypeArguments { + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare _typeNodeBrand: any; + declare readonly ast: AstExpressionWithTypeArguments; + + get expression(): LeftHandSideExpression { return this.ast.data.expression.node; } + get typeArguments(): NodeArray | undefined { return this.ast.data.typeArguments?.nodes; } + + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } + /** @internal */ set typeArguments(value) { this.ast.data.typeArguments = value?.ast; } } -export interface NewExpression extends PrimaryExpression, Declaration { - readonly kind: SyntaxKind.NewExpression; - readonly expression: LeftHandSideExpression; - readonly typeArguments?: NodeArray | undefined; - readonly arguments?: NodeArray | undefined; +// dprint-ignore +export class NewExpression extends Node implements PrimaryExpression, Declaration { + declare _primaryExpressionBrand: any; + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare _declarationBrand: any; + declare readonly ast: AstNewExpression; + + get expression(): LeftHandSideExpression { return this.ast.data.expression.node; } + get typeArguments(): NodeArray | undefined { return this.ast.data.typeArguments?.nodes; } + get arguments(): NodeArray | undefined { return this.ast.data.arguments?.nodes; } + + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } + /** @internal */ set typeArguments(value) { this.ast.data.typeArguments = value?.ast; } + /** @internal */ set arguments(value) { this.ast.data.arguments = value?.ast; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } -export interface TaggedTemplateExpression extends MemberExpression { - readonly kind: SyntaxKind.TaggedTemplateExpression; - readonly tag: LeftHandSideExpression; - readonly typeArguments?: NodeArray | undefined; - readonly template: TemplateLiteral; - /** @internal */ questionDotToken?: QuestionDotToken | undefined; // NOTE: Invalid syntax, only used to report a grammar error. -} +// dprint-ignore +export class TaggedTemplateExpression extends Node implements MemberExpression { + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare readonly ast: AstTaggedTemplateExpression; -export interface InstanceofExpression extends BinaryExpression { - readonly operatorToken: Token; + get tag(): LeftHandSideExpression { return this.ast.data.tag.node; } + get typeArguments(): NodeArray | undefined { return this.ast.data.typeArguments?.nodes; } + get template(): NoSubstitutionTemplateLiteral | TemplateExpression { return this.ast.data.template.node; } + + /** @internal */ set tag(value) { this.ast.data.tag = value.ast; } + /** @internal */ set typeArguments(value) { this.ast.data.typeArguments = value?.ast; } + /** @internal */ set template(value) { this.ast.data.template = value.ast; } + /** @internal */ get questionDotToken(): QuestionDotToken | undefined { return this.ast.data.questionDotToken?.node; } + /** @internal */ set questionDotToken(value) { this.ast.data.questionDotToken = value?.ast; } } export type CallLikeExpression = @@ -3133,43 +5426,86 @@ export type CallLikeExpression = | JsxOpeningLikeElement | InstanceofExpression; -export interface AsExpression extends Expression { - readonly kind: SyntaxKind.AsExpression; - readonly expression: Expression; - readonly type: TypeNode; +// dprint-ignore +export class AsExpression extends Node implements Expression { + declare _expressionBrand: any; + declare readonly ast: AstAsExpression; + + get expression(): Expression { return this.ast.data.expression.node; } + get type(): TypeNode { return this.ast.data.type.node; } + + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } + /** @internal */ set type(value) { this.ast.data.type = value.ast; } } -export interface TypeAssertion extends UnaryExpression { - readonly kind: SyntaxKind.TypeAssertionExpression; - readonly type: TypeNode; - readonly expression: UnaryExpression; +// dprint-ignore +export class TypeAssertionExpression extends Node implements UnaryExpression { + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare readonly ast: AstTypeAssertion; + + get type(): TypeNode { return this.ast.data.type.node; } + get expression(): UnaryExpression { return this.ast.data.expression.node; } + + /** @internal */ set type(value) { this.ast.data.type = value.ast; } + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } } -export interface SatisfiesExpression extends Expression { - readonly kind: SyntaxKind.SatisfiesExpression; - readonly expression: Expression; - readonly type: TypeNode; -} +/** @deprecated Use `TypeAssertionExpression` instead */ +export type TypeAssertion = TypeAssertionExpression; export type AssertionExpression = - | TypeAssertion + | TypeAssertionExpression | AsExpression; -export interface NonNullExpression extends LeftHandSideExpression { - readonly kind: SyntaxKind.NonNullExpression; - readonly expression: Expression; +// dprint-ignore +export class SatisfiesExpression extends Node implements Expression { + declare _expressionBrand: any; + declare readonly ast: AstSatisfiesExpression; + + get expression(): Expression { return this.ast.data.expression.node; } + get type(): TypeNode { return this.ast.data.type.node; } + + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } + /** @internal */ set type(value) { this.ast.data.type = value.ast; } +} + +// dprint-ignore +export class NonNullExpression extends Node implements LeftHandSideExpression { + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare readonly ast: AstNonNullExpression; + + get expression(): Expression { return this.ast.data.expression.node; } + + /** @internal */ set expression(value: Expression) { this.ast.data.expression = value.ast; } } export interface NonNullChain extends NonNullExpression { _optionalChainBrand: any; + readonly ast: AstNonNullChain; } -// NOTE: MetaProperty is really a MemberExpression, but we consider it a PrimaryExpression -// for the same reasons we treat NewExpression as a PrimaryExpression. -export interface MetaProperty extends PrimaryExpression, FlowContainer { - readonly kind: SyntaxKind.MetaProperty; - readonly keywordToken: SyntaxKind.NewKeyword | SyntaxKind.ImportKeyword; - readonly name: Identifier; +// dprint-ignore +export class MetaProperty extends Node implements PrimaryExpression, FlowContainer { + declare _primaryExpressionBrand: any; + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstMetaProperty; + + get keywordToken(): SyntaxKind.ImportKeyword | SyntaxKind.NewKeyword { return this.ast.data.keywordToken; } + get name(): Identifier { return this.ast.data.name.node; } + + /** @internal */ set keywordToken(value: SyntaxKind.ImportKeyword | SyntaxKind.NewKeyword) { this.ast.data.keywordToken = value; } + /** @internal */ set name(value: Identifier) { this.ast.data.name = value.ast; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value) { this.ast.data.flowNode = value; } } /** @internal */ @@ -3179,11 +5515,23 @@ export interface ImportMetaProperty extends MetaProperty { } /// A JSX expression of the form ... -export interface JsxElement extends PrimaryExpression { - readonly kind: SyntaxKind.JsxElement; - readonly openingElement: JsxOpeningElement; - readonly children: NodeArray; - readonly closingElement: JsxClosingElement; +// dprint-ignore +export class JsxElement extends Node implements PrimaryExpression { + declare _primaryExpressionBrand: any; + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare readonly ast: AstJsxElement; + + get openingElement(): JsxOpeningElement { return this.ast.data.openingElement.node; } + get children(): NodeArray { return this.ast.data.children.nodes; } + get closingElement(): JsxClosingElement { return this.ast.data.closingElement.node; } + + /** @internal */ set openingElement(value: JsxOpeningElement) { this.ast.data.openingElement = value.ast; } + /** @internal */ set children(value: NodeArray) { this.ast.data.children = value.ast; } + /** @internal */ set closingElement(value: JsxClosingElement) { this.ast.data.closingElement = value.ast; } } /// Either the opening tag in a ... pair or the lone in a self-closing form @@ -3205,65 +5553,142 @@ export type JsxTagNameExpression = | JsxTagNamePropertyAccess | JsxNamespacedName; -export interface JsxTagNamePropertyAccess extends PropertyAccessExpression { - readonly expression: Identifier | ThisExpression | JsxTagNamePropertyAccess; +// dprint-ignore +export class JsxAttributes extends Node implements PrimaryExpression, Declaration { + declare _primaryExpressionBrand: any; + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare _declarationBrand: any; + declare readonly ast: AstJsxAttributes; + + override get parent() { return super.parent as JsxOpeningLikeElement; } + + get properties(): NodeArray { return this.ast.data.properties.nodes; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set properties(value) { this.ast.data.properties = value.ast; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } -export interface JsxAttributes extends PrimaryExpression, Declaration { - readonly kind: SyntaxKind.JsxAttributes; - readonly properties: NodeArray; - readonly parent: JsxOpeningLikeElement; -} - -export interface JsxNamespacedName extends Node { - readonly kind: SyntaxKind.JsxNamespacedName; - readonly name: Identifier; - readonly namespace: Identifier; +// dprint-ignore +export class JsxNamespacedName extends Node { + declare readonly ast: AstJsxNamespacedName; + + get name(): Identifier { return this.ast.data.name.node; } + get namespace(): Identifier { return this.ast.data.namespace.node; } + + /** @internal */ set name(value) { this.ast.data.name = value.ast; } + /** @internal */ set namespace(value) { this.ast.data.namespace = value.ast; } } +// TODO(rbuckton): Is this actually an expression or just a part of JsxElement? /// The opening element of a ... JsxElement -export interface JsxOpeningElement extends Expression { - readonly kind: SyntaxKind.JsxOpeningElement; - readonly parent: JsxElement; - readonly tagName: JsxTagNameExpression; - readonly typeArguments?: NodeArray | undefined; - readonly attributes: JsxAttributes; +// dprint-ignore +export class JsxOpeningElement extends Node implements Expression { + declare _expressionBrand: any; + declare readonly ast: AstJsxOpeningElement; + + override get parent() { return super.parent as JsxElement; } + + get tagName(): JsxTagNameExpression { return this.ast.data.tagName.node; } + get typeArguments(): NodeArray | undefined { return this.ast.data.typeArguments?.nodes; } + get attributes(): JsxAttributes { return this.ast.data.attributes.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set tagName(value) { this.ast.data.tagName = value.ast; } + /** @internal */ set typeArguments(value) { this.ast.data.typeArguments = value?.ast; } + /** @internal */ set attributes(value) { this.ast.data.attributes = value.ast; } } /// A JSX expression of the form -export interface JsxSelfClosingElement extends PrimaryExpression { - readonly kind: SyntaxKind.JsxSelfClosingElement; - readonly tagName: JsxTagNameExpression; - readonly typeArguments?: NodeArray | undefined; - readonly attributes: JsxAttributes; +// dprint-ignore +export class JsxSelfClosingElement extends Node implements PrimaryExpression { + declare _primaryExpressionBrand: any; + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare readonly ast: AstJsxSelfClosingElement; + + get tagName(): JsxTagNameExpression { return this.ast.data.tagName.node; } + get typeArguments(): NodeArray | undefined { return this.ast.data.typeArguments?.nodes; } + get attributes(): JsxAttributes { return this.ast.data.attributes.node; } + + /** @internal */ set tagName(value) { this.ast.data.tagName = value.ast; } + /** @internal */ set typeArguments(value) { this.ast.data.typeArguments = value?.ast; } + /** @internal */ set attributes(value) { this.ast.data.attributes = value.ast; } } /// A JSX expression of the form <>... -export interface JsxFragment extends PrimaryExpression { - readonly kind: SyntaxKind.JsxFragment; - readonly openingFragment: JsxOpeningFragment; - readonly children: NodeArray; - readonly closingFragment: JsxClosingFragment; +// dprint-ignore +export class JsxFragment extends Node implements PrimaryExpression { + declare _primaryExpressionBrand: any; + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare readonly ast: AstJsxFragment; + + get openingFragment(): JsxOpeningFragment { return this.ast.data.openingFragment.node; } + get children(): NodeArray { return this.ast.data.children.nodes; } + get closingFragment(): JsxClosingFragment { return this.ast.data.closingFragment.node; } + + /** @internal */ set openingFragment(value: JsxOpeningFragment) { this.ast.data.openingFragment = value.ast; } + /** @internal */ set children(value: NodeArray) { this.ast.data.children = value.ast; } + /** @internal */ set closingFragment(value: JsxClosingFragment) { this.ast.data.closingFragment = value.ast; } } +// TODO(rbuckton): Is this actually an expression or just a part of JsxFragment? /// The opening element of a <>... JsxFragment -export interface JsxOpeningFragment extends Expression { - readonly kind: SyntaxKind.JsxOpeningFragment; - readonly parent: JsxFragment; +// dprint-ignore +export class JsxOpeningFragment extends Node implements Expression { + declare _expressionBrand: any; + declare readonly ast: AstJsxOpeningFragment; + + override get parent() { return super.parent as JsxFragment; } + + /** @internal */ override set parent(value) { super.parent = value; } } +// TODO(rbuckton): Is this actually an expression or just a part of JsxFragment? /// The closing element of a <>... JsxFragment -export interface JsxClosingFragment extends Expression { - readonly kind: SyntaxKind.JsxClosingFragment; - readonly parent: JsxFragment; +// dprint-ignore +export class JsxClosingFragment extends Node implements Expression { + declare _expressionBrand: any; + declare readonly ast: AstJsxClosingFragment; + + override get parent() { return super.parent as JsxFragment; } + + /** @internal */ override set parent(value) { super.parent = value; } } -export interface JsxAttribute extends Declaration { - readonly kind: SyntaxKind.JsxAttribute; - readonly parent: JsxAttributes; - readonly name: JsxAttributeName; - /// JSX attribute initializers are optional; is sugar for - readonly initializer?: JsxAttributeValue | undefined; +// dprint-ignore +export class JsxAttribute extends Node implements Declaration { + declare readonly ast: AstJsxAttribute; + + declare _declarationBrand: any; + + override get parent() { return super.parent as JsxAttributes; } + + get name(): JsxAttributeName { return this.ast.data.name.node; } + // JSX attribute initializers are optional; is sugar for + get initializer(): JsxAttributeValue | undefined { return this.ast.data.initializer?.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set name(value) { this.ast.data.name = value.ast; } + /** @internal */ set initializer(value) { this.ast.data.initializer = value?.ast; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } export type JsxAttributeValue = @@ -3273,29 +5698,69 @@ export type JsxAttributeValue = | JsxSelfClosingElement | JsxFragment; -export interface JsxSpreadAttribute extends ObjectLiteralElement { - readonly kind: SyntaxKind.JsxSpreadAttribute; - readonly parent: JsxAttributes; - readonly expression: Expression; +// TODO(rbuckton): Does this need to implement ObjectLiteralElement? +// dprint-ignore +export class JsxSpreadAttribute extends Node implements ObjectLiteralElement { + declare _objectLiteralBrand: any; + declare _declarationBrand: any; + declare readonly ast: AstJsxSpreadAttribute; + + /** @internal*/ declare symbol: never; // not actually a declaration + /** @internal*/ declare localSymbol: never; // not actually a declaration + + override get parent() { return super.parent as JsxAttributes; } + + get expression(): Expression { return this.ast.data.expression.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } } -export interface JsxClosingElement extends Node { - readonly kind: SyntaxKind.JsxClosingElement; - readonly parent: JsxElement; - readonly tagName: JsxTagNameExpression; +// TODO(rbuckton): Move adjacent to JsxOpeningElement +// dprint-ignore +export class JsxClosingElement extends Node { + declare readonly ast: AstJsxClosingElement; + + override get parent() { return super.parent as JsxElement; } + + get tagName(): JsxTagNameExpression { return this.ast.data.tagName.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set tagName(value) { this.ast.data.tagName = value.ast; } } -export interface JsxExpression extends Expression { - readonly kind: SyntaxKind.JsxExpression; - readonly parent: JsxElement | JsxFragment | JsxAttributeLike; - readonly dotDotDotToken?: Token | undefined; - readonly expression?: Expression | undefined; +// TODO(rbuckton): Is this actually an expression? +// dprint-ignore +export class JsxExpression extends Node implements Expression { + declare _expressionBrand: any; + declare readonly ast: AstJsxExpression; + + override get parent() { return super.parent as JsxElement | JsxFragment | JsxAttributeLike; } + + get dotDotDotToken(): DotDotDotToken | undefined { return this.ast.data.dotDotDotToken?.node; } + get expression(): Expression | undefined { return this.ast.data.expression?.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set dotDotDotToken(value) { this.ast.data.dotDotDotToken = value?.ast; } + /** @internal */ set expression(value) { this.ast.data.expression = value?.ast; } } -export interface JsxText extends LiteralLikeNode { - readonly kind: SyntaxKind.JsxText; - readonly parent: JsxElement | JsxFragment; - readonly containsOnlyTriviaWhiteSpaces: boolean; +// dprint-ignore +export class JsxText extends Token implements LiteralLikeNode { + declare readonly ast: AstJsxText; + + override get parent() { return super.parent as JsxElement | JsxFragment; } + + get text(): string { return this.ast.data.text; } + get isUnterminated(): boolean | undefined { return this.ast.data.isUnterminated; } + get hasExtendedUnicodeEscape(): boolean | undefined { return this.ast.data.hasExtendedUnicodeEscape; } + get containsOnlyTriviaWhiteSpaces(): boolean { return this.ast.data.containsOnlyTriviaWhiteSpaces; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set text(value) { this.ast.data.text = value; } + /** @internal */ set isUnterminated(value) { this.ast.data.isUnterminated = value; } + /** @internal */ set hasExtendedUnicodeEscape(value) { this.ast.data.hasExtendedUnicodeEscape = value; } + /** @internal */ set containsOnlyTriviaWhiteSpaces(value) { this.ast.data.containsOnlyTriviaWhiteSpaces = value; } } export type JsxChild = @@ -3305,49 +5770,111 @@ export type JsxChild = | JsxSelfClosingElement | JsxFragment; -export interface Statement extends Node, JSDocContainer { +export interface Statement extends JSDocContainer { _statementBrand: any; + readonly ast: AstStatement; } // Represents a statement that is elided as part of a transformation to emit comments on a // not-emitted node. -export interface NotEmittedStatement extends Statement { - readonly kind: SyntaxKind.NotEmittedStatement; +// dprint-ignore +export class NotEmittedStatement extends Node implements Statement { + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare readonly ast: AstNotEmittedStatement; + + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } } -export interface NotEmittedTypeElement extends TypeElement { - readonly kind: SyntaxKind.NotEmittedTypeElement; +// TODO(rbuckton): Move adjacent to other type elements +// dprint-ignore +export class NotEmittedTypeElement extends Node implements TypeElement { + declare _typeElementBrand: any; + declare _declarationBrand: any; + declare readonly ast: AstNotEmittedTypeElement; + + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value: Symbol) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value: Symbol | undefined) { this.ast.data.localSymbol = value; } } /** * A list of comma-separated expressions. This node is only created by transformations. */ -export interface CommaListExpression extends Expression { - readonly kind: SyntaxKind.CommaListExpression; - readonly elements: NodeArray; +// dprint-ignore +export class CommaListExpression extends Node implements Expression { + declare _expressionBrand: any; + declare readonly ast: AstCommaListExpression; + + get elements(): NodeArray { return this.ast.data.elements.nodes; } + + /** @internal */ set elements(value: NodeArray) { this.ast.data.elements = value.ast; } } /** @internal */ -export interface SyntheticReferenceExpression extends LeftHandSideExpression { - readonly kind: SyntaxKind.SyntheticReferenceExpression; - readonly expression: Expression; - readonly thisArg: Expression; +// dprint-ignore +export class SyntheticReferenceExpression extends Node implements LeftHandSideExpression { + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare readonly ast: AstSyntheticReferenceExpression; + + get expression(): Expression { return this.ast.data.expression.node; } + /** @internal */ set expression(value: Expression) { this.ast.data.expression = value.ast; } + get thisArg(): Expression { return this.ast.data.thisArg.node; } + /** @internal */ set thisArg(value: Expression) { this.ast.data.thisArg = value.ast; } } -export interface EmptyStatement extends Statement { - readonly kind: SyntaxKind.EmptyStatement; +// dprint-ignore +export class EmptyStatement extends Node implements Statement, JSDocContainer { + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare readonly ast: AstEmptyStatement; + + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } } -export interface DebuggerStatement extends Statement, FlowContainer { - readonly kind: SyntaxKind.DebuggerStatement; +// dprint-ignore +export class DebuggerStatement extends Node implements Statement, FlowContainer { + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstDebuggerStatement; + + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value: FlowNode | undefined) { this.ast.data.flowNode = value; } } -export interface MissingDeclaration extends DeclarationStatement, PrimaryExpression { - readonly kind: SyntaxKind.MissingDeclaration; - readonly name?: Identifier | undefined; +// dprint-ignore +export class MissingDeclaration extends Node implements DeclarationStatement { + declare _declarationBrand: any; + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare _primaryExpressionBrand: any; + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare readonly ast: AstMissingDeclaration; - // The following properties are used only to report grammar errors - /** @internal */ readonly modifiers?: NodeArray | undefined; + get name(): Identifier | undefined { return this.ast.data.name?.node; } + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + + /** @internal */ set name(value) { this.ast.data.name = value?.ast; } + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } export type BlockLike = @@ -3356,21 +5883,58 @@ export type BlockLike = | ModuleBlock | CaseOrDefaultClause; -export interface Block extends Statement, LocalsContainer { - readonly kind: SyntaxKind.Block; - readonly statements: NodeArray; - /** @internal */ multiLine?: boolean | undefined; +// dprint-ignore +export class Block extends Node implements Statement, LocalsContainer { + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare _localsContainerBrand: any; + declare readonly ast: AstBlock; + + get statements(): NodeArray { return this.ast.data.statements.nodes; } + + /** @internal */ set statements(value) { this.ast.data.statements = value.ast; } + /** @internal */ get multiLine(): boolean | undefined { return this.ast.data.multiLine; } + /** @internal */ set multiLine(value) { this.ast.data.multiLine = value; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } } -export interface VariableStatement extends Statement, FlowContainer { - readonly kind: SyntaxKind.VariableStatement; - readonly modifiers?: NodeArray | undefined; - readonly declarationList: VariableDeclarationList; +// dprint-ignore +export class VariableStatement extends Node implements Statement, FlowContainer { + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstVariableStatement; + + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + get declarationList(): VariableDeclarationList { return this.ast.data.declarationList.node; } + + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set declarationList(value) { this.ast.data.declarationList = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value: FlowNode | undefined) { this.ast.data.flowNode = value; } } -export interface ExpressionStatement extends Statement, FlowContainer { - readonly kind: SyntaxKind.ExpressionStatement; - readonly expression: Expression; +// dprint-ignore +export class ExpressionStatement extends Node implements Statement, FlowContainer { + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstExpressionStatement; + + get expression(): Expression { return this.ast.data.expression.node; } + + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value: FlowNode | undefined) { this.ast.data.flowNode = value; } } /** @internal */ @@ -3378,135 +5942,368 @@ export interface PrologueDirective extends ExpressionStatement { readonly expression: StringLiteral; } -export interface IfStatement extends Statement, FlowContainer { - readonly kind: SyntaxKind.IfStatement; - readonly expression: Expression; - readonly thenStatement: Statement; - readonly elseStatement?: Statement | undefined; +// dprint-ignore +export class IfStatement extends Node implements Statement, FlowContainer { + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstIfStatement; + + get expression(): Expression { return this.ast.data.expression.node; } + get thenStatement(): Statement { return this.ast.data.thenStatement.node; } + get elseStatement(): Statement | undefined { return this.ast.data.elseStatement?.node; } + + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } + /** @internal */ set thenStatement(value) { this.ast.data.thenStatement = value.ast; } + /** @internal */ set elseStatement(value) { this.ast.data.elseStatement = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value: FlowNode | undefined) { this.ast.data.flowNode = value; } } export interface IterationStatement extends Statement { readonly statement: Statement; } -export interface DoStatement extends IterationStatement, FlowContainer { - readonly kind: SyntaxKind.DoStatement; - readonly expression: Expression; +// dprint-ignore +export class DoStatement extends Node implements IterationStatement, FlowContainer { + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstDoStatement; + + get statement(): Statement { return this.ast.data.statement.node; } + get expression(): Expression { return this.ast.data.expression.node; } + + /** @internal */ set statement(value) { this.ast.data.statement = value.ast; } + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value: FlowNode | undefined) { this.ast.data.flowNode = value; } } -export interface WhileStatement extends IterationStatement, FlowContainer { - readonly kind: SyntaxKind.WhileStatement; - readonly expression: Expression; +// dprint-ignore +export class WhileStatement extends Node implements IterationStatement, FlowContainer { + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstWhileStatement; + + get expression(): Expression { return this.ast.data.expression.node; } + get statement(): Statement { return this.ast.data.statement.node; } + + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } + /** @internal */ set statement(value) { this.ast.data.statement = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value: FlowNode | undefined) { this.ast.data.flowNode = value; } } export type ForInitializer = | VariableDeclarationList | Expression; -export interface ForStatement extends IterationStatement, LocalsContainer, FlowContainer { - readonly kind: SyntaxKind.ForStatement; - readonly initializer?: ForInitializer | undefined; - readonly condition?: Expression | undefined; - readonly incrementor?: Expression | undefined; +// dprint-ignore +export class ForStatement extends Node implements IterationStatement, LocalsContainer, FlowContainer { + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare _localsContainerBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstForStatement; + + get initializer(): ForInitializer | undefined { return this.ast.data.initializer?.node; } + get condition(): Expression | undefined { return this.ast.data.condition?.node; } + get incrementor(): Expression | undefined { return this.ast.data.incrementor?.node; } + get statement(): Statement { return this.ast.data.statement.node; } + + /** @internal */ set initializer(value) { this.ast.data.initializer = value?.ast; } + /** @internal */ set condition(value) { this.ast.data.condition = value?.ast; } + /** @internal */ set incrementor(value) { this.ast.data.incrementor = value?.ast; } + /** @internal */ set statement(value) { this.ast.data.statement = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value: FlowNode | undefined) { this.ast.data.flowNode = value; } } export type ForInOrOfStatement = | ForInStatement | ForOfStatement; -export interface ForInStatement extends IterationStatement, LocalsContainer, FlowContainer { - readonly kind: SyntaxKind.ForInStatement; - readonly initializer: ForInitializer; - readonly expression: Expression; +// dprint-ignore +export class ForInStatement extends Node implements IterationStatement, LocalsContainer, FlowContainer { + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare _localsContainerBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstForInStatement; + + get initializer(): ForInitializer { return this.ast.data.initializer.node; } + get expression(): Expression { return this.ast.data.expression.node; } + get statement(): Statement { return this.ast.data.statement.node; } + + /** @internal */ set initializer(value) { this.ast.data.initializer = value.ast; } + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } + /** @internal */ set statement(value) { this.ast.data.statement = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value: FlowNode | undefined) { this.ast.data.flowNode = value; } } -export interface ForOfStatement extends IterationStatement, LocalsContainer, FlowContainer { - readonly kind: SyntaxKind.ForOfStatement; - readonly awaitModifier?: AwaitKeyword | undefined; - readonly initializer: ForInitializer; - readonly expression: Expression; +// dprint-ignore +export class ForOfStatement extends Node implements IterationStatement, LocalsContainer, FlowContainer { + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare _localsContainerBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstForOfStatement; + + get awaitModifier(): AwaitKeyword | undefined { return this.ast.data.awaitModifier?.node; } + get initializer(): ForInitializer { return this.ast.data.initializer.node; } + get expression(): Expression { return this.ast.data.expression.node; } + get statement(): Statement { return this.ast.data.statement.node; } + + /** @internal */ set awaitModifier(value) { this.ast.data.awaitModifier = value?.ast; } + /** @internal */ set initializer(value) { this.ast.data.initializer = value.ast; } + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } + /** @internal */ set statement(value) { this.ast.data.statement = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value: FlowNode | undefined) { this.ast.data.flowNode = value; } } -export interface BreakStatement extends Statement, FlowContainer { - readonly kind: SyntaxKind.BreakStatement; - readonly label?: Identifier | undefined; +// dprint-ignore +export class BreakStatement extends Node implements Statement, FlowContainer { + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstBreakStatement; + + get label(): Identifier | undefined { return this.ast.data.label?.node; } + + /** @internal */ set label(value) { this.ast.data.label = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value: FlowNode | undefined) { this.ast.data.flowNode = value; } } -export interface ContinueStatement extends Statement, FlowContainer { - readonly kind: SyntaxKind.ContinueStatement; - readonly label?: Identifier | undefined; +// dprint-ignore +export class ContinueStatement extends Node implements Statement, FlowContainer { + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstContinueStatement; + + get label(): Identifier | undefined { return this.ast.data.label?.node; } + + /** @internal */ set label(value) { this.ast.data.label = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value: FlowNode | undefined) { this.ast.data.flowNode = value; } } export type BreakOrContinueStatement = | BreakStatement | ContinueStatement; -export interface ReturnStatement extends Statement, FlowContainer { - readonly kind: SyntaxKind.ReturnStatement; - readonly expression?: Expression | undefined; +// dprint-ignore +export class ReturnStatement extends Node implements Statement, FlowContainer { + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstReturnStatement; + + get expression(): Expression | undefined { return this.ast.data.expression?.node; } + + /** @internal */ set expression(value) { this.ast.data.expression = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value: FlowNode | undefined) { this.ast.data.flowNode = value; } } -export interface WithStatement extends Statement, FlowContainer { - readonly kind: SyntaxKind.WithStatement; - readonly expression: Expression; - readonly statement: Statement; +// dprint-ignore +export class WithStatement extends Node implements Statement, FlowContainer { + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstWithStatement; + + get expression(): Expression { return this.ast.data.expression.node; } + get statement(): Statement { return this.ast.data.statement.node; } + + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } + /** @internal */ set statement(value) { this.ast.data.statement = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value: FlowNode | undefined) { this.ast.data.flowNode = value; } } -export interface SwitchStatement extends Statement, FlowContainer { - readonly kind: SyntaxKind.SwitchStatement; - readonly expression: Expression; - readonly caseBlock: CaseBlock; - possiblyExhaustive?: boolean | undefined; // initialized by binding +// dprint-ignore +export class SwitchStatement extends Node implements Statement, FlowContainer { + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstSwitchStatement; + + get expression(): Expression { return this.ast.data.expression.node; } + get caseBlock(): CaseBlock { return this.ast.data.caseBlock.node; } + get possiblyExhaustive(): boolean | undefined { return this.ast.data.possiblyExhaustive; } + + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } + /** @internal */ set caseBlock(value) { this.ast.data.caseBlock = value.ast; } + /** @internal */ set possiblyExhaustive(value) { this.ast.data.possiblyExhaustive = value; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value: FlowNode | undefined) { this.ast.data.flowNode = value; } } -export interface CaseBlock extends Node, LocalsContainer { - readonly kind: SyntaxKind.CaseBlock; - readonly parent: SwitchStatement; - readonly clauses: NodeArray; +// dprint-ignore +export class CaseBlock extends Node implements LocalsContainer { + declare _localsContainerBrand: any; + declare readonly ast: AstCaseBlock; + + override get parent() { return super.parent as SwitchStatement; } + + get clauses(): NodeArray { return this.ast.data.clauses.nodes; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set clauses(value) { this.ast.data.clauses = value.ast; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } } -export interface CaseClause extends Node, JSDocContainer { - readonly kind: SyntaxKind.CaseClause; - readonly parent: CaseBlock; - readonly expression: Expression; - readonly statements: NodeArray; - /** @internal */ fallthroughFlowNode?: FlowNode | undefined; +// dprint-ignore +export class CaseClause extends Node implements JSDocContainer { + declare _jsdocContainerBrand: any; + declare readonly ast: AstCaseClause; + + override get parent() { return super.parent as CaseBlock; } + + get expression(): Expression { return this.ast.data.expression.node; } + get statements(): NodeArray { return this.ast.data.statements.nodes; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } + /** @internal */ set statements(value) { this.ast.data.statements = value.ast; } + /** @internal */ get fallthroughFlowNode(): FlowNode | undefined { return this.ast.data.fallthroughFlowNode; } + /** @internal */ set fallthroughFlowNode(value) { this.ast.data.fallthroughFlowNode = value; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } } -export interface DefaultClause extends Node { - readonly kind: SyntaxKind.DefaultClause; - readonly parent: CaseBlock; - readonly statements: NodeArray; - /** @internal */ fallthroughFlowNode?: FlowNode | undefined; +// dprint-ignore +export class DefaultClause extends Node { + declare readonly ast: AstDefaultClause; + + override get parent() { return super.parent as CaseBlock; } + + get statements(): NodeArray { return this.ast.data.statements.nodes; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set statements(value) { this.ast.data.statements = value.ast; } + /** @internal */ get fallthroughFlowNode(): FlowNode | undefined { return this.ast.data.fallthroughFlowNode; } + /** @internal */ set fallthroughFlowNode(value) { this.ast.data.fallthroughFlowNode = value; } } export type CaseOrDefaultClause = | CaseClause | DefaultClause; -export interface LabeledStatement extends Statement, FlowContainer { - readonly kind: SyntaxKind.LabeledStatement; - readonly label: Identifier; - readonly statement: Statement; +// dprint-ignore +export class LabeledStatement extends Node implements Statement, FlowContainer { + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstLabeledStatement; + + get label(): Identifier { return this.ast.data.label.node; } + get statement(): Statement { return this.ast.data.statement.node; } + + /** @internal */ set label(value) { this.ast.data.label = value.ast; } + /** @internal */ set statement(value) { this.ast.data.statement = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value: FlowNode | undefined) { this.ast.data.flowNode = value; } } -export interface ThrowStatement extends Statement, FlowContainer { - readonly kind: SyntaxKind.ThrowStatement; - readonly expression: Expression; +// dprint-ignore +export class ThrowStatement extends Node implements Statement, FlowContainer { + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstThrowStatement; + + get expression(): Expression { return this.ast.data.expression.node; } + + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value: FlowNode | undefined) { this.ast.data.flowNode = value; } } -export interface TryStatement extends Statement, FlowContainer { - readonly kind: SyntaxKind.TryStatement; - readonly tryBlock: Block; - readonly catchClause?: CatchClause | undefined; - readonly finallyBlock?: Block | undefined; +// dprint-ignore +export class TryStatement extends Node implements Statement, FlowContainer { + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare _flowContainerBrand: any; + declare readonly ast: AstTryStatement; + + get tryBlock(): Block { return this.ast.data.tryBlock.node; } + get catchClause(): CatchClause | undefined { return this.ast.data.catchClause?.node; } + get finallyBlock(): Block | undefined { return this.ast.data.finallyBlock?.node; } + + /** @internal */ set tryBlock(value) { this.ast.data.tryBlock = value.ast; } + /** @internal */ set catchClause(value) { this.ast.data.catchClause = value?.ast; } + /** @internal */ set finallyBlock(value) { this.ast.data.finallyBlock = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get flowNode(): FlowNode | undefined { return this.ast.data.flowNode; } + /** @internal */ set flowNode(value: FlowNode | undefined) { this.ast.data.flowNode = value; } } -export interface CatchClause extends Node, LocalsContainer { - readonly kind: SyntaxKind.CatchClause; - readonly parent: TryStatement; - readonly variableDeclaration?: VariableDeclaration | undefined; - readonly block: Block; +// dprint-ignore +export class CatchClause extends Node implements LocalsContainer { + declare _localsContainerBrand: any; + declare readonly ast: AstCatchClause; + + override get parent() { return super.parent as TryStatement; } + + get variableDeclaration(): VariableDeclaration | undefined { return this.ast.data.variableDeclaration?.node; } + get block(): Block { return this.ast.data.block.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set variableDeclaration(value) { this.ast.data.variableDeclaration = value?.ast; } + /** @internal */ set block(value) { this.ast.data.block = value.ast; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } } export type ObjectTypeDeclaration = @@ -3528,6 +6325,7 @@ export type DeclarationWithTypeParameterChildren = | JSDocTemplateTag; export interface ClassLikeDeclarationBase extends NamedDeclaration, JSDocContainer { + readonly ast: AstNode; readonly kind: SyntaxKind.ClassDeclaration | SyntaxKind.ClassExpression; readonly name?: Identifier | undefined; readonly typeParameters?: NodeArray | undefined; @@ -3535,71 +6333,196 @@ export interface ClassLikeDeclarationBase extends NamedDeclaration, JSDocContain readonly members: NodeArray; } -export interface ClassDeclaration extends ClassLikeDeclarationBase, DeclarationStatement { - readonly kind: SyntaxKind.ClassDeclaration; - readonly modifiers?: NodeArray | undefined; - /** May be undefined in `export default class { ... }`. */ - readonly name?: Identifier | undefined; +// dprint-ignore +export class ClassDeclaration extends Node implements ClassLikeDeclarationBase, DeclarationStatement { + declare _declarationBrand: any; + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare readonly ast: AstClassDeclaration; + + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + get name(): Identifier | undefined { return this.ast.data.name?.node; } + get typeParameters(): NodeArray | undefined { return this.ast.data.typeParameters?.nodes; } + get heritageClauses(): NodeArray | undefined { return this.ast.data.heritageClauses?.nodes; } + get members(): NodeArray { return this.ast.data.members.nodes; } + + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set name(value) { this.ast.data.name = value?.ast; } + /** @internal */ set typeParameters(value) { this.ast.data.typeParameters = value?.ast; } + /** @internal */ set heritageClauses(value) { this.ast.data.heritageClauses = value?.ast; } + /** @internal */ set members(value: NodeArray) { this.ast.data.members = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } -export interface ClassExpression extends ClassLikeDeclarationBase, PrimaryExpression { - readonly kind: SyntaxKind.ClassExpression; - readonly modifiers?: NodeArray | undefined; +// dprint-ignore +export class ClassExpression extends Node implements ClassLikeDeclarationBase, PrimaryExpression { + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare _primaryExpressionBrand: any; + declare _memberExpressionBrand: any; + declare _leftHandSideExpressionBrand: any; + declare _updateExpressionBrand: any; + declare _unaryExpressionBrand: any; + declare _expressionBrand: any; + declare readonly ast: AstClassExpression; + + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + /** May be undefined in `export default class { ... }`. */ + get name(): Identifier | undefined { return this.ast.data.name?.node; } + get typeParameters(): NodeArray | undefined { return this.ast.data.typeParameters?.nodes; } + get heritageClauses(): NodeArray | undefined { return this.ast.data.heritageClauses?.nodes; } + get members(): NodeArray { return this.ast.data.members.nodes; } + + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set name(value) { this.ast.data.name = value?.ast; } + /** @internal */ set typeParameters(value) { this.ast.data.typeParameters = value?.ast; } + /** @internal */ set heritageClauses(value) { this.ast.data.heritageClauses = value?.ast; } + /** @internal */ set members(value) { this.ast.data.members = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } export type ClassLikeDeclaration = | ClassDeclaration | ClassExpression; -export interface ClassElement extends NamedDeclaration { +export interface ClassElement extends Declaration { _classElementBrand: any; + readonly ast: AstClassElement; + + // TODO(rbuckton): remove this? readonly name?: PropertyName | undefined; } -export interface TypeElement extends NamedDeclaration { +export interface TypeElement extends Declaration { _typeElementBrand: any; + readonly ast: AstTypeElement; + + // TODO(rbuckton): remove these? readonly name?: PropertyName | undefined; readonly questionToken?: QuestionToken | undefined; } -export interface InterfaceDeclaration extends DeclarationStatement, JSDocContainer { - readonly kind: SyntaxKind.InterfaceDeclaration; - readonly modifiers?: NodeArray | undefined; - readonly name: Identifier; - readonly typeParameters?: NodeArray | undefined; - readonly heritageClauses?: NodeArray | undefined; - readonly members: NodeArray; +// dprint-ignore +export class InterfaceDeclaration extends Node implements DeclarationStatement, JSDocContainer { + declare _declarationBrand: any; + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare readonly ast: AstInterfaceDeclaration; + + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + get name(): Identifier { return this.ast.data.name.node; } + get typeParameters(): NodeArray | undefined { return this.ast.data.typeParameters?.nodes; } + get heritageClauses(): NodeArray | undefined { return this.ast.data.heritageClauses?.nodes; } + get members(): NodeArray { return this.ast.data.members.nodes; } + + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set name(value) { this.ast.data.name = value.ast; } + /** @internal */ set typeParameters(value) { this.ast.data.typeParameters = value?.ast; } + /** @internal */ set heritageClauses(value) { this.ast.data.heritageClauses = value?.ast; } + /** @internal */ set members(value) { this.ast.data.members = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } -export interface HeritageClause extends Node { - readonly kind: SyntaxKind.HeritageClause; - readonly parent: InterfaceDeclaration | ClassLikeDeclaration; - readonly token: SyntaxKind.ExtendsKeyword | SyntaxKind.ImplementsKeyword; - readonly types: NodeArray; +// dprint-ignore +export class HeritageClause extends Node { + declare readonly ast: AstHeritageClause; + + override get parent() { return super.parent as InterfaceDeclaration | ClassLikeDeclaration; } + + get token(): SyntaxKind.ExtendsKeyword | SyntaxKind.ImplementsKeyword { return this.ast.data.token; } + get types(): NodeArray { return this.ast.data.types.nodes; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set token(value) { this.ast.data.token = value; } + /** @internal */ set types(value) { this.ast.data.types = value.ast; } } -export interface TypeAliasDeclaration extends DeclarationStatement, JSDocContainer, LocalsContainer { - readonly kind: SyntaxKind.TypeAliasDeclaration; - readonly modifiers?: NodeArray | undefined; - readonly name: Identifier; - readonly typeParameters?: NodeArray | undefined; - readonly type: TypeNode; +// dprint-ignore +export class TypeAliasDeclaration extends Node implements DeclarationStatement, JSDocContainer, LocalsContainer { + declare _declarationBrand: any; + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare _localsContainerBrand: any; + declare readonly ast: AstTypeAliasDeclaration; + + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + get name(): Identifier { return this.ast.data.name.node; } + get typeParameters(): NodeArray | undefined { return this.ast.data.typeParameters?.nodes; } + get type(): TypeNode { return this.ast.data.type.node; } + + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set name(value) { this.ast.data.name = value.ast; } + /** @internal */ set typeParameters(value) { this.ast.data.typeParameters = value?.ast; } + /** @internal */ set type(value) { this.ast.data.type = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } } -export interface EnumMember extends NamedDeclaration, JSDocContainer { - readonly kind: SyntaxKind.EnumMember; - readonly parent: EnumDeclaration; - // This does include ComputedPropertyName, but the parser will give an error - // if it parses a ComputedPropertyName in an EnumMember - readonly name: PropertyName; - readonly initializer?: Expression | undefined; +// dprint-ignore +export class EnumMember extends Node implements NamedDeclaration, JSDocContainer { + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare readonly ast: AstEnumMember; + + override get parent() { return super.parent as EnumDeclaration; } + + get name(): PropertyName { return this.ast.data.name.node; } + get initializer(): Expression | undefined { return this.ast.data.initializer?.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set name(value) { this.ast.data.name = value.ast; } + /** @internal */ set initializer(value) { this.ast.data.initializer = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } -export interface EnumDeclaration extends DeclarationStatement, JSDocContainer { - readonly kind: SyntaxKind.EnumDeclaration; - readonly modifiers?: NodeArray | undefined; - readonly name: Identifier; - readonly members: NodeArray; +// dprint-ignore +export class EnumDeclaration extends Node implements DeclarationStatement, JSDocContainer { + declare _declarationBrand: any; + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare readonly ast: AstEnumDeclaration; + + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + get name(): Identifier { return this.ast.data.name.node; } + get members(): NodeArray { return this.ast.data.members.nodes; } + + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set name(value) { this.ast.data.name = value.ast; } + /** @internal */ set members(value) { this.ast.data.members = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } export type ModuleName = @@ -3610,17 +6533,40 @@ export type ModuleBody = | NamespaceBody | JSDocNamespaceBody; +// TODO(rbuckton): Move after ModuleDeclaration /** @internal */ export interface AmbientModuleDeclaration extends ModuleDeclaration { - readonly body?: ModuleBlock | undefined; + readonly body: ModuleBlock | undefined; } -export interface ModuleDeclaration extends DeclarationStatement, JSDocContainer, LocalsContainer { - readonly kind: SyntaxKind.ModuleDeclaration; - readonly parent: ModuleBody | SourceFile; - readonly modifiers?: NodeArray | undefined; - readonly name: ModuleName; - readonly body?: ModuleBody | JSDocNamespaceDeclaration | undefined; +// dprint-ignore +export class ModuleDeclaration extends Node implements DeclarationStatement, JSDocContainer, LocalsContainer { + declare _declarationBrand: any; + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare _localsContainerBrand: any; + declare readonly ast: AstModuleDeclaration; + + override get parent() { return super.parent as ModuleDeclaration | ModuleBlock | SourceFile; } + + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + get name(): ModuleName { return this.ast.data.name.node; } + get body(): ModuleBody | JSDocNamespaceDeclaration | undefined { return this.ast.data.body?.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set name(value) { this.ast.data.name = value.ast; } + /** @internal */ set body(value) { this.ast.data.body = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } } export type NamespaceBody = @@ -3628,6 +6574,8 @@ export type NamespaceBody = | NamespaceDeclaration; export interface NamespaceDeclaration extends ModuleDeclaration { + readonly ast: AstNamespaceDeclaration; + readonly data: AstNamespaceDeclarationData; readonly name: Identifier; readonly body: NamespaceBody; } @@ -3637,14 +6585,27 @@ export type JSDocNamespaceBody = | JSDocNamespaceDeclaration; export interface JSDocNamespaceDeclaration extends ModuleDeclaration { + readonly ast: AstJSDocNamespaceDeclaration; + readonly data: AstJSDocNamespaceDeclarationData; readonly name: Identifier; - readonly body?: JSDocNamespaceBody | undefined; + readonly body: JSDocNamespaceBody | undefined; } -export interface ModuleBlock extends Node, Statement { - readonly kind: SyntaxKind.ModuleBlock; - readonly parent: ModuleDeclaration; - readonly statements: NodeArray; +// TODO(rbuckton): Is this actually a Statement? +// dprint-ignore +export class ModuleBlock extends Node implements Statement, JSDocContainer { + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare readonly ast: AstModuleBlock; + + override get parent() { return super.parent as ModuleDeclaration; } + + get statements(): NodeArray { return this.ast.data.statements.nodes; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set statements(value) { this.ast.data.statements = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } } export type ModuleReference = @@ -3656,37 +6617,80 @@ export type ModuleReference = * - import x = require("mod"); * - import x = M.x; */ -export interface ImportEqualsDeclaration extends DeclarationStatement, JSDocContainer { - readonly kind: SyntaxKind.ImportEqualsDeclaration; - readonly parent: SourceFile | ModuleBlock; - readonly modifiers?: NodeArray | undefined; - readonly name: Identifier; - readonly isTypeOnly: boolean; +// dprint-ignore +export class ImportEqualsDeclaration extends Node implements DeclarationStatement, JSDocContainer { + declare _declarationBrand: any; + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare readonly ast: AstImportEqualsDeclaration; - // 'EntityName' for an internal module reference, 'ExternalModuleReference' for an external - // module reference. - readonly moduleReference: ModuleReference; + override get parent() { return super.parent as ModuleBlock | SourceFile; } + + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + get name(): Identifier { return this.ast.data.name.node; } + get isTypeOnly(): boolean { return this.ast.data.isTypeOnly; } + /** + * 'EntityName' for an internal module reference, 'ExternalModuleReference' for an external module reference. + */ + get moduleReference(): ModuleReference { return this.ast.data.moduleReference.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set name(value) { this.ast.data.name = value.ast; } + /** @internal */ set isTypeOnly(value) { this.ast.data.isTypeOnly = value; } + /** @internal */ set moduleReference(value) { this.ast.data.moduleReference = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } -export interface ExternalModuleReference extends Node { - readonly kind: SyntaxKind.ExternalModuleReference; - readonly parent: ImportEqualsDeclaration; - readonly expression: Expression; +// dprint-ignore +export class ExternalModuleReference extends Node { + declare readonly ast: AstExternalModuleReference; + + override get parent() { return super.parent as ImportEqualsDeclaration; } + + get expression(): Expression { return this.ast.data.expression.node; } + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } } // In case of: // import "mod" => importClause = undefined, moduleSpecifier = "mod" // In rest of the cases, module specifier is string literal corresponding to module // ImportClause information is shown at its declaration below. -export interface ImportDeclaration extends Statement { - readonly kind: SyntaxKind.ImportDeclaration; - readonly parent: SourceFile | ModuleBlock; - readonly modifiers?: NodeArray | undefined; - readonly importClause?: ImportClause | undefined; +// dprint-ignore +export class ImportDeclaration extends Node implements Declaration, JSDocContainer { + declare _declarationBrand: any; + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare readonly ast: AstImportDeclaration; + + override get parent() { return super.parent as ModuleBlock | SourceFile; } + + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + get importClause(): ImportClause | undefined { return this.ast.data.importClause?.node; } /** If this is not a StringLiteral it will be a grammar error. */ - readonly moduleSpecifier: Expression; - /** @deprecated */ readonly assertClause?: AssertClause | undefined; - readonly attributes?: ImportAttributes | undefined; + get moduleSpecifier(): Expression { return this.ast.data.moduleSpecifier.node; } + /** @deprecated */ + get assertClause(): ImportAttributes | undefined { return this.ast.data.attributes?.node; } + get attributes(): ImportAttributes | undefined { return this.ast.data.attributes?.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set importClause(value) { this.ast.data.importClause = value?.ast; } + /** @internal */ set moduleSpecifier(value) { this.ast.data.moduleSpecifier = value.ast; } + /** @internal */ set attributes(value) { this.ast.data.attributes = value?.ast; } + /** @internal */ set assertClause(value) { this.ast.data.attributes = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } export type NamedImportBindings = @@ -3703,12 +6707,25 @@ export type NamedExportBindings = // import d, * as ns from "mod" => name = d, namedBinding: NamespaceImport = { name: ns } // import { a, b as x } from "mod" => name = undefined, namedBinding: NamedImports = { elements: [{ name: a }, { name: x, propertyName: b}]} // import d, { a, b as x } from "mod" => name = d, namedBinding: NamedImports = { elements: [{ name: a }, { name: x, propertyName: b}]} -export interface ImportClause extends NamedDeclaration { - readonly kind: SyntaxKind.ImportClause; - readonly parent: ImportDeclaration | JSDocImportTag; - readonly isTypeOnly: boolean; - readonly name?: Identifier | undefined; // Default binding - readonly namedBindings?: NamedImportBindings | undefined; +// dprint-ignore +export class ImportClause extends Node implements NamedDeclaration { + declare _declarationBrand: any; + declare readonly ast: AstImportClause; + + override get parent() { return super.parent as ImportDeclaration | JSDocImportTag; } + + get isTypeOnly(): boolean { return this.ast.data.isTypeOnly; } + get name(): Identifier | undefined { return this.ast.data.name?.node; } + get namedBindings(): NamedImportBindings | undefined { return this.ast.data.namedBindings?.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set isTypeOnly(value) { this.ast.data.isTypeOnly = value; } + /** @internal */ set name(value) { this.ast.data.name = value?.ast; } + /** @internal */ set namedBindings(value) { this.ast.data.namedBindings = value?.ast; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } /** @deprecated */ @@ -3722,82 +6739,204 @@ export interface AssertClause extends ImportAttributes {} export type ImportAttributeName = Identifier | StringLiteral; -export interface ImportAttribute extends Node { - readonly kind: SyntaxKind.ImportAttribute; - readonly parent: ImportAttributes; - readonly name: ImportAttributeName; - readonly value: Expression; +// dprint-ignore +export class ImportAttribute extends Node { + declare readonly ast: AstImportAttribute; + + override get parent() { return super.parent as ImportAttributes; } + + get name(): ImportAttributeName { return this.ast.data.name.node; } + get value(): Expression { return this.ast.data.value.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set name(value) { this.ast.data.name = value.ast; } + /** @internal */ set value(value) { this.ast.data.value = value.ast; } } -export interface ImportAttributes extends Node { - readonly kind: SyntaxKind.ImportAttributes; - readonly token: SyntaxKind.WithKeyword | SyntaxKind.AssertKeyword; - readonly parent: ImportDeclaration | ExportDeclaration; - readonly elements: NodeArray; - readonly multiLine?: boolean | undefined; +// dprint-ignore +export class ImportAttributes extends Node { + declare readonly ast: AstImportAttributes; + + override get parent() { return super.parent as ImportDeclaration | ExportDeclaration; } + + get token(): SyntaxKind.WithKeyword | SyntaxKind.AssertKeyword { return this.ast.data.token; } + get elements(): NodeArray { return this.ast.data.elements.nodes; } + // TODO(rbuckton): Should this be internal like Block, ObjectLiteralExpression, etc.? + get multiLine(): boolean | undefined { return this.ast.data.multiLine; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set token(value) { this.ast.data.token = value; } + /** @internal */ set elements(value) { this.ast.data.elements = value.ast; } + /** @internal */ set multiLine(value) { this.ast.data.multiLine = value; } } -export interface NamespaceImport extends NamedDeclaration { - readonly kind: SyntaxKind.NamespaceImport; - readonly parent: ImportClause; - readonly name: Identifier; +// dprint-ignore +export class NamespaceImport extends Node implements NamedDeclaration { + declare _declarationBrand: any; + declare readonly ast: AstNamespaceImport; + + override get parent() { return super.parent as ImportClause; } + + get name(): Identifier { return this.ast.data.name.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set name(value) { this.ast.data.name = value.ast; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } -export interface NamespaceExport extends NamedDeclaration { - readonly kind: SyntaxKind.NamespaceExport; - readonly parent: ExportDeclaration; - readonly name: ModuleExportName; +// dprint-ignore +export class NamespaceExport extends Node implements NamedDeclaration { + declare _declarationBrand: any; + declare readonly ast: AstNamespaceExport; + + override get parent() { return super.parent as ExportDeclaration; } + + get name(): ModuleExportName { return this.ast.data.name.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set name(value) { this.ast.data.name = value.ast; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } -export interface NamespaceExportDeclaration extends DeclarationStatement, JSDocContainer { - readonly kind: SyntaxKind.NamespaceExportDeclaration; - readonly name: Identifier; +// dprint-ignore +export class NamespaceExportDeclaration extends Node implements DeclarationStatement, JSDocContainer { + declare _declarationBrand: any; + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare readonly ast: AstNamespaceExportDeclaration; - // The following properties are used only to report grammar errors (see `isGrammarError` in utilities.ts) - /** @internal */ readonly modifiers?: NodeArray | undefined; + get name(): Identifier { return this.ast.data.name.node; } + + /** @internal */ set name(value) { this.ast.data.name = value.ast; } + /** @internal */ get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } -export interface ExportDeclaration extends DeclarationStatement, JSDocContainer { - readonly kind: SyntaxKind.ExportDeclaration; - readonly parent: SourceFile | ModuleBlock; - readonly modifiers?: NodeArray | undefined; - readonly isTypeOnly: boolean; - /** Will not be assigned in the case of `export * from "foo";` */ - readonly exportClause?: NamedExportBindings | undefined; - /** If this is not a StringLiteral it will be a grammar error. */ - readonly moduleSpecifier?: Expression | undefined; - /** @deprecated */ readonly assertClause?: AssertClause | undefined; - readonly attributes?: ImportAttributes | undefined; +// dprint-ignore +export class ExportDeclaration extends Node implements DeclarationStatement, JSDocContainer { + declare _declarationBrand: any; + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare readonly ast: AstExportDeclaration; + + override get parent() { return super.parent as SourceFile | ModuleBlock; } + + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + get isTypeOnly(): boolean { return this.ast.data.isTypeOnly; } + get exportClause(): NamedExportBindings | undefined { return this.ast.data.exportClause?.node; } + get moduleSpecifier(): Expression | undefined { return this.ast.data.moduleSpecifier?.node; } + /** @deprecated */ + get assertClause(): ImportAttributes | undefined { return this.ast.data.attributes?.node; } + get attributes(): ImportAttributes | undefined { return this.ast.data.attributes?.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set isTypeOnly(value) { this.ast.data.isTypeOnly = value; } + /** @internal */ set exportClause(value) { this.ast.data.exportClause = value?.ast; } + /** @internal */ set moduleSpecifier(value) { this.ast.data.moduleSpecifier = value?.ast; } + /** @internal */ set attributes(value) { this.ast.data.attributes = value?.ast; } + /** @internal */ set assertClause(value) { this.ast.data.attributes = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } -export interface NamedImports extends Node { - readonly kind: SyntaxKind.NamedImports; - readonly parent: ImportClause; - readonly elements: NodeArray; +// dprint-ignore +export class NamedImports extends Node { + declare readonly ast: AstNamedImports; + + override get parent() { return super.parent as ImportClause; } + + get elements(): NodeArray { return this.ast.data.elements.nodes; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set elements(value) { this.ast.data.elements = value.ast; } } -export interface NamedExports extends Node { - readonly kind: SyntaxKind.NamedExports; - readonly parent: ExportDeclaration; - readonly elements: NodeArray; +// dprint-ignore +export class NamedExports extends Node { + declare readonly ast: AstNamedExports; + + override get parent() { return super.parent as ExportDeclaration; } + + get elements(): NodeArray { return this.ast.data.elements.nodes; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set elements(value) { this.ast.data.elements = value.ast; } } export type NamedImportsOrExports = NamedImports | NamedExports; -export interface ImportSpecifier extends NamedDeclaration { - readonly kind: SyntaxKind.ImportSpecifier; - readonly parent: NamedImports; - readonly propertyName?: ModuleExportName | undefined; // Name preceding "as" keyword (or undefined when "as" is absent) - readonly name: Identifier; // Declared name - readonly isTypeOnly: boolean; +// dprint-ignore +export class ImportSpecifier extends Node implements NamedDeclaration { + declare _declarationBrand: any; + declare readonly ast: AstImportSpecifier; + + override get parent() { return super.parent as NamedImports; } + + get isTypeOnly(): boolean { return this.ast.data.isTypeOnly; } + /** + * Name preceding "as" keyword (or undefined when "as" is absent) + */ + get propertyName(): ModuleExportName | undefined { return this.ast.data.propertyName?.node; } + /** + * Declared name + */ + get name(): Identifier { return this.ast.data.name.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set propertyName(value) { this.ast.data.propertyName = value?.ast; } + /** @internal */ set name(value) { this.ast.data.name = value.ast; } + /** @internal */ set isTypeOnly(value) { this.ast.data.isTypeOnly = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } -export interface ExportSpecifier extends NamedDeclaration, JSDocContainer { - readonly kind: SyntaxKind.ExportSpecifier; - readonly parent: NamedExports; - readonly isTypeOnly: boolean; - readonly propertyName?: ModuleExportName | undefined; // Name preceding "as" keyword (or undefined when "as" is absent) - readonly name: ModuleExportName; // Declared name +// dprint-ignore +export class ExportSpecifier extends Node implements NamedDeclaration, JSDocContainer { + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare readonly ast: AstExportSpecifier; + + override get parent() { return super.parent as NamedExports; } + + get isTypeOnly(): boolean { return this.ast.data.isTypeOnly; } + /** + * Name preceding "as" keyword (or undefined when "as" is absent) + */ + get propertyName(): ModuleExportName | undefined { return this.ast.data.propertyName?.node; } + /** + * Declared name + */ + get name(): ModuleExportName { return this.ast.data.name.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set isTypeOnly(value) { this.ast.data.isTypeOnly = value; } + /** @internal */ set propertyName(value) { this.ast.data.propertyName = value?.ast; } + /** @internal */ set name(value) { this.ast.data.name = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } export type ModuleExportName = Identifier | StringLiteral; @@ -3832,12 +6971,29 @@ export type TypeOnlyAliasDeclaration = TypeOnlyImportDeclaration | TypeOnlyExpor * This is either an `export =` or an `export default` declaration. * Unless `isExportEquals` is set, this node was parsed as an `export default`. */ -export interface ExportAssignment extends DeclarationStatement, JSDocContainer { - readonly kind: SyntaxKind.ExportAssignment; - readonly parent: SourceFile; - readonly modifiers?: NodeArray | undefined; - readonly isExportEquals?: boolean | undefined; - readonly expression: Expression; +// dprint-ignore +export class ExportAssignment extends Node implements DeclarationStatement, JSDocContainer { + declare _declarationBrand: any; + declare _statementBrand: any; + declare _jsdocContainerBrand: any; + declare readonly ast: AstExportAssignment; + + override get parent() { return super.parent as SourceFile; } + + get modifiers(): NodeArray | undefined { return this.ast.data.modifiers?.nodes; } + get isExportEquals(): boolean | undefined { return this.ast.data.isExportEquals; } + get expression(): Expression { return this.ast.data.expression.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set modifiers(value) { this.ast.data.modifiers = value?.ast; } + /** @internal */ set isExportEquals(value) { this.ast.data.isExportEquals = value; } + /** @internal */ set expression(value) { this.ast.data.expression = value.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value: JSDocArray | undefined) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } export interface FileReference extends TextRange { @@ -3865,64 +7021,144 @@ export interface SynthesizedComment extends CommentRange { } // represents a top level: { type } expression in a JSDoc comment. -export interface JSDocTypeExpression extends TypeNode { - readonly kind: SyntaxKind.JSDocTypeExpression; - readonly type: TypeNode; +// dprint-ignore +export class JSDocTypeExpression extends Node implements TypeNode { + declare _typeNodeBrand: any; + declare readonly ast: AstJSDocTypeExpression; + + get type(): TypeNode { return this.ast.data.type.node; } + + /** @internal */ set type(value) { this.ast.data.type = value.ast; } } -export interface JSDocNameReference extends Node { - readonly kind: SyntaxKind.JSDocNameReference; - readonly name: EntityName | JSDocMemberName; +// dprint-ignore +export class JSDocNameReference extends Node { + declare readonly ast: AstJSDocNameReference; + + get name(): EntityName | JSDocMemberName { return this.ast.data.name.node; } + + /** @internal */ set name(value) { this.ast.data.name = value.ast; } } + /** Class#method reference in JSDoc */ -export interface JSDocMemberName extends Node { - readonly kind: SyntaxKind.JSDocMemberName; - readonly left: EntityName | JSDocMemberName; - readonly right: Identifier; +// dprint-ignore +export class JSDocMemberName extends Node { + declare readonly ast: AstJSDocMemberName; + + get left(): EntityName | JSDocMemberName { return this.ast.data.left.node; } + get right(): Identifier { return this.ast.data.right.node; } + + /** @internal */ set left(value) { this.ast.data.left = value.ast; } + /** @internal */ set right(value) { this.ast.data.right = value.ast; } } export interface JSDocType extends TypeNode { _jsDocTypeBrand: any; } -export interface JSDocAllType extends JSDocType { - readonly kind: SyntaxKind.JSDocAllType; +// dprint-ignore +export class JSDocAllType extends Node implements JSDocType { + declare _jsDocTypeBrand: any; + declare _typeNodeBrand: any; + declare readonly ast: AstJSDocAllType; } -export interface JSDocUnknownType extends JSDocType { - readonly kind: SyntaxKind.JSDocUnknownType; +// dprint-ignore +export class JSDocUnknownType extends Node implements JSDocType { + declare _jsDocTypeBrand: any; + declare _typeNodeBrand: any; + declare readonly ast: AstJSDocUnknownType; } -export interface JSDocNonNullableType extends JSDocType { - readonly kind: SyntaxKind.JSDocNonNullableType; - readonly type: TypeNode; - readonly postfix: boolean; +// dprint-ignore +export class JSDocNonNullableType extends Node implements JSDocType { + declare _jsDocTypeBrand: any; + declare _typeNodeBrand: any; + declare readonly ast: AstJSDocNonNullableType; + + get type(): TypeNode { return this.ast.data.type.node; } + get postfix(): boolean { return this.ast.data.postfix; } + + /** @internal */ set type(value) { this.ast.data.type = value.ast; } + /** @internal */ set postfix(value) { this.ast.data.postfix = value; } } -export interface JSDocNullableType extends JSDocType { - readonly kind: SyntaxKind.JSDocNullableType; - readonly type: TypeNode; - readonly postfix: boolean; +// dprint-ignore +export class JSDocNullableType extends Node implements JSDocType { + declare _jsDocTypeBrand: any; + declare _typeNodeBrand: any; + declare readonly ast: AstJSDocNullableType; + + get type(): TypeNode { return this.ast.data.type.node; } + get postfix(): boolean { return this.ast.data.postfix; } + + /** @internal */ set type(value) { this.ast.data.type = value.ast; } + /** @internal */ set postfix(value) { this.ast.data.postfix = value; } } -export interface JSDocOptionalType extends JSDocType { - readonly kind: SyntaxKind.JSDocOptionalType; - readonly type: TypeNode; +// dprint-ignore +export class JSDocOptionalType extends Node implements JSDocType { + declare _jsDocTypeBrand: any; + declare _typeNodeBrand: any; + declare readonly ast: AstJSDocOptionalType; + + get type(): TypeNode { return this.ast.data.type.node; } + + /** @internal */ set type(value) { this.ast.data.type = value.ast; } } -export interface JSDocFunctionType extends JSDocType, SignatureDeclarationBase, LocalsContainer { - readonly kind: SyntaxKind.JSDocFunctionType; +// dprint-ignore +export class JSDocFunctionType extends Node implements JSDocType, SignatureDeclarationBase, LocalsContainer { + declare _signatureDeclarationBrand: any; + declare _jsDocTypeBrand: any; + declare _typeNodeBrand: any; + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare _localsContainerBrand: any; + declare readonly ast: AstJSDocFunctionType; + + get typeParameters(): NodeArray | undefined { return this.ast.data.typeParameters?.nodes; } + get parameters(): NodeArray { return this.ast.data.parameters.nodes; } + get type(): TypeNode | undefined { return this.ast.data.type?.node; } + get typeArguments(): NodeArray | undefined { return this.ast.data.typeArguments?.nodes; } + + /** @internal */ set typeParameters(value) { this.ast.data.typeParameters = value?.ast; } + /** @internal */ set parameters(value) { this.ast.data.parameters = value.ast; } + /** @internal */ set type(value) { this.ast.data.type = value?.ast; } + /** @internal */ set typeArguments(value) { this.ast.data.typeArguments = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } } -export interface JSDocVariadicType extends JSDocType { - readonly kind: SyntaxKind.JSDocVariadicType; - readonly type: TypeNode; +// dprint-ignore +export class JSDocVariadicType extends Node implements JSDocType { + declare _jsDocTypeBrand: any; + declare _typeNodeBrand: any; + declare readonly ast: AstJSDocVariadicType; + + get type(): TypeNode { return this.ast.data.type.node; } + + /** @internal */ set type(value) { this.ast.data.type = value.ast; } } -export interface JSDocNamepathType extends JSDocType { - readonly kind: SyntaxKind.JSDocNamepathType; - readonly type: TypeNode; +// dprint-ignore +export class JSDocNamepathType extends Node implements JSDocType { + declare _jsDocTypeBrand: any; + declare _typeNodeBrand: any; + declare readonly ast: AstJSDocNamepathType; + + get type(): TypeNode { return this.ast.data.type.node; } + + /** @internal */ set type(value) { this.ast.data.type = value.ast; } } export type JSDocTypeReferencingNode = @@ -3931,49 +7167,93 @@ export type JSDocTypeReferencingNode = | JSDocNullableType | JSDocNonNullableType; -export interface JSDoc extends Node { - readonly kind: SyntaxKind.JSDoc; - readonly parent: HasJSDoc; - readonly tags?: NodeArray | undefined; - readonly comment?: string | NodeArray | undefined; +// dprint-ignore +export class JSDoc extends Node { + declare readonly ast: AstJSDoc; + + override get parent() { return super.parent as HasJSDoc; } + + get tags(): NodeArray | undefined { return this.ast.data.tags?.nodes; } + get comment(): string | NodeArray | undefined { + const comment = this.ast.data.comment; + return typeof comment === "string" ? comment : comment?.nodes; + } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set tags(value) { this.ast.data.tags = value?.ast; } + /** @internal */ set comment(value) { this.ast.data.comment = typeof value === "string" ? value : value?.ast; } } -export interface JSDocTag extends Node { - readonly parent: JSDoc | JSDocTypeLiteral; - readonly tagName: Identifier; - readonly comment?: string | NodeArray | undefined; +// TODO(rbuckton): Move after JSDocText +// dprint-ignore +export class JSDocTag extends Node { + declare readonly ast: AstBaseJSDocTag; + + override get parent() { return super.parent as JSDoc | JSDocTypeLiteral; } + + get tagName(): Identifier { return this.ast.data.tagName.node; } + get comment(): string | NodeArray | undefined { + const comment = this.ast.data.comment; + return typeof comment === "string" ? comment : comment?.nodes; + } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set tagName(value) { this.ast.data.tagName = value.ast; } + /** @internal */ set comment(value) { this.ast.data.comment = typeof value === "string" ? value : value?.ast; } } -export interface JSDocLink extends Node { - readonly kind: SyntaxKind.JSDocLink; - readonly name?: EntityName | JSDocMemberName | undefined; - text: string; +// dprint-ignore +export class JSDocLink extends Node { + declare readonly ast: AstJSDocLink; + + get name(): EntityName | JSDocMemberName | undefined { return this.ast.data.name?.node; } + get text(): string { return this.ast.data.text; } + + /** @internal */ set name(value) { this.ast.data.name = value?.ast; } + /** @internal */ set text(value) { this.ast.data.text = value; } } -export interface JSDocLinkCode extends Node { - readonly kind: SyntaxKind.JSDocLinkCode; - readonly name?: EntityName | JSDocMemberName | undefined; - text: string; +// dprint-ignore +export class JSDocLinkCode extends Node { + declare readonly ast: AstJSDocLinkCode; + + get name(): EntityName | JSDocMemberName | undefined { return this.ast.data.name?.node; } + get text(): string { return this.ast.data.text; } + + /** @internal */ set name(value) { this.ast.data.name = value?.ast; } + /** @internal */ set text(value) { this.ast.data.text = value; } } -export interface JSDocLinkPlain extends Node { - readonly kind: SyntaxKind.JSDocLinkPlain; - readonly name?: EntityName | JSDocMemberName | undefined; - text: string; +// dprint-ignore +export class JSDocLinkPlain extends Node { + declare readonly ast: AstJSDocLinkPlain; + + get name(): EntityName | JSDocMemberName | undefined { return this.ast.data.name?.node; } + get text(): string { return this.ast.data.text; } + + /** @internal */ set name(value) { this.ast.data.name = value?.ast; } + /** @internal */ set text(value) { this.ast.data.text = value; } } export type JSDocComment = JSDocText | JSDocLink | JSDocLinkCode | JSDocLinkPlain; -export interface JSDocText extends Node { - readonly kind: SyntaxKind.JSDocText; - text: string; +// dprint-ignore +export class JSDocText extends Node { + declare readonly ast: AstJSDocText; + + get text(): string { return this.ast.data.text; } + + /** @internal */ set text(value) { this.ast.data.text = value; } } -export interface JSDocUnknownTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocTag; +// dprint-ignore +export class JSDocUnknownTag extends JSDocTag { + declare readonly ast: AstJSDocUnknownTag; } export interface JSDocClassReference extends ExpressionWithTypeArguments { + readonly ast: AstJSDocClassReference; + readonly data: AstJSDocClassReferenceData; readonly expression: Identifier | PropertyAccessEntityNameExpression; } @@ -3981,115 +7261,238 @@ export interface JSDocClassReference extends ExpressionWithTypeArguments { * Note that `@extends` is a synonym of `@augments`. * Both tags are represented by this interface. */ -export interface JSDocAugmentsTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocAugmentsTag; - readonly class: JSDocClassReference; +// dprint-ignore +export class JSDocAugmentsTag extends JSDocTag { + declare readonly ast: AstJSDocAugmentsTag; + + get class(): JSDocClassReference { return this.ast.data.class.node; } + + /** @internal */ set class(value) { this.ast.data.class = value.ast; } } -export interface JSDocImplementsTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocImplementsTag; - readonly class: JSDocClassReference; +// dprint-ignore +export class JSDocImplementsTag extends JSDocTag { + declare readonly ast: AstJSDocImplementsTag; + + get class(): JSDocClassReference { return this.ast.data.class.node; } + + /** @internal */ set class(value) { this.ast.data.class = value.ast; } } -export interface JSDocAuthorTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocAuthorTag; +// dprint-ignore +export class JSDocAuthorTag extends JSDocTag { + declare readonly ast: AstJSDocAuthorTag; } -export interface JSDocDeprecatedTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocDeprecatedTag; +// dprint-ignore +export class JSDocDeprecatedTag extends JSDocTag { + declare readonly ast: AstJSDocDeprecatedTag; } -export interface JSDocClassTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocClassTag; +// dprint-ignore +export class JSDocClassTag extends JSDocTag { + declare readonly ast: AstJSDocClassTag; } -export interface JSDocPublicTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocPublicTag; +// dprint-ignore +export class JSDocPublicTag extends JSDocTag { + declare readonly ast: AstJSDocPublicTag; } -export interface JSDocPrivateTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocPrivateTag; +// dprint-ignore +export class JSDocPrivateTag extends JSDocTag { + declare readonly ast: AstJSDocPrivateTag; } -export interface JSDocProtectedTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocProtectedTag; +// dprint-ignore +export class JSDocProtectedTag extends JSDocTag { + declare readonly ast: AstJSDocProtectedTag; } -export interface JSDocReadonlyTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocReadonlyTag; +// dprint-ignore +export class JSDocReadonlyTag extends JSDocTag { + declare readonly ast: AstJSDocReadonlyTag; } -export interface JSDocOverrideTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocOverrideTag; +// dprint-ignore +export class JSDocOverrideTag extends JSDocTag { + declare readonly ast: AstJSDocOverrideTag; } -export interface JSDocEnumTag extends JSDocTag, Declaration, LocalsContainer { - readonly kind: SyntaxKind.JSDocEnumTag; - readonly parent: JSDoc; - readonly typeExpression: JSDocTypeExpression; +// dprint-ignore +export class JSDocEnumTag extends JSDocTag implements Declaration, LocalsContainer { + declare _declarationBrand: any; + declare _localsContainerBrand: any; + declare readonly ast: AstJSDocEnumTag; + + override get parent() { return super.parent as JSDoc; } + + get typeExpression(): JSDocTypeExpression { return this.ast.data.typeExpression.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set typeExpression(value) { this.ast.data.typeExpression = value.ast; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } } -export interface JSDocThisTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocThisTag; - readonly typeExpression: JSDocTypeExpression; +// dprint-ignore +export class JSDocThisTag extends JSDocTag { + declare readonly ast: AstJSDocThisTag; + + get typeExpression(): JSDocTypeExpression { return this.ast.data.typeExpression.node; } + + /** @internal */ set typeExpression(value) { this.ast.data.typeExpression = value.ast; } } -export interface JSDocTemplateTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocTemplateTag; - readonly constraint: JSDocTypeExpression | undefined; - readonly typeParameters: NodeArray; +// dprint-ignore +export class JSDocTemplateTag extends JSDocTag { + declare readonly ast: AstJSDocTemplateTag; + + get constraint(): JSDocTypeExpression | undefined { return this.ast.data.constraint?.node; } + get typeParameters(): NodeArray { return this.ast.data.typeParameters.nodes; } + + /** @internal */ set constraint(value) { this.ast.data.constraint = value?.ast; } + /** @internal */ set typeParameters(value) { this.ast.data.typeParameters = value.ast; } } -export interface JSDocSeeTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocSeeTag; - readonly name?: JSDocNameReference | undefined; +// dprint-ignore +export class JSDocSeeTag extends JSDocTag { + declare readonly ast: AstJSDocSeeTag; + + get name(): JSDocNameReference | undefined { return this.ast.data.name?.node; } + + /** @internal */ set name(value) { this.ast.data.name = value?.ast; } } -export interface JSDocReturnTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocReturnTag; - readonly typeExpression?: JSDocTypeExpression | undefined; +// dprint-ignore +export class JSDocReturnTag extends JSDocTag { + declare readonly ast: AstJSDocReturnTag; + + get typeExpression(): JSDocTypeExpression | undefined { return this.ast.data.typeExpression?.node; } + + /** @internal */ set typeExpression(value) { this.ast.data.typeExpression = value?.ast; } } -export interface JSDocTypeTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocTypeTag; - readonly typeExpression: JSDocTypeExpression; +// dprint-ignore +export class JSDocTypeTag extends JSDocTag { + declare readonly ast: AstJSDocTypeTag; + + get typeExpression(): JSDocTypeExpression { return this.ast.data.typeExpression.node; } + + /** @internal */ set typeExpression(value) { this.ast.data.typeExpression = value.ast; } } -export interface JSDocTypedefTag extends JSDocTag, NamedDeclaration, LocalsContainer { - readonly kind: SyntaxKind.JSDocTypedefTag; - readonly parent: JSDoc; - readonly fullName?: JSDocNamespaceDeclaration | Identifier | undefined; - readonly name?: Identifier | undefined; - readonly typeExpression?: JSDocTypeExpression | JSDocTypeLiteral | undefined; +// dprint-ignore +export class JSDocTypedefTag extends JSDocTag implements Declaration, LocalsContainer { + declare _declarationBrand: any; + declare _localsContainerBrand: any; + declare readonly ast: AstJSDocTypedefTag; + + override get parent() { return super.parent as JSDoc; } + + get fullName(): Identifier | JSDocNamespaceDeclaration | undefined { return this.ast.data.fullName?.node; } + get name(): Identifier | undefined { return this.ast.data.name?.node; } + get typeExpression(): JSDocTypeLiteral | JSDocTypeExpression | undefined { return this.ast.data.typeExpression?.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set fullName(value) { this.ast.data.fullName = value?.ast; } + /** @internal */ set name(value) { this.ast.data.name = value?.ast; } + /** @internal */ set typeExpression(value) { this.ast.data.typeExpression = value?.ast; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } } -export interface JSDocCallbackTag extends JSDocTag, NamedDeclaration, LocalsContainer { - readonly kind: SyntaxKind.JSDocCallbackTag; - readonly parent: JSDoc; - readonly fullName?: JSDocNamespaceDeclaration | Identifier | undefined; - readonly name?: Identifier | undefined; - readonly typeExpression: JSDocSignature; +// dprint-ignore +export class JSDocCallbackTag extends JSDocTag implements Declaration, LocalsContainer { + declare _declarationBrand: any; + declare _localsContainerBrand: any; + declare readonly ast: AstJSDocCallbackTag; + + override get parent() { return super.parent as JSDoc; } + + get fullName(): Identifier | JSDocNamespaceDeclaration | undefined { return this.ast.data.fullName?.node; } + get name(): Identifier | undefined { return this.ast.data.name?.node; } + get typeExpression(): JSDocSignature { return this.ast.data.typeExpression.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set fullName(value) { this.ast.data.fullName = value?.ast; } + /** @internal */ set name(value) { this.ast.data.name = value?.ast; } + /** @internal */ set typeExpression(value) { this.ast.data.typeExpression = value.ast; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } } -export interface JSDocOverloadTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocOverloadTag; - readonly parent: JSDoc; - readonly typeExpression: JSDocSignature; +// dprint-ignore +export class JSDocOverloadTag extends JSDocTag { + declare readonly ast: AstJSDocOverloadTag; + + override get parent() { return super.parent as JSDoc; } + + get typeExpression(): JSDocSignature { return this.ast.data.typeExpression.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set typeExpression(value) { this.ast.data.typeExpression = value.ast; } } -export interface JSDocThrowsTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocThrowsTag; - readonly typeExpression?: JSDocTypeExpression | undefined; +// dprint-ignore +export class JSDocThrowsTag extends JSDocTag { + declare readonly ast: AstJSDocThrowsTag; + + get typeExpression(): JSDocTypeExpression | undefined { return this.ast.data.typeExpression?.node; } + + /** @internal */ set typeExpression(value) { this.ast.data.typeExpression = value?.ast; } } -export interface JSDocSignature extends JSDocType, Declaration, JSDocContainer, LocalsContainer { - readonly kind: SyntaxKind.JSDocSignature; - readonly typeParameters?: readonly JSDocTemplateTag[] | undefined; - readonly parameters: readonly JSDocParameterTag[]; - readonly type: JSDocReturnTag | undefined; +// dprint-ignore +export class JSDocSignature extends Node implements JSDocType, Declaration, JSDocContainer, LocalsContainer { + declare _jsDocTypeBrand: any; + declare _typeNodeBrand: any; + declare _declarationBrand: any; + declare _jsdocContainerBrand: any; + declare _localsContainerBrand: any; + declare _signatureDeclarationBrand: any; + declare readonly ast: AstJSDocSignature; + + get typeParameters(): NodeArray | undefined { return this.ast.data.typeParameters?.nodes; } + get parameters(): NodeArray { return this.ast.data.parameters.nodes; } + get type(): JSDocReturnTag | undefined { return this.ast.data.type?.node; } + + /** @internal */ set typeParameters(value) { this.ast.data.typeParameters = value?.ast; } + /** @internal */ set parameters(value) { this.ast.data.parameters = value.ast; } + /** @internal */ set type(value) { this.ast.data.type = value?.ast; } + /** @internal */ get jsDoc(): JSDocArray | undefined { return this.ast.data.jsDoc; } + /** @internal */ set jsDoc(value) { this.ast.data.jsDoc = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } } export interface JSDocPropertyLikeTag extends JSDocTag, Declaration { + readonly ast: AstJSDocPropertyLikeTag; + readonly data: AstJSDocTagData & AstDeclarationData; readonly parent: JSDoc; readonly name: EntityName; readonly typeExpression?: JSDocTypeExpression | undefined; @@ -4098,24 +7501,80 @@ export interface JSDocPropertyLikeTag extends JSDocTag, Declaration { readonly isBracketed: boolean; } -export interface JSDocPropertyTag extends JSDocPropertyLikeTag { - readonly kind: SyntaxKind.JSDocPropertyTag; +// dprint-ignore +export class JSDocPropertyTag extends JSDocTag implements JSDocPropertyLikeTag, Declaration { + declare _declarationBrand: any; + declare readonly ast: AstJSDocPropertyTag; + + override get parent() { return super.parent as JSDoc; } + + get name(): Identifier | QualifiedName { return this.ast.data.name.node; } + get typeExpression(): JSDocTypeExpression | undefined { return this.ast.data.typeExpression?.node; } + /** Whether the property name came before the type -- non-standard for JSDoc, but Typescript-like */ + get isNameFirst(): boolean { return this.ast.data.isNameFirst; } + get isBracketed(): boolean { return this.ast.data.isBracketed; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set name(value) { this.ast.data.name = value.ast; } + /** @internal */ set typeExpression(value) { this.ast.data.typeExpression = value?.ast; } + /** @internal */ set isNameFirst(value) { this.ast.data.isNameFirst = value; } + /** @internal */ set isBracketed(value) { this.ast.data.isBracketed = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } -export interface JSDocParameterTag extends JSDocPropertyLikeTag { - readonly kind: SyntaxKind.JSDocParameterTag; +// dprint-ignore +export class JSDocParameterTag extends JSDocTag implements JSDocPropertyLikeTag { + declare _declarationBrand: any; + declare readonly ast: AstJSDocParameterTag; + + override get parent() { return super.parent as JSDoc; } + + get name(): Identifier | QualifiedName { return this.ast.data.name.node; } + get typeExpression(): JSDocTypeExpression | undefined { return this.ast.data.typeExpression?.node; } + /** Whether the property name came before the type -- non-standard for JSDoc, but Typescript-like */ + get isNameFirst(): boolean { return this.ast.data.isNameFirst; } + get isBracketed(): boolean { return this.ast.data.isBracketed; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set name(value) { this.ast.data.name = value.ast; } + /** @internal */ set typeExpression(value) { this.ast.data.typeExpression = value?.ast; } + /** @internal */ set isNameFirst(value) { this.ast.data.isNameFirst = value; } + /** @internal */ set isBracketed(value) { this.ast.data.isBracketed = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } -export interface JSDocTypeLiteral extends JSDocType, Declaration { - readonly kind: SyntaxKind.JSDocTypeLiteral; - readonly jsDocPropertyTags?: readonly JSDocPropertyLikeTag[] | undefined; +// dprint-ignore +export class JSDocTypeLiteral extends Node implements JSDocType, Declaration { + declare _jsDocTypeBrand: any; + declare _typeNodeBrand: any; + declare _declarationBrand: any; + declare readonly ast: AstJSDocTypeLiteral; + + get jsDocPropertyTags(): NodeArray | undefined { return this.ast.data.jsDocPropertyTags?.nodes; } /** If true, then this type literal represents an *array* of its type. */ - readonly isArrayType: boolean; + get isArrayType(): boolean { return this.ast.data.isArrayType; } + + /** @internal */ set jsDocPropertyTags(value) { this.ast.data.jsDocPropertyTags = value?.ast; } + /** @internal */ set isArrayType(value) { this.ast.data.isArrayType = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.symbol; } + /** @internal */ set symbol(value) { this.ast.data.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.localSymbol = value; } } -export interface JSDocSatisfiesTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocSatisfiesTag; - readonly typeExpression: JSDocTypeExpression; +// dprint-ignore +export class JSDocSatisfiesTag extends JSDocTag { + declare readonly ast: AstJSDocSatisfiesTag; + + get typeExpression(): JSDocTypeExpression { return this.ast.data.typeExpression.node; } + + /** @internal */ set typeExpression(value) { this.ast.data.typeExpression = value.ast; } } /** @internal */ @@ -4123,12 +7582,20 @@ export interface JSDocSatisfiesExpression extends ParenthesizedExpression { readonly _jsDocSatisfiesExpressionBrand: never; } -export interface JSDocImportTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocImportTag; - readonly parent: JSDoc; - readonly importClause?: ImportClause | undefined; - readonly moduleSpecifier: Expression; - readonly attributes?: ImportAttributes | undefined; +// dprint-ignore +export class JSDocImportTag extends JSDocTag { + declare readonly ast: AstJSDocImportTag; + + override get parent() { return super.parent as JSDoc; } + + get importClause(): ImportClause | undefined { return this.ast.data.importClause?.node; } + get moduleSpecifier(): Expression { return this.ast.data.moduleSpecifier.node; } + get attributes(): ImportAttributes | undefined { return this.ast.data.attributes?.node; } + + /** @internal */ override set parent(value) { super.parent = value; } + /** @internal */ set importClause(value) { this.ast.data.importClause = value?.ast; } + /** @internal */ set moduleSpecifier(value) { this.ast.data.moduleSpecifier = value.ast; } + /** @internal */ set attributes(value) { this.ast.data.attributes = value?.ast; } } // NOTE: Ensure this is up-to-date with src/debug/debug.ts @@ -4304,52 +7771,23 @@ export interface RedirectInfo { export type ResolutionMode = ModuleKind.ESNext | ModuleKind.CommonJS | undefined; // Source files are declarations when they are external modules. -export interface SourceFile extends Declaration, LocalsContainer { - readonly kind: SyntaxKind.SourceFile; - readonly statements: NodeArray; - readonly endOfFileToken: Token; - - fileName: string; - /** @internal */ path: Path; - text: string; - /** Resolved path can be different from path property, - * when file is included through project reference is mapped to its output instead of source - * in that case resolvedPath = path to output file - * path = input file's path - * - * @internal - */ - resolvedPath: Path; - /** Original file name that can be different from fileName, - * when file is included through project reference is mapped to its output instead of source - * in that case originalFileName = name of input file - * fileName = output file's name - * - * @internal - */ - originalFileName: string; - - /** - * If two source files are for the same version of the same package, one will redirect to the other. - * (See `createRedirectSourceFile` in program.ts.) - * The redirect will have this set. The redirected-to source file will be in `redirectTargetsMap`. - * - * @internal - */ - redirectInfo?: RedirectInfo | undefined; - - amdDependencies: readonly AmdDependency[]; - moduleName?: string | undefined; - referencedFiles: readonly FileReference[]; - typeReferenceDirectives: readonly FileReference[]; - libReferenceDirectives: readonly FileReference[]; - languageVariant: LanguageVariant; - isDeclarationFile: boolean; - - // this map is used by transpiler to supply alternative names for dependencies (i.e. in case of bundling) - /** @internal */ - renamedDependencies?: ReadonlyMap | undefined; +// dprint-ignore +export class SourceFile extends Node implements Declaration, LocalsContainer, ReadonlyPragmaContext { + declare _declarationBrand: any; + declare _localsContainerBrand: any; + declare readonly ast: AstSourceFile; + get statements(): NodeArray { return this.ast.data.statements.nodes; } + get endOfFileToken(): EndOfFileToken { return this.ast.data.endOfFileToken.node; } + get fileName(): string { return this.ast.data.fileName; } + get text(): string { return this.ast.data.text; } + get amdDependencies(): AmdDependency[] { return this.ast.data.amdDependencies; } + get moduleName(): string | undefined { return this.ast.data.moduleName; } + get referencedFiles(): readonly FileReference[] { return this.ast.data.referencedFiles; } + get typeReferenceDirectives(): readonly FileReference[] { return this.ast.data.typeReferenceDirectives; } + get libReferenceDirectives(): readonly FileReference[] { return this.ast.data.libReferenceDirectives; } + get languageVariant(): LanguageVariant { return this.ast.data.languageVariant; } + get isDeclarationFile(): boolean { return this.ast.data.isDeclarationFile; } /** * lib.d.ts should have a reference comment like * @@ -4358,10 +7796,8 @@ export interface SourceFile extends Declaration, LocalsContainer { * If any other file has this comment, it signals not to include lib.d.ts * because this containing file is intended to act as a default library. */ - hasNoDefaultLib: boolean; - - languageVersion: ScriptTarget; - + get hasNoDefaultLib(): boolean { return this.ast.data.hasNoDefaultLib; } + get languageVersion(): ScriptTarget { return this.ast.data.languageVersion; } /** * When `module` is `Node16` or `NodeNext`, this field controls whether the * source file in question is an ESNext-output-format file, or a CommonJS-output-format @@ -4379,101 +7815,374 @@ export interface SourceFile extends Declaration, LocalsContainer { * of `node`). If so, this field will be unset and source files will be considered to be * CommonJS-output-format by the node module transformer and type checker, regardless of extension or context. */ - impliedNodeFormat?: ResolutionMode | undefined; - /** @internal */ packageJsonLocations?: readonly string[] | undefined; - /** @internal */ packageJsonScope?: PackageJsonInfo | undefined; + get impliedNodeFormat(): ResolutionMode { return this.ast.data.impliedNodeFormat; } - /** @internal */ scriptKind: ScriptKind; + /** @internal */ set statements(value) { this.ast.data.statements = value.ast; } + /** @internal */ set endOfFileToken(value) { this.ast.data.endOfFileToken = value.ast; } + /** @internal */ set fileName(value) { this.ast.data.fileName = value; } + /** @internal */ get path(): Path { return this.ast.data.path; } + /** @internal */ set path(value) { this.ast.data.path = value; } + /** @internal */ set text(value) { this.ast.data.text = value; } + /** @internal */ get resolvedPath(): Path { return this.ast.data.resolvedPath; } + /** @internal */ set resolvedPath(value) { this.ast.data.resolvedPath = value; } + /** @internal */ get originalFileName(): string { return this.ast.data.originalFileName; } + /** @internal */ set originalFileName(value) { this.ast.data.originalFileName = value; } + /** @internal */ set amdDependencies(value) { this.ast.data.amdDependencies = value; } + /** @internal */ set moduleName(value) { this.ast.data.moduleName = value; } + /** @internal */ set referencedFiles(value) { this.ast.data.referencedFiles = value; } + /** @internal */ set typeReferenceDirectives(value) { this.ast.data.typeReferenceDirectives = value; } + /** @internal */ set libReferenceDirectives(value) { this.ast.data.libReferenceDirectives = value; } + /** @internal */ set languageVariant(value) { this.ast.data.languageVariant = value; } + /** @internal */ set isDeclarationFile(value) { this.ast.data.isDeclarationFile = value; } + /** @internal */ get renamedDependencies(): Map { return this.ast.data.renamedDependencies; } + /** @internal */ set renamedDependencies(value) { this.ast.data.renamedDependencies = value; } + /** @internal */ set hasNoDefaultLib(value) { this.ast.data.hasNoDefaultLib = value; } + /** @internal */ set languageVersion(value) { this.ast.data.languageVersion = value; } + /** @internal */ set impliedNodeFormat(value) { this.ast.data.impliedNodeFormat = value; } + /** @internal */ get scriptKind(): ScriptKind { return this.ast.data.scriptKind; } + /** @internal */ set scriptKind(value) { this.ast.data.scriptKind = value; } + /** @internal */ get pragmas(): ReadonlyPragmaMap { return this.ast.data.pragmas; } + /** @internal */ set pragmas(value) { this.ast.data.pragmas = value; } + /** @internal */ get externalModuleIndicator(): true | Node | undefined { return this.ast.data.externalModuleIndicator; } + /** @internal */ set externalModuleIndicator(value) { this.ast.data.externalModuleIndicator = value; } + /** @internal */ get commonJsModuleIndicator(): Node | undefined { return this.ast.data.commonJsModuleIndicator; } + /** @internal */ set commonJsModuleIndicator(value) { this.ast.data.commonJsModuleIndicator = value; } + /** @internal */ get identifiers(): Map { return this.ast.data.identifiers; } + /** @internal */ set identifiers(value) { this.ast.data.identifiers = value; } + /** @internal */ get parseDiagnostics(): DiagnosticWithLocation[] { return this.ast.data.parseDiagnostics; } + /** @internal */ set parseDiagnostics(value) { this.ast.data.parseDiagnostics = value; } + /** @internal */ get bindDiagnostics(): DiagnosticWithLocation[] { return this.ast.data.bindDiagnostics; } + /** @internal */ set bindDiagnostics(value) { this.ast.data.bindDiagnostics = value; } + /** @internal */ get bindSuggestionDiagnostics(): DiagnosticWithLocation[] | undefined { return this.ast.data.bindSuggestionDiagnostics; } + /** @internal */ set bindSuggestionDiagnostics(value) { this.ast.data.bindSuggestionDiagnostics = value; } + /** @internal */ get lineMap(): readonly number[] { return this.ast.data.lineMap; } + /** @internal */ set lineMap(value) { this.ast.data.lineMap = value; } + /** @internal */ get jsDocDiagnostics(): DiagnosticWithLocation[] | undefined { return this.ast.data.jsDocDiagnostics; } + /** @internal */ set jsDocDiagnostics(value) { this.ast.data.jsDocDiagnostics = value; } + /** @internal */ get commentDirectives(): CommentDirective[] | undefined { return this.ast.data.commentDirectives; } + /** @internal */ set commentDirectives(value) { this.ast.data.commentDirectives = value; } + /** @internal */ get checkJsDirective(): CheckJsDirective | undefined { return this.ast.data.checkJsDirective; } + /** @internal */ set checkJsDirective(value) { this.ast.data.checkJsDirective = value; } + /** @internal */ get version(): string { return this.ast.data.version; } + /** @internal */ set version(value) { this.ast.data.version = value; } + /** @internal */ get symbol(): Symbol { return this.ast.data.declaration.symbol; } + /** @internal */ set symbol(value) { this.ast.data.declaration.symbol = value; } + /** @internal */ get localSymbol(): Symbol | undefined { return this.ast.data.declaration.localSymbol; } + /** @internal */ set localSymbol(value) { this.ast.data.declaration.localSymbol = value; } + /** @internal */ get locals(): SymbolTable | undefined { return this.ast.data.locals; } + /** @internal */ set locals(value) { this.ast.data.locals = value; } + /** @internal */ get redirectInfo(): RedirectInfo | undefined { return this.ast.data.redirectInfo; } + /** @internal */ set redirectInfo(value) { this.ast.data.redirectInfo = value; } + /** @internal */ get packageJsonLocations(): readonly string[] | undefined { return this.ast.data.packageJsonLocations; } + /** @internal */ set packageJsonLocations(value) { this.ast.data.packageJsonLocations = value; } + /** @internal */ get packageJsonScope(): PackageJsonInfo | undefined { return this.ast.data.packageJsonScope; } + /** @internal */ set packageJsonScope(value) { this.ast.data.packageJsonScope = value; } + /** @internal */ get setExternalModuleIndicator(): ((file: SourceFile) => void) | undefined { return this.ast.data.setExternalModuleIndicator; } + /** @internal */ set setExternalModuleIndicator(value) { this.ast.data.setExternalModuleIndicator = value; } + /** @internal */ get jsGlobalAugmentations(): SymbolTable | undefined { return this.ast.data.jsGlobalAugmentations; } + /** @internal */ set jsGlobalAugmentations(value) { this.ast.data.jsGlobalAugmentations = value; } + /** @internal */ get nodeCount(): number { return this.ast.data.nodeCount; } + /** @internal */ set nodeCount(value) { this.ast.data.nodeCount = value; } + /** @internal */ get identifierCount(): number { return this.ast.data.identifierCount; } + /** @internal */ set identifierCount(value) { this.ast.data.identifierCount = value; } + /** @internal */ get symbolCount(): number { return this.ast.data.symbolCount; } + /** @internal */ set symbolCount(value) { this.ast.data.symbolCount = value; } + /** @internal */ get additionalSyntacticDiagnostics(): readonly DiagnosticWithLocation[] | undefined { return this.ast.data.additionalSyntacticDiagnostics; } + /** @internal */ set additionalSyntacticDiagnostics(value) { this.ast.data.additionalSyntacticDiagnostics = value; } + /** @internal */ get classifiableNames(): ReadonlySet<__String> | undefined { return this.ast.data.classifiableNames; } + /** @internal */ set classifiableNames(value) { this.ast.data.classifiableNames = value; } + /** @internal */ get imports(): readonly StringLiteralLike[] { return this.ast.data.imports; } + /** @internal */ set imports(value) { this.ast.data.imports = value; } + /** @internal */ get moduleAugmentations(): readonly (Identifier | StringLiteral)[] { return this.ast.data.moduleAugmentations; } + /** @internal */ set moduleAugmentations(value) { this.ast.data.moduleAugmentations = value; } + /** @internal */ get patternAmbientModules(): PatternAmbientModule[] | undefined { return this.ast.data.patternAmbientModules; } + /** @internal */ set patternAmbientModules(value) { this.ast.data.patternAmbientModules = value; } + /** @internal */ get ambientModuleNames(): readonly string[] { return this.ast.data.ambientModuleNames; } + /** @internal */ set ambientModuleNames(value) { this.ast.data.ambientModuleNames = value; } + /** @internal */ get localJsxNamespace(): __String | undefined { return this.ast.data.localJsxNamespace; } + /** @internal */ set localJsxNamespace(value) { this.ast.data.localJsxNamespace = value; } + /** @internal */ get localJsxFragmentNamespace(): __String | undefined { return this.ast.data.localJsxFragmentNamespace; } + /** @internal */ set localJsxFragmentNamespace(value) { this.ast.data.localJsxFragmentNamespace = value; } + /** @internal */ get localJsxFactory(): EntityName | undefined { return this.ast.data.localJsxFactory; } + /** @internal */ set localJsxFactory(value) { this.ast.data.localJsxFactory = value; } + /** @internal */ get localJsxFragmentFactory(): EntityName | undefined { return this.ast.data.localJsxFragmentFactory; } + /** @internal */ set localJsxFragmentFactory(value) { this.ast.data.localJsxFragmentFactory = value; } + /** @internal */ get endFlowNode(): FlowNode | undefined { return this.ast.data.endFlowNode; } + /** @internal */ set endFlowNode(value) { this.ast.data.endFlowNode = value; } + /** @internal */ get jsDocParsingMode(): JSDocParsingMode | undefined { return this.ast.data.jsDocParsingMode; } + /** @internal */ set jsDocParsingMode(value) { this.ast.data.jsDocParsingMode = value; } + /** @internal */ get scriptSnapshot(): IScriptSnapshot | undefined { return this.ast.data.scriptSnapshot; } + /** @internal */ set scriptSnapshot(value) { this.ast.data.scriptSnapshot = value; } + /** @internal */ get nameTable(): Map<__String, number> | undefined { return this.ast.data.nameTable; } + /** @internal */ set nameTable(value) { this.ast.data.nameTable = value; } + /** @internal */ get nextContainer(): HasLocals | undefined { return this.ast.data.nextContainer?.node; } + /** @internal */ set nextContainer(value) { this.ast.data.nextContainer = value?.ast; } + /** @internal */ get extendedSourceFiles(): string[] | undefined { return this.ast.data.extendedSourceFiles; } + /** @internal */ set extendedSourceFiles(value) { this.ast.data.extendedSourceFiles = value; } + /** @internal */ get configFileSpecs(): ConfigFileSpecs | undefined { return this.ast.data.configFileSpecs; } + /** @internal */ set configFileSpecs(value) { this.ast.data.configFileSpecs = value; } - /** - * The first "most obvious" node that makes a file an external module. - * This is intended to be the first top-level import/export, - * but could be arbitrarily nested (e.g. `import.meta`). - * - * @internal - */ - externalModuleIndicator?: Node | true | undefined; - /** - * The callback used to set the external module indicator - this is saved to - * be later reused during incremental reparsing, which otherwise lacks the information - * to set this field - * - * @internal - */ - setExternalModuleIndicator?: ((file: SourceFile) => void) | undefined; - // The first node that causes this file to be a CommonJS module - /** @internal */ commonJsModuleIndicator?: Node | undefined; - // JS identifier-declarations that are intended to merge with globals - /** @internal */ jsGlobalAugmentations?: SymbolTable | undefined; + update(newText: string, textChangeRange: TextChangeRange): SourceFile { + return updateSourceFile(this, newText, textChangeRange); + } - /** @internal */ identifiers: ReadonlyMap; // Map from a string to an interned string - /** @internal */ nodeCount: number; - /** @internal */ identifierCount: number; - /** @internal */ symbolCount: number; + getLineAndCharacterOfPosition(position: number): LineAndCharacter { + return getLineAndCharacterOfPosition(this, position); + } - // File-level diagnostics reported by the parser (includes diagnostics about /// references - // as well as code diagnostics). - /** @internal */ parseDiagnostics: DiagnosticWithLocation[]; + getLineStarts(): readonly number[] { + return getLineStarts(this); + } - // File-level diagnostics reported by the binder. - /** @internal */ bindDiagnostics: DiagnosticWithLocation[]; - /** @internal */ bindSuggestionDiagnostics?: DiagnosticWithLocation[] | undefined; + getPositionOfLineAndCharacter(line: number, character: number): number; + /** @internal */ + getPositionOfLineAndCharacter(line: number, character: number, allowEdits?: true): number; // eslint-disable-line @typescript-eslint/unified-signatures + getPositionOfLineAndCharacter(line: number, character: number, allowEdits?: true): number { + return computePositionOfLineAndCharacter(getLineStarts(this), line, character, this.text, allowEdits); + } - // File-level JSDoc diagnostics reported by the JSDoc parser - /** @internal */ jsDocDiagnostics?: DiagnosticWithLocation[] | undefined; + getLineEndOfPosition(pos: number): number { + const { line } = this.getLineAndCharacterOfPosition(pos); + const lineStarts = this.getLineStarts(); - // Stores additional file-level diagnostics reported by the program - /** @internal */ additionalSyntacticDiagnostics?: readonly DiagnosticWithLocation[] | undefined; + let lastCharPos: number | undefined; + if (line + 1 >= lineStarts.length) { + lastCharPos = this.getEnd(); + } + if (!lastCharPos) { + lastCharPos = lineStarts[line + 1] - 1; + } - // Stores a line map for the file. - // This field should never be used directly to obtain line map, use getLineMap function instead. - /** @internal */ lineMap: readonly number[]; - /** @internal */ classifiableNames?: ReadonlySet<__String> | undefined; - // Comments containing @ts-* directives, in order. - /** @internal */ commentDirectives?: CommentDirective[] | undefined; - /** @internal */ imports: readonly StringLiteralLike[]; - // Identifier only if `declare global` - /** @internal */ moduleAugmentations: readonly (StringLiteral | Identifier)[]; - /** @internal */ patternAmbientModules?: PatternAmbientModule[] | undefined; - /** @internal */ ambientModuleNames: readonly string[]; - /** @internal */ checkJsDirective?: CheckJsDirective | undefined; - /** @internal */ version: string; - /** @internal */ pragmas: ReadonlyPragmaMap; - /** @internal */ localJsxNamespace?: __String | undefined; - /** @internal */ localJsxFragmentNamespace?: __String | undefined; - /** @internal */ localJsxFactory?: EntityName | undefined; - /** @internal */ localJsxFragmentFactory?: EntityName | undefined; + const fullText = this.getFullText(); + // if the new line is "\r\n", we should return the last non-new-line-character position + return fullText[lastCharPos] === "\n" && fullText[lastCharPos - 1] === "\r" ? lastCharPos - 1 : lastCharPos; + } - /** @internal */ endFlowNode?: FlowNode | undefined; + /** @internal */ + getNamedDeclarations(): Map { + if (!this.ast.data.namedDeclarations) { + this.ast.data.namedDeclarations = this._computeNamedDeclarations(); + } - /** @internal */ jsDocParsingMode?: JSDocParsingMode | undefined; + return this.ast.data.namedDeclarations; + } + + /** @internal @private */ + _computeNamedDeclarations(): Map { + const result = createMultiMap(); + + this.forEachChild(visit); + + return result; + + function addDeclaration(declaration: Declaration) { + const name = getDeclarationName(declaration); + if (name) { + result.add(name, declaration); + } + } + + function getDeclarations(name: string) { + let declarations = result.get(name); + if (!declarations) { + result.set(name, declarations = []); + } + return declarations; + } + + function getDeclarationName(declaration: Declaration) { + const name = getNonAssignedNameOfDeclaration(declaration); + if (name) { + if (isComputedPropertyName(name) && isPropertyAccessExpression(name.expression)) { + return (name.expression.name as MemberName).text + } + if (isPropertyName(name)) { + return name.kind === SyntaxKind.ComputedPropertyName + // treat computed property names where expression is string/numeric literal as just string/numeric literal + ? isStringOrNumericLiteralLike(name.expression) ? name.expression.text : undefined + : isPrivateIdentifier(name) ? idText(name) : getTextOfIdentifierOrLiteral(name); + } + } + return undefined; + } + + function visit(node: Node): void { + switch (node.kind) { + case SyntaxKind.FunctionDeclaration: + case SyntaxKind.FunctionExpression: + case SyntaxKind.MethodDeclaration: + case SyntaxKind.MethodSignature: + const functionDeclaration = node as FunctionLikeDeclaration; + const declarationName = getDeclarationName(functionDeclaration); + + if (declarationName) { + const declarations = getDeclarations(declarationName); + const lastDeclaration = lastOrUndefined(declarations); + + // Check whether this declaration belongs to an "overload group". + if (lastDeclaration && functionDeclaration.parent === lastDeclaration.parent && functionDeclaration.symbol === lastDeclaration.symbol) { + // Overwrite the last declaration if it was an overload + // and this one is an implementation. + if (functionDeclaration.body && !(lastDeclaration as FunctionLikeDeclaration).body) { + declarations[declarations.length - 1] = functionDeclaration; + } + } + else { + declarations.push(functionDeclaration); + } + } + forEachChild(node, visit); + break; + + case SyntaxKind.ClassDeclaration: + case SyntaxKind.ClassExpression: + case SyntaxKind.InterfaceDeclaration: + case SyntaxKind.TypeAliasDeclaration: + case SyntaxKind.EnumDeclaration: + case SyntaxKind.ModuleDeclaration: + case SyntaxKind.ImportEqualsDeclaration: + case SyntaxKind.ExportSpecifier: + case SyntaxKind.ImportSpecifier: + case SyntaxKind.ImportClause: + case SyntaxKind.NamespaceImport: + case SyntaxKind.GetAccessor: + case SyntaxKind.SetAccessor: + case SyntaxKind.TypeLiteral: + addDeclaration(node as Declaration); + forEachChild(node, visit); + break; + + case SyntaxKind.Parameter: + // Only consider parameter properties + if (!hasSyntacticModifier(node, ModifierFlags.ParameterPropertyModifier)) { + break; + } + // falls through + + case SyntaxKind.VariableDeclaration: + case SyntaxKind.BindingElement: { + const decl = node as VariableDeclaration; + if (isBindingPattern(decl.name)) { + forEachChild(decl.name, visit); + break; + } + if (decl.initializer) { + visit(decl.initializer); + } + } + // falls through + case SyntaxKind.EnumMember: + case SyntaxKind.PropertyDeclaration: + case SyntaxKind.PropertySignature: + addDeclaration(node as Declaration); + break; + + case SyntaxKind.ExportDeclaration: + // Handle named exports case e.g.: + // export {a, b as B} from "mod"; + const exportDeclaration = node as ExportDeclaration; + if (exportDeclaration.exportClause) { + if (isNamedExports(exportDeclaration.exportClause)) { + forEach(exportDeclaration.exportClause.elements, visit); + } + else { + visit(exportDeclaration.exportClause.name); + } + } + break; + + case SyntaxKind.ImportDeclaration: + const importClause = (node as ImportDeclaration).importClause; + if (importClause) { + // Handle default import case e.g.: + // import d from "mod"; + if (importClause.name) { + addDeclaration(importClause.name); + } + + // Handle named bindings in imports e.g.: + // import * as NS from "mod"; + // import {a, b as B} from "mod"; + if (importClause.namedBindings) { + if (importClause.namedBindings.kind === SyntaxKind.NamespaceImport) { + addDeclaration(importClause.namedBindings); + } + else { + forEach(importClause.namedBindings.elements, visit); + } + } + } + break; + + case SyntaxKind.BinaryExpression: + if (getAssignmentDeclarationKind(node as BinaryExpression) !== AssignmentDeclarationKind.None) { + addDeclaration(node as BinaryExpression); + } + // falls through + + default: + forEachChild(node, visit); + } + } + } } /** @internal */ +export type PartialSourceFile = + & Pick + & Partial>; + +/** + * Represents an immutable snapshot of a script at a specified time.Once acquired, the + * snapshot is observably immutable. i.e. the same calls with the same parameters will return + * the same values. + */ +// eslint-disable-next-line @typescript-eslint/naming-convention +export interface IScriptSnapshot { + /** Gets a portion of the script snapshot specified by [start, end). */ + getText(start: number, end: number): string; + + /** Gets the length of this script snapshot. */ + getLength(): number; + + /** + * Gets the TextChangeRange that describe how the text changed between this text and + * an older version. This information is used by the incremental parser to determine + * what sections of the script need to be re-parsed. 'undefined' can be returned if the + * change range cannot be determined. However, in that case, incremental parsing will + * not happen and the entire document will be re - parsed. + */ + getChangeRange(oldSnapshot: IScriptSnapshot): TextChangeRange | undefined; + + /** Releases all resources held by this script snapshot */ + dispose?(): void; +} + export interface ReadonlyPragmaContext { - languageVersion: ScriptTarget; - pragmas?: ReadonlyPragmaMap | undefined; - checkJsDirective?: CheckJsDirective | undefined; - referencedFiles: readonly FileReference[]; - typeReferenceDirectives: readonly FileReference[]; - libReferenceDirectives: readonly FileReference[]; - amdDependencies: readonly AmdDependency[]; - hasNoDefaultLib?: boolean | undefined; - moduleName?: string | undefined; + readonly languageVersion: ScriptTarget; + /** @internal */ readonly pragmas?: ReadonlyPragmaMap | undefined; + /** @internal */ readonly checkJsDirective?: CheckJsDirective | undefined; + readonly referencedFiles: readonly FileReference[]; + readonly typeReferenceDirectives: readonly FileReference[]; + readonly libReferenceDirectives: readonly FileReference[]; + readonly amdDependencies: readonly AmdDependency[]; + readonly hasNoDefaultLib?: boolean | undefined; + /** @internal */ readonly moduleName?: string | undefined; } /** @internal */ export interface PragmaContext extends ReadonlyPragmaContext { + languageVersion: ScriptTarget; pragmas?: PragmaMap; + checkJsDirective?: CheckJsDirective | undefined; referencedFiles: FileReference[]; typeReferenceDirectives: FileReference[]; libReferenceDirectives: FileReference[]; amdDependencies: AmdDependency[]; + hasNoDefaultLib?: boolean | undefined; + moduleName?: string | undefined; } -/** @internal */ -export interface SourceFile extends ReadonlyPragmaContext {} - /** @internal */ export interface CommentDirective { range: TextRange; @@ -4486,25 +8195,37 @@ export const enum CommentDirectiveType { Ignore, } -export interface Bundle extends Node { - readonly kind: SyntaxKind.Bundle; - readonly sourceFiles: readonly SourceFile[]; - /** @internal */ syntheticFileReferences?: readonly FileReference[] | undefined; - /** @internal */ syntheticTypeReferences?: readonly FileReference[] | undefined; - /** @internal */ syntheticLibReferences?: readonly FileReference[] | undefined; - /** @internal */ hasNoDefaultLib?: boolean | undefined; +// dprint-ignore +export class Bundle extends Node { + declare readonly ast: AstBundle; + + get sourceFiles(): readonly SourceFile[] { return this.ast.data.sourceFiles; } + + /** @internal */ set sourceFiles(value: readonly SourceFile[]) { this.ast.data.sourceFiles = value; } + /** @internal */ get syntheticFileReferences(): readonly FileReference[] | undefined { return this.ast.data.syntheticFileReferences; } + /** @internal */ set syntheticFileReferences(value: readonly FileReference[] | undefined) { this.ast.data.syntheticFileReferences = value; } + /** @internal */ get syntheticTypeReferences(): readonly FileReference[] | undefined { return this.ast.data.syntheticTypeReferences; } + /** @internal */ set syntheticTypeReferences(value: readonly FileReference[] | undefined) { this.ast.data.syntheticTypeReferences = value; } + /** @internal */ get syntheticLibReferences(): readonly FileReference[] | undefined { return this.ast.data.syntheticLibReferences; } + /** @internal */ set syntheticLibReferences(value: readonly FileReference[] | undefined) { this.ast.data.syntheticLibReferences = value; } + /** @internal */ get hasNoDefaultLib(): boolean | undefined { return this.ast.data.hasNoDefaultLib; } + /** @internal */ set hasNoDefaultLib(value: boolean | undefined) { this.ast.data.hasNoDefaultLib = value; } } export interface JsonSourceFile extends SourceFile { + readonly ast: AstJsonSourceFile; + readonly data: AstJsonSourceFileData; readonly statements: NodeArray; } export interface TsConfigSourceFile extends JsonSourceFile { - extendedSourceFiles?: string[]; - /** @internal */ configFileSpecs?: ConfigFileSpecs; + extendedSourceFiles: string[] | undefined; + /** @internal */ configFileSpecs: ConfigFileSpecs | undefined; } export interface JsonMinusNumericLiteral extends PrefixUnaryExpression { + readonly ast: AstJsonMinusNumericLiteral; + readonly data: AstJsonMinusNumericLiteralData; readonly operator: SyntaxKind.MinusToken; readonly operand: NumericLiteral; } @@ -4519,6 +8240,8 @@ export type JsonObjectExpression = | NullLiteral; export interface JsonObjectExpressionStatement extends ExpressionStatement { + readonly ast: AstJsonObjectExpressionStatement; + readonly data: AstJsonObjectExpressionStatementData; readonly expression: JsonObjectExpression; } @@ -8558,7 +12281,7 @@ export const enum OuterExpressionKinds { /** @internal */ export type OuterExpression = | ParenthesizedExpression - | TypeAssertion + | TypeAssertionExpression | SatisfiesExpression | AsExpression | NonNullExpression @@ -8643,7 +12366,7 @@ export interface NodeFactory { /** @internal */ readonly parenthesizer: ParenthesizerRules; /** @internal */ readonly converters: NodeConverters; /** @internal */ readonly flags: NodeFactoryFlags; - /** @internal */ readonly astFactory: ast.AstNodeFactory; + /** @internal */ readonly astFactory: AstNodeFactory; createNodeArray(elements?: readonly T[], hasTrailingComma?: boolean): NodeArray; @@ -8714,7 +12437,7 @@ export interface NodeFactory { createToken(token: TKind): KeywordTypeNode; createToken(token: TKind): ModifierToken; createToken(token: TKind): KeywordToken; - /** @internal */ createToken(token: TKind): Token; + /** @internal */ createToken(token: TKind): Token; // // Reserved words @@ -8869,8 +12592,8 @@ export interface NodeFactory { updateNewExpression(node: NewExpression, expression: Expression, typeArguments: readonly TypeNode[] | undefined, argumentsArray: readonly Expression[] | undefined): NewExpression; createTaggedTemplateExpression(tag: Expression, typeArguments: readonly TypeNode[] | undefined, template: TemplateLiteral): TaggedTemplateExpression; updateTaggedTemplateExpression(node: TaggedTemplateExpression, tag: Expression, typeArguments: readonly TypeNode[] | undefined, template: TemplateLiteral): TaggedTemplateExpression; - createTypeAssertion(type: TypeNode, expression: Expression): TypeAssertion; - updateTypeAssertion(node: TypeAssertion, type: TypeNode, expression: Expression): TypeAssertion; + createTypeAssertion(type: TypeNode, expression: Expression): TypeAssertionExpression; + updateTypeAssertion(node: TypeAssertionExpression, type: TypeNode, expression: Expression): TypeAssertionExpression; createParenthesizedExpression(expression: Expression): ParenthesizedExpression; updateParenthesizedExpression(node: ParenthesizedExpression, expression: Expression): ParenthesizedExpression; createFunctionExpression(modifiers: readonly Modifier[] | undefined, asteriskToken: AsteriskToken | undefined, name: string | Identifier | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[] | undefined, type: TypeNode | undefined, body: Block): FunctionExpression; @@ -9993,15 +13716,10 @@ export interface DiagnosticCollection { getDiagnostics(fileName: string): DiagnosticWithLocation[]; } -// SyntaxKind.SyntaxList -export interface SyntaxList extends Node { - kind: SyntaxKind.SyntaxList; - - // Unlike other nodes which may or may not have their child nodes calculated, - // the entire purpose of a SyntaxList is to hold child nodes. - // Instead of using the WeakMap machinery in `nodeChildren.ts`, - // we just store the children directly on the SyntaxList. - /** @internal */ _children: readonly Node[]; +// dprint-ignore +export class SyntaxList extends Node { + /** @internal */ get _children(): readonly Node[] { return this.ast.data._children; } + /** @internal */ set _children(value: readonly Node[]) { this.ast.data._children = value; } } // dprint-ignore diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 1ebfe3837a4..cccfe9b28c8 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -24,7 +24,14 @@ import { AssignmentDeclarationKind, AssignmentExpression, AssignmentOperatorToken, - ast, + AstBinaryExpression, + AstExpression, + AstHasJSDoc, + AstModifierLike, + AstNewExpression, + AstNode, + AstPostfixUnaryExpression, + AstPrefixUnaryExpression, BarBarEqualsToken, BinaryExpression, binarySearch, @@ -253,6 +260,7 @@ import { isArrayLiteralExpression, isArrowFunction, isAssertionExpression, + isAstJSDocTypeExpression, isAutoAccessorPropertyDeclaration, isBigIntLiteral, isBinaryExpression, @@ -488,6 +496,7 @@ import { QuestionQuestionEqualsToken, ReadonlyCollection, ReadonlyTextRange, + RegularExpressionLiteral, removeTrailingDirectorySeparator, RequireOrImportCall, RequireVariableStatement, @@ -508,6 +517,7 @@ import { shouldAllowImportingTsExtension, Signature, SignatureDeclaration, + SignatureDeclarationBase, SignatureFlags, singleElementArray, singleOrUndefined, @@ -525,6 +535,7 @@ import { Statement, StringLiteral, StringLiteralLike, + StringLiteralLikeNode, StringLiteralType, stringToToken, SuperCall, @@ -561,7 +572,7 @@ import { TupleTypeNode, Type, TypeAliasDeclaration, - TypeAssertion, + TypeAssertionExpression, TypeChecker, TypeCheckerHost, TypeElement, @@ -777,7 +788,7 @@ export function usingSingleLineStringWriter(action: (writer: EmitTextWriter) => } /** @internal */ -export function getFullWidth(node: Node | ast.AstNode): number { +export function getFullWidth(node: Node | AstNode): number { return node.end - node.pos; } @@ -933,8 +944,8 @@ export function hasChangesInResolutions( // Returns true if this node contains a parse error anywhere underneath it. /** @internal */ -export function containsParseError(node: Node | ast.AstNode): boolean { - aggregateChildData(node instanceof ast.AstNode ? node.node : node); // TODO(rbuckton): do not instantiate node +export function containsParseError(node: Node | AstNode): boolean { + aggregateChildData(node instanceof AstNode ? node.node : node); // TODO(rbuckton): do not instantiate node return (node.flags & NodeFlags.ThisNodeOrAnySubNodesHasError) !== 0; } @@ -1058,7 +1069,7 @@ export function isFileLevelUniqueName(sourceFile: SourceFile, name: string, hasG // However, this node will be 'missing' in the sense that no actual source-code/tokens are // contained within it. /** @internal */ -export function nodeIsMissing(node: Node | ast.AstNode | undefined): boolean { +export function nodeIsMissing(node: Node | AstNode | undefined): boolean { if (node === undefined) { return true; } @@ -1067,7 +1078,7 @@ export function nodeIsMissing(node: Node | ast.AstNode | undefined): boolean { } /** @internal */ -export function nodeIsPresent(node: Node | ast.AstNode | undefined): boolean { +export function nodeIsPresent(node: Node | AstNode | undefined): boolean { return !nodeIsMissing(node); } @@ -1279,9 +1290,9 @@ export function getSourceTextOfNodeFromSourceFile(sourceFile: SourceFile, node: return getTextOfNodeFromSourceText(sourceFile.text, node, includeTrivia); } -function isJSDocTypeExpressionOrChild(node: Node | ast.AstNode): boolean { - return node instanceof ast.AstNode ? - !!findAncestor(node, ast.isAstJSDocTypeExpression) : +function isJSDocTypeExpressionOrChild(node: Node | AstNode): boolean { + return node instanceof AstNode ? + !!findAncestor(node, isAstJSDocTypeExpression) : !!findAncestor(node, isJSDocTypeExpression); } @@ -1312,7 +1323,7 @@ export function moduleExportNameIsDefault(node: ModuleExportName): boolean { } /** @internal */ -export function getTextOfNodeFromSourceText(sourceText: string, node: Node | ast.AstNode, includeTrivia = false): string { +export function getTextOfNodeFromSourceText(sourceText: string, node: Node | AstNode, includeTrivia = false): string { if (nodeIsMissing(node)) { return ""; } @@ -1880,7 +1891,7 @@ export function getLiteralText(node: LiteralLikeNode, sourceFile: SourceFile | u case SyntaxKind.BigIntLiteral: return node.text; case SyntaxKind.RegularExpressionLiteral: - if (flags & GetLiteralTextFlags.TerminateUnterminatedLiterals && node.isUnterminated) { + if (flags & GetLiteralTextFlags.TerminateUnterminatedLiterals && (node as RegularExpressionLiteral).isUnterminated) { return node.text + (node.text.charCodeAt(node.text.length - 1) === CharacterCodes.backslash ? " /" : "/"); } return node.text; @@ -1890,7 +1901,7 @@ export function getLiteralText(node: LiteralLikeNode, sourceFile: SourceFile | u } function canUseOriginalText(node: LiteralLikeNode, flags: GetLiteralTextFlags): boolean { - if (nodeIsSynthesized(node) || !node.parent || (flags & GetLiteralTextFlags.TerminateUnterminatedLiterals && node.isUnterminated)) { + if (nodeIsSynthesized(node) || !node.parent || (flags & GetLiteralTextFlags.TerminateUnterminatedLiterals && (node as StringLiteralLikeNode).isUnterminated)) { return false; } @@ -2610,7 +2621,7 @@ export function getLeadingCommentRangesOfNode(node: Node, sourceFileOfNode: Sour } /** @internal */ -export function getJSDocCommentRanges(node: Node | ast.AstNode, text: string): CommentRange[] | undefined { +export function getJSDocCommentRanges(node: Node | AstNode, text: string): CommentRange[] | undefined { const commentRanges = (node.kind === SyntaxKind.Parameter || node.kind === SyntaxKind.TypeParameter || node.kind === SyntaxKind.FunctionExpression || @@ -2719,7 +2730,7 @@ export function isPartOfTypeNode(node: Node): boolean { case SyntaxKind.IndexSignature: return node === (parent as SignatureDeclaration).type; case SyntaxKind.TypeAssertionExpression: - return node === (parent as TypeAssertion).type; + return node === (parent as TypeAssertionExpression).type; case SyntaxKind.CallExpression: case SyntaxKind.NewExpression: case SyntaxKind.TaggedTemplateExpression: @@ -2789,7 +2800,7 @@ export function forEachYieldExpression(body: Block, visitor: (expr: YieldExpress return; default: if (isFunctionLike(node)) { - if (node.name && node.name.kind === SyntaxKind.ComputedPropertyName) { + if (isNamedDeclaration(node) && node.name.kind === SyntaxKind.ComputedPropertyName) { // Note that we will not include methods/accessors of a class because they would require // first descending into the class. This is by design. traverse(node.name.expression); @@ -4394,8 +4405,8 @@ export function canHaveFlowNode(node: Node): node is HasFlowNode { /** @internal */ export function canHaveJSDoc(node: Node): node is HasJSDoc; /** @internal */ -export function canHaveJSDoc(node: ast.AstNode): node is ast.AstHasJSDoc; -export function canHaveJSDoc(node: Node | ast.AstNode) { +export function canHaveJSDoc(node: AstNode): node is AstHasJSDoc; +export function canHaveJSDoc(node: Node | AstNode) { switch (node.kind) { case SyntaxKind.ArrowFunction: case SyntaxKind.BinaryExpression: @@ -4672,6 +4683,7 @@ export function getTypeParameterFromJsDoc(node: TypeParameterDeclaration & { par /** @internal @knipignore */ export function hasTypeArguments(node: Node): node is HasTypeArguments { + // TODO: switch on kind return !!(node as HasTypeArguments).typeArguments; } @@ -5183,13 +5195,16 @@ export function getFunctionFlags(node: SignatureDeclaration | undefined): Functi /** @internal */ export function isAsyncFunction(node: Node): boolean { + Debug.type(node); switch (node.kind) { case SyntaxKind.FunctionDeclaration: case SyntaxKind.FunctionExpression: - case SyntaxKind.ArrowFunction: case SyntaxKind.MethodDeclaration: - return (node as FunctionLikeDeclaration).body !== undefined - && (node as FunctionLikeDeclaration).asteriskToken === undefined + return node.body !== undefined + && node.asteriskToken === undefined + && hasSyntacticModifier(node, ModifierFlags.Async); + case SyntaxKind.ArrowFunction: + return node.body !== undefined && hasSyntacticModifier(node, ModifierFlags.Async); } return false; @@ -5471,9 +5486,9 @@ export const enum Associativity { } /** @internal */ -export function getExpressionAssociativity(expression: Expression | ast.AstExpression): Associativity { +export function getExpressionAssociativity(expression: Expression | AstExpression): Associativity { const operator = getOperator(expression); - const hasArguments = expression.kind === SyntaxKind.NewExpression && (expression instanceof ast.AstNode ? (expression as ast.AstNewExpression).data.arguments !== undefined : (expression as NewExpression).arguments !== undefined); + const hasArguments = expression.kind === SyntaxKind.NewExpression && (expression instanceof AstNode ? (expression as AstNewExpression).data.arguments !== undefined : (expression as NewExpression).arguments !== undefined); return getOperatorAssociativity(expression.kind, operator, hasArguments); } @@ -5518,18 +5533,18 @@ export function getOperatorAssociativity(kind: SyntaxKind, operator: SyntaxKind, } /** @internal */ -export function getExpressionPrecedence(expression: Expression | ast.AstExpression): OperatorPrecedence { +export function getExpressionPrecedence(expression: Expression | AstExpression): OperatorPrecedence { const operator = getOperator(expression); - const hasArguments = expression.kind === SyntaxKind.NewExpression && (expression instanceof ast.AstNode ? (expression as ast.AstNewExpression).data.arguments !== undefined : (expression as NewExpression).arguments !== undefined); + const hasArguments = expression.kind === SyntaxKind.NewExpression && (expression instanceof AstNode ? (expression as AstNewExpression).data.arguments !== undefined : (expression as NewExpression).arguments !== undefined); return getOperatorPrecedence(expression.kind, operator, hasArguments); } -function getOperator(expression: Expression | ast.AstExpression): SyntaxKind { +function getOperator(expression: Expression | AstExpression): SyntaxKind { if (expression.kind === SyntaxKind.BinaryExpression) { - return expression instanceof ast.AstNode ? (expression as ast.AstBinaryExpression).data.operatorToken.kind : (expression as BinaryExpression).operatorToken.kind; + return expression instanceof AstNode ? (expression as AstBinaryExpression).data.operatorToken.kind : (expression as BinaryExpression).operatorToken.kind; } else if (expression.kind === SyntaxKind.PrefixUnaryExpression || expression.kind === SyntaxKind.PostfixUnaryExpression) { - return expression instanceof ast.AstNode ? (expression as ast.AstPrefixUnaryExpression | ast.AstPostfixUnaryExpression).data.operator : (expression as PrefixUnaryExpression | PostfixUnaryExpression).operator; + return expression instanceof AstNode ? (expression as AstPrefixUnaryExpression | AstPostfixUnaryExpression).data.operator : (expression as PrefixUnaryExpression | PostfixUnaryExpression).operator; } else { return expression.kind; @@ -7172,7 +7187,7 @@ export function getSyntacticModifierFlagsNoCache(node: Node): ModifierFlags { } /** @internal */ -export function modifiersToFlags(modifiers: readonly ModifierLike[] | readonly ast.AstModifierLike[] | undefined): ModifierFlags { +export function modifiersToFlags(modifiers: readonly ModifierLike[] | readonly AstModifierLike[] | undefined): ModifierFlags { let flags = ModifierFlags.None; if (modifiers) { for (const modifier of modifiers) { @@ -10424,11 +10439,11 @@ export function setNodeFlags(node: T | undefined, newFlags: Node * * @internal */ -export function setParent(child: T, parent: T["parent"] | undefined): T; +export function setParent(child: T, parent: T["parent"] | undefined): T; /** @internal */ -export function setParent(child: T | undefined, parent: T["parent"] | undefined): T | undefined; +export function setParent(child: T | undefined, parent: T["parent"] | undefined): T | undefined; /** @internal */ -export function setParent(child: T | undefined, parent: T["parent"] | undefined): T | undefined { +export function setParent(child: T | undefined, parent: T["parent"] | undefined): T | undefined { if (child && parent) { (child as Mutable).parent = parent; } @@ -11700,13 +11715,16 @@ export function createNameResolver({ return isTypeQueryNode(location) || (( isFunctionLikeDeclaration(location) || (location.kind === SyntaxKind.PropertyDeclaration && !isStatic(location)) - ) && (!lastLocation || lastLocation !== (location as SignatureDeclaration | PropertyDeclaration).name)); // A name is evaluated within the enclosing scope - so it shouldn't count as deferred + // TODO(rbuckton): unchecked cast can result in wrong map deopt for missing `name` property + ) && (!lastLocation || lastLocation !== (location as SignatureDeclarationBase | PropertyDeclaration).name)); // A name is evaluated within the enclosing scope - so it shouldn't count as deferred } - if (lastLocation && lastLocation === (location as FunctionExpression | ArrowFunction).name) { + // TODO(rbuckton): unchecked cast can result in wrong map deopt for missing `name` property + if (lastLocation && lastLocation === (location as FunctionExpression).name) { return false; } // generator functions and async functions are not inlined in control flow when immediately invoked - if ((location as FunctionExpression | ArrowFunction).asteriskToken || hasSyntacticModifier(location, ModifierFlags.Async)) { + // TODO(rbuckton): unchecked cast can result in wrong map deopt for missing `asteriskToken` property + if ((location as FunctionExpression).asteriskToken || hasSyntacticModifier(location, ModifierFlags.Async)) { return true; } return !getImmediatelyInvokedFunctionExpression(location); diff --git a/src/compiler/utilitiesPublic.ts b/src/compiler/utilitiesPublic.ts index 3608fbada22..ac237de709d 100644 --- a/src/compiler/utilitiesPublic.ts +++ b/src/compiler/utilitiesPublic.ts @@ -9,7 +9,6 @@ import { AssertionExpression, AssignmentDeclarationKind, AssignmentPattern, - ast, AutoAccessorPropertyDeclaration, BinaryExpression, BindableObjectDefinePropertyCall, @@ -227,6 +226,7 @@ import { ModuleDeclaration, ModuleReference, NamedDeclaration, + HasName, NamedExportBindings, NamedImportBindings, NamespaceBody, @@ -291,6 +291,10 @@ import { TypeReferenceType, UnaryExpression, VariableDeclaration, + HasQuestionToken, + HasAsteriskToken, + AsteriskToken, + AstNode, } from "./_namespaces/ts.js"; export function isExternalModuleNameRelative(moduleName: string): boolean { @@ -780,7 +784,7 @@ interface AncestorTraversable> { * At that point findAncestor returns undefined. * @internal */ -export function findAncestor(node: ast.AstNode | undefined, callback: (element: ast.AstNode) => element is T): T | undefined; +export function findAncestor(node: AstNode | undefined, callback: (element: AstNode) => element is T): T | undefined; /** * Iterates through the parent chain of a node and performs the callback on each parent until the callback * returns a truthy value, then returns that value. @@ -789,7 +793,7 @@ export function findAncestor(node: ast.AstNode | undefine */ export function findAncestor(node: Node | undefined, callback: (element: Node) => element is T): T | undefined; /** @internal */ -export function findAncestor(node: ast.AstNode | undefined, callback: (element: ast.AstNode) => boolean | "quit"): ast.AstNode | undefined; +export function findAncestor(node: AstNode | undefined, callback: (element: AstNode) => boolean | "quit"): AstNode | undefined; export function findAncestor(node: Node | undefined, callback: (element: Node) => boolean | "quit"): Node | undefined; export function findAncestor>(node: T | T | undefined, callback: (element: T) => boolean | "quit"): T | undefined { while (node) { @@ -812,8 +816,8 @@ export function findAncestor>(node: T | T | und */ export function isParseTreeNode(node: Node): boolean; /** @internal */ -export function isParseTreeNode(node: Node | ast.AstNode): boolean; // eslint-disable-line @typescript-eslint/unified-signatures -export function isParseTreeNode(node: Node | ast.AstNode): boolean { +export function isParseTreeNode(node: Node | AstNode): boolean; // eslint-disable-line @typescript-eslint/unified-signatures +export function isParseTreeNode(node: Node | AstNode): boolean { return (node.flags & NodeFlags.Synthesized) === 0; } @@ -956,6 +960,98 @@ export function isNamedDeclaration(node: Node): node is NamedDeclaration & { nam return !!(node as NamedDeclaration).name; // A 'name' property should always be a DeclarationName. } +/** @internal */ +export function canHaveName(node: Node): node is HasName { + switch (node.kind) { + case SyntaxKind.BindingElement: + case SyntaxKind.ClassDeclaration: + case SyntaxKind.ClassExpression: + case SyntaxKind.EnumDeclaration: + case SyntaxKind.EnumMember: + case SyntaxKind.ExportSpecifier: + case SyntaxKind.FunctionDeclaration: + case SyntaxKind.FunctionExpression: + case SyntaxKind.GetAccessor: + case SyntaxKind.ImportAttribute: + case SyntaxKind.ImportClause: + case SyntaxKind.ImportEqualsDeclaration: + case SyntaxKind.ImportSpecifier: + case SyntaxKind.InterfaceDeclaration: + case SyntaxKind.JSDocCallbackTag: + case SyntaxKind.JSDocLink: + case SyntaxKind.JSDocLinkCode: + case SyntaxKind.JSDocLinkPlain: + case SyntaxKind.JSDocNameReference: + case SyntaxKind.JSDocParameterTag: + case SyntaxKind.JSDocPropertyTag: + case SyntaxKind.JSDocSeeTag: + case SyntaxKind.JSDocTypedefTag: + case SyntaxKind.JsxAttribute: + case SyntaxKind.JsxNamespacedName: + case SyntaxKind.MetaProperty: + case SyntaxKind.MethodDeclaration: + case SyntaxKind.MethodSignature: + case SyntaxKind.MissingDeclaration: + case SyntaxKind.ModuleDeclaration: + case SyntaxKind.NamedTupleMember: + case SyntaxKind.NamespaceExport: + case SyntaxKind.NamespaceExportDeclaration: + case SyntaxKind.NamespaceImport: + case SyntaxKind.Parameter: + case SyntaxKind.PropertyAccessExpression: + case SyntaxKind.PropertyAssignment: + case SyntaxKind.PropertyDeclaration: + case SyntaxKind.PropertySignature: + case SyntaxKind.SetAccessor: + case SyntaxKind.ShorthandPropertyAssignment: + case SyntaxKind.TypeAliasDeclaration: + case SyntaxKind.TypeParameter: + case SyntaxKind.VariableDeclaration: + return true; + } + return false; +} + +/** @internal */ +export function hasName(node: Node): node is HasName & { name: DeclarationName } { + return canHaveName(node) && !!node.name; +} + +/** @internal */ +export function canHaveQuestionToken(node: Node): node is HasQuestionToken { + switch (node.kind) { + case SyntaxKind.Parameter: + case SyntaxKind.PropertySignature: + case SyntaxKind.PropertyDeclaration: + case SyntaxKind.MethodSignature: + case SyntaxKind.MethodDeclaration: + case SyntaxKind.ShorthandPropertyAssignment: + case SyntaxKind.MappedType: + case SyntaxKind.NamedTupleMember: + case SyntaxKind.ConditionalExpression: + case SyntaxKind.PropertyAssignment: + return true; + } + return false; +} + +/** @internal */ +export function canHaveAsteriskToken(node: Node): node is HasAsteriskToken { + switch (node.kind) { + case SyntaxKind.FunctionDeclaration: + case SyntaxKind.FunctionExpression: + case SyntaxKind.MethodDeclaration: + case SyntaxKind.YieldExpression: + return true; + } + return false; +} + +/** @internal */ +export function hasAsteriskToken(node: Node): node is HasAsteriskToken & { asteriskToken: AsteriskToken } { + return canHaveAsteriskToken(node) && !!node.asteriskToken; +} + /** @internal */ export function getNonAssignedNameOfDeclaration(declaration: Declaration | Expression): DeclarationName | undefined { switch (declaration.kind) { @@ -1494,7 +1590,7 @@ export function isToken(n: Node): boolean { /** @internal */ export function isNodeArray(array: readonly T[]): array is NodeArray { - return hasProperty(array, "pos") && hasProperty(array, "end") || array instanceof ast.NodeArray; + return hasProperty(array, "pos") && hasProperty(array, "end") || array instanceof NodeArray; } // Literals @@ -2558,6 +2654,7 @@ export function hasJSDocNodes(node: Node): node is HasJSDoc { * @internal */ export function hasType(node: Node): node is HasType { + // TODO: switch on kind return !!(node as HasType).type; } @@ -2567,6 +2664,7 @@ export function hasType(node: Node): node is HasType { * @internal */ export function hasInitializer(node: Node): node is HasInitializer { + // TODO: switch on kind return !!(node as HasInitializer).initializer; } diff --git a/src/harness/harnessUtils.ts b/src/harness/harnessUtils.ts index 63635adb824..e00957ff814 100644 --- a/src/harness/harnessUtils.ts +++ b/src/harness/harnessUtils.ts @@ -175,8 +175,8 @@ function convertDiagnostic(diagnostic: ts.Diagnostic) { export function sourceFileToJSON(file: ts.Node): string { const s = JSON.stringify(file, (_, v) => { - if (v instanceof ts.ast.AstNode) v = v.node; - if (v instanceof ts.ast.AstNodeArray) v = v.nodes; + if (v instanceof ts.AstNode) v = v.node; + if (v instanceof ts.AstNodeArray) v = v.nodes; return isNodeOrArray(v) ? serializeNode(v) : v; }, " "); return s; @@ -267,8 +267,8 @@ export function sourceFileToJSON(file: ts.Node): string { default: { let value = obj[propertyName]; - if (value instanceof ts.ast.AstNode) value = value.node; - if (value instanceof ts.ast.AstNodeArray) value = value.nodes; + if (value instanceof ts.AstNode) value = value.node; + if (value instanceof ts.AstNodeArray) value = value.nodes; o[propertyName] = value; } } @@ -282,7 +282,7 @@ export function sourceFileToJSON(file: ts.Node): string { if (ts.containsParseError(n)) { o.containsParseError = true; } - if (n instanceof ts.ast.Node) { + if (n instanceof ts.Node) { serializeProperties(o, n, n, ["pos", "end", "flags", "modifierFlagsCache", "transformFlags"]); serializeProperties(o, n, n.ast.data, Object.getOwnPropertyNames(n.ast.data)); } @@ -292,7 +292,7 @@ export function sourceFileToJSON(file: ts.Node): string { } else { serializeProperties(o, /*n*/ undefined, n, Object.getOwnPropertyNames(n)); - if (n instanceof ts.ast.NodeArray) { + if (n instanceof ts.NodeArray) { serializeProperties(o, /*n*/ undefined, n, ["pos", "end", "hasTrailingComma", "transformFlags"]); } } @@ -376,10 +376,10 @@ function assertArrayStructuralEquals(array1: ts.NodeArray, array2: ts.N } function findChildName(parent: any, child: any) { - if (parent instanceof ts.ast.Node) { + if (parent instanceof ts.Node) { parent = parent.ast.data; } - if (child instanceof ts.ast.Node || child instanceof ts.ast.NodeArray) { + if (child instanceof ts.Node || child instanceof ts.NodeArray) { child = child.ast; } for (const name in parent) { diff --git a/src/services/breakpoints.ts b/src/services/breakpoints.ts index b3e53fed929..ab957a5aa5a 100644 --- a/src/services/breakpoints.ts +++ b/src/services/breakpoints.ts @@ -64,7 +64,7 @@ import { TextSpan, ThrowStatement, TryStatement, - TypeAssertion, + TypeAssertionExpression, VariableDeclaration, VariableDeclarationList, VariableStatement, @@ -423,8 +423,8 @@ export function spanInSourceFileAtLocation(sourceFile: SourceFile, position: num break; case SyntaxKind.TypeAssertionExpression: // Breakpoint in type assertion goes to its operand - if ((node.parent as TypeAssertion).type === node) { - return spanInNextNode((node.parent as TypeAssertion).type); + if ((node.parent as TypeAssertionExpression).type === node) { + return spanInNextNode((node.parent as TypeAssertionExpression).type); } break; case SyntaxKind.VariableDeclaration: diff --git a/src/services/callHierarchy.ts b/src/services/callHierarchy.ts index 77a3b4698e2..e1bf30a2a02 100644 --- a/src/services/callHierarchy.ts +++ b/src/services/callHierarchy.ts @@ -101,7 +101,7 @@ import { TaggedTemplateExpression, TextRange, TextSpan, - TypeAssertion, + TypeAssertionExpression, TypeChecker, usingSingleLineStringWriter, VariableDeclaration, @@ -538,7 +538,7 @@ function createCallSiteCollector(program: Program, callSites: CallSite[]): (node case SyntaxKind.TypeAssertionExpression: case SyntaxKind.AsExpression: // do not descend into the type side of an assertion - collect((node as TypeAssertion | AsExpression).expression); + collect((node as TypeAssertionExpression | AsExpression).expression); return; case SyntaxKind.VariableDeclaration: case SyntaxKind.Parameter: diff --git a/src/services/codefixes/addConvertToUnknownForNonOverlappingTypes.ts b/src/services/codefixes/addConvertToUnknownForNonOverlappingTypes.ts index 942cb05ffb6..6936b90863a 100644 --- a/src/services/codefixes/addConvertToUnknownForNonOverlappingTypes.ts +++ b/src/services/codefixes/addConvertToUnknownForNonOverlappingTypes.ts @@ -15,7 +15,7 @@ import { SourceFile, SyntaxKind, textChanges, - TypeAssertion, + TypeAssertionExpression, } from "../_namespaces/ts.js"; const fixId = "addConvertToUnknownForNonOverlappingTypes"; @@ -38,14 +38,14 @@ registerCodeFix({ }), }); -function makeChange(changeTracker: textChanges.ChangeTracker, sourceFile: SourceFile, assertion: AsExpression | TypeAssertion) { +function makeChange(changeTracker: textChanges.ChangeTracker, sourceFile: SourceFile, assertion: AsExpression | TypeAssertionExpression) { const replacement = isAsExpression(assertion) ? factory.createAsExpression(assertion.expression, factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword)) : factory.createTypeAssertion(factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword), assertion.expression); changeTracker.replaceNode(sourceFile, assertion.expression, replacement); } -function getAssertion(sourceFile: SourceFile, pos: number): AsExpression | TypeAssertion | undefined { +function getAssertion(sourceFile: SourceFile, pos: number): AsExpression | TypeAssertionExpression | undefined { if (isInJSFile(sourceFile)) return undefined; - return findAncestor(getTokenAtPosition(sourceFile, pos), (n): n is AsExpression | TypeAssertion => isAsExpression(n) || isTypeAssertionExpression(n)); + return findAncestor(getTokenAtPosition(sourceFile, pos), (n): n is AsExpression | TypeAssertionExpression => isAsExpression(n) || isTypeAssertionExpression(n)); } diff --git a/src/services/codefixes/convertFunctionToEs6Class.ts b/src/services/codefixes/convertFunctionToEs6Class.ts index 56fdaeec81d..203ca2b7fce 100644 --- a/src/services/codefixes/convertFunctionToEs6Class.ts +++ b/src/services/codefixes/convertFunctionToEs6Class.ts @@ -28,6 +28,7 @@ import { getNameOfDeclaration, getQuotePreference, getTokenAtPosition, + hasName, idText, isAccessExpression, isArrowFunction, @@ -315,7 +316,7 @@ function getModifierKindFromSource(source: Node, kind: Modifier["kind"]): readon } function isConstructorAssignment(x: ObjectLiteralElementLike | PropertyAccessExpression) { - if (!x.name) return false; + if (!hasName(x)) return false; if (isIdentifier(x.name) && x.name.text === "constructor") return true; return false; } diff --git a/src/services/codefixes/convertToEsModule.ts b/src/services/codefixes/convertToEsModule.ts index 02d1a5f9301..7628adb536b 100644 --- a/src/services/codefixes/convertToEsModule.ts +++ b/src/services/codefixes/convertToEsModule.ts @@ -9,6 +9,7 @@ import { BinaryExpression, BindingElement, BindingName, + canHaveAsteriskToken, ClassDeclaration, ClassExpression, concatenate, @@ -35,6 +36,7 @@ import { getSynthesizedDeepClones, getSynthesizedDeepClonesWithReplacements, getSynthesizedDeepCloneWithReplacements, + hasName, Identifier, ImportDeclaration, importFromModuleSpecifier, @@ -77,6 +79,7 @@ import { SymbolFlags, SyntaxKind, textChanges, + tryCast, TypeChecker, VariableStatement, } from "../_namespaces/ts.js"; @@ -411,11 +414,11 @@ function reExportDefault(moduleSpecifier: string): ExportDeclaration { function convertExportsPropertyAssignment({ left, right, parent }: BinaryExpression & { left: PropertyAccessExpression; }, sourceFile: SourceFile, changes: textChanges.ChangeTracker): void { const name = left.name.text; - if ((isFunctionExpression(right) || isArrowFunction(right) || isClassExpression(right)) && (!right.name || right.name.text === name)) { + if ((isFunctionExpression(right) || isArrowFunction(right) || isClassExpression(right)) && (!hasName(right) || right.name.text === name)) { // `exports.f = function() {}` -> `export function f() {}` -- Replace `exports.f = ` with `export `, and insert the name after `function`. changes.replaceRange(sourceFile, { pos: left.getStart(sourceFile), end: right.getStart(sourceFile) }, factory.createToken(SyntaxKind.ExportKeyword), { suffix: " " }); - if (!right.name) changes.insertName(sourceFile, right, name); + if (!hasName(right)) changes.insertName(sourceFile, right, name); const semi = findChildOfKind(parent, SyntaxKind.SemicolonToken, sourceFile); if (semi) changes.delete(sourceFile, semi); @@ -631,7 +634,7 @@ function isFreeIdentifier(node: Identifier): boolean { function functionExpressionToDeclaration(name: string | undefined, additionalModifiers: readonly Modifier[], fn: FunctionExpression | ArrowFunction | MethodDeclaration, useSitesToUnqualify: Map | undefined): FunctionDeclaration { return factory.createFunctionDeclaration( concatenate(additionalModifiers, getSynthesizedDeepClones(fn.modifiers)), - getSynthesizedDeepClone(fn.asteriskToken), + getSynthesizedDeepClone(tryCast(fn, canHaveAsteriskToken)?.asteriskToken), name, getSynthesizedDeepClones(fn.typeParameters), getSynthesizedDeepClones(fn.parameters), diff --git a/src/services/codefixes/convertToMappedObjectType.ts b/src/services/codefixes/convertToMappedObjectType.ts index c4330112e81..8d3223774af 100644 --- a/src/services/codefixes/convertToMappedObjectType.ts +++ b/src/services/codefixes/convertToMappedObjectType.ts @@ -79,7 +79,7 @@ function doChange(changes: textChanges.ChangeTracker, sourceFile: SourceFile, { hasEffectiveReadonlyModifier(indexSignature) ? factory.createModifier(SyntaxKind.ReadonlyKeyword) : undefined, mappedTypeParameter, /*nameType*/ undefined, - indexSignature.questionToken, + /*questionToken*/ undefined, indexSignature.type, /*members*/ undefined, ); diff --git a/src/services/codefixes/fixJSDocTypes.ts b/src/services/codefixes/fixJSDocTypes.ts index 7d3983db3d4..ecfe916d464 100644 --- a/src/services/codefixes/fixJSDocTypes.ts +++ b/src/services/codefixes/fixJSDocTypes.ts @@ -30,7 +30,7 @@ import { textChanges, Type, TypeAliasDeclaration, - TypeAssertion, + TypeAssertionExpression, TypeChecker, TypeFlags, TypeNode, @@ -92,7 +92,7 @@ function getInfo(sourceFile: SourceFile, pos: number, checker: TypeChecker): { r } // TODO: GH#19856 Node & { type: TypeNode } -type TypeContainer = AsExpression | CallSignatureDeclaration | ConstructSignatureDeclaration | FunctionDeclaration | GetAccessorDeclaration | IndexSignatureDeclaration | MappedTypeNode | MethodDeclaration | MethodSignature | ParameterDeclaration | PropertyDeclaration | PropertySignature | SetAccessorDeclaration | TypeAliasDeclaration | TypeAssertion | VariableDeclaration; +type TypeContainer = AsExpression | CallSignatureDeclaration | ConstructSignatureDeclaration | FunctionDeclaration | GetAccessorDeclaration | IndexSignatureDeclaration | MappedTypeNode | MethodDeclaration | MethodSignature | ParameterDeclaration | PropertyDeclaration | PropertySignature | SetAccessorDeclaration | TypeAliasDeclaration | TypeAssertionExpression | VariableDeclaration; function isTypeContainer(node: Node): node is TypeContainer { // NOTE: Some locations are not handled yet: // MappedTypeNode.typeParameters and SignatureDeclaration.typeParameters, as well as CallExpression.typeArguments diff --git a/src/services/codefixes/helpers.ts b/src/services/codefixes/helpers.ts index 7957b28b110..0789108d919 100644 --- a/src/services/codefixes/helpers.ts +++ b/src/services/codefixes/helpers.ts @@ -6,6 +6,7 @@ import { ArrowFunction, Block, CallExpression, + canHaveAsteriskToken, CharacterCodes, CheckFlags, ClassLikeDeclaration, @@ -469,7 +470,7 @@ export function createSignatureDeclarationFromSignature( } const questionToken = optional ? factory.createToken(SyntaxKind.QuestionToken) : undefined; - const asteriskToken = signatureDeclaration.asteriskToken; + const asteriskToken = tryCast(signatureDeclaration, canHaveAsteriskToken)?.asteriskToken; if (isFunctionExpression(signatureDeclaration)) { return factory.updateFunctionExpression(signatureDeclaration, modifiers, signatureDeclaration.asteriskToken, tryCast(name, isIdentifier), typeParameters, parameters, type, body ?? signatureDeclaration.body); } diff --git a/src/services/codefixes/inferFromUsage.ts b/src/services/codefixes/inferFromUsage.ts index 620542686ac..78529cc5823 100644 --- a/src/services/codefixes/inferFromUsage.ts +++ b/src/services/codefixes/inferFromUsage.ts @@ -521,7 +521,7 @@ function getFunctionReferences(containingFunction: SignatureDeclaration, sourceF const parent = containingFunction.parent; searchToken = (isVariableDeclaration(parent) || isPropertyDeclaration(parent)) && isIdentifier(parent.name) ? parent.name : - containingFunction.name; + isFunctionExpression(containingFunction) ? containingFunction.name : undefined; break; case SyntaxKind.FunctionDeclaration: case SyntaxKind.MethodDeclaration: diff --git a/src/services/findAllReferences.ts b/src/services/findAllReferences.ts index 74aeb9c5be0..03cc77c9f79 100644 --- a/src/services/findAllReferences.ts +++ b/src/services/findAllReferences.ts @@ -96,6 +96,7 @@ import { GoToDefinition, hasEffectiveModifier, hasInitializer, + hasName, hasSyntacticModifier, hasType, HighlightSpan, @@ -389,9 +390,9 @@ function getContextNodeForNodeEntry(node: Node): ContextNode | undefined { } if ( - node.parent.name === node || // node is name of declaration, use parent - isConstructorDeclaration(node.parent) || isExportAssignment(node.parent) || + isConstructorDeclaration(node.parent) || + node.parent.name === node || // node is name of declaration, use parent // Property name of the import export specifier or binding pattern, use parent ((isImportOrExportSpecifier(node.parent) || isBindingElement(node.parent)) && node.parent.propertyName === node) || @@ -1752,7 +1753,7 @@ export namespace Core { checker: TypeChecker, cb: (name: Identifier, call?: CallExpression) => boolean, ): boolean { - if (!signature.name || !isIdentifier(signature.name)) return false; + if (!hasName(signature) || !isIdentifier(signature.name)) return false; const symbol = Debug.checkDefined(checker.getSymbolAtLocation(signature.name)); diff --git a/src/services/goToDefinition.ts b/src/services/goToDefinition.ts index 9a47d90ce1d..52e35eda0b4 100644 --- a/src/services/goToDefinition.ts +++ b/src/services/goToDefinition.ts @@ -37,6 +37,7 @@ import { getTextOfPropertyName, getTouchingPropertyName, getTouchingToken, + hasAsteriskToken, hasEffectiveModifier, hasInitializer, hasStaticModifier, @@ -167,7 +168,7 @@ export function getDefinitionAtPosition(program: Program, sourceFile: SourceFile if (node.kind === SyntaxKind.YieldKeyword) { const functionDeclaration = findAncestor(node, n => isFunctionLikeDeclaration(n)); - const isGeneratorFunction = functionDeclaration && functionDeclaration.asteriskToken; + const isGeneratorFunction = functionDeclaration && hasAsteriskToken(functionDeclaration); return isGeneratorFunction ? [createDefinitionFromSignatureDeclaration(typeChecker, functionDeclaration)] : undefined; } diff --git a/src/services/importTracker.ts b/src/services/importTracker.ts index 316d3874fb4..5e35328032a 100644 --- a/src/services/importTracker.ts +++ b/src/services/importTracker.ts @@ -138,7 +138,7 @@ export const enum ImportExport { } interface AmbientModuleDeclaration extends ModuleDeclaration { - body?: ModuleBlock; + body: ModuleBlock | undefined; } type SourceFileLike = SourceFile | AmbientModuleDeclaration; // Identifier for the case of `const x = require("y")`. diff --git a/src/services/navigationBar.ts b/src/services/navigationBar.ts index 6ca2a1804a8..68b3e928337 100644 --- a/src/services/navigationBar.ts +++ b/src/services/navigationBar.ts @@ -48,6 +48,7 @@ import { getTextOfIdentifierOrLiteral, getTextOfNode, hasJSDocNodes, + hasName, Identifier, ImportClause, InterfaceDeclaration, @@ -407,12 +408,12 @@ function addChildrenRecursively(node: Node | undefined): void { break; } case SyntaxKind.FunctionDeclaration: - const nameNode = (node as FunctionLikeDeclaration).name; + const nameNode = (node as FunctionDeclaration).name; // If we see a function declaration track as a possible ES5 class if (nameNode && isIdentifier(nameNode)) { addTrackedEs5Class(nameNode.text); } - addNodeWithRecursiveChild(node, (node as FunctionLikeDeclaration).body); + addNodeWithRecursiveChild(node, (node as FunctionDeclaration).body); break; case SyntaxKind.ArrowFunction: case SyntaxKind.FunctionExpression: @@ -1027,7 +1028,7 @@ function getModifiers(node: Node): string { function getFunctionOrClassName(node: FunctionExpression | FunctionDeclaration | ArrowFunction | ClassLikeDeclaration): string { const { parent } = node; - if (node.name && getFullWidth(node.name) > 0) { + if (hasName(node) && getFullWidth(node.name) > 0) { return cleanText(declarationNameToString(node.name)); } // See if it is a var initializer. If so, use the var name. diff --git a/src/services/refactors/convertArrowFunctionOrFunctionExpression.ts b/src/services/refactors/convertArrowFunctionOrFunctionExpression.ts index ef0576e59f8..2874f801cd6 100644 --- a/src/services/refactors/convertArrowFunctionOrFunctionExpression.ts +++ b/src/services/refactors/convertArrowFunctionOrFunctionExpression.ts @@ -2,6 +2,7 @@ import { ApplicableRefactorInfo, ArrowFunction, Block, + canHaveAsteriskToken, ConciseBody, copyComments, copyTrailingAsLeadingComments, @@ -48,6 +49,7 @@ import { suppressLeadingTrivia, SyntaxKind, textChanges, + tryCast, TypeChecker, VariableDeclaration, VariableDeclarationList, @@ -261,7 +263,7 @@ function getVariableInfo(func: FunctionExpression | ArrowFunction): VariableInfo function getEditInfoForConvertToAnonymousFunction(context: RefactorContext, func: FunctionExpression | ArrowFunction): FileTextChanges[] { const { file } = context; const body = convertToBlock(func.body); - const newNode = factory.createFunctionExpression(func.modifiers, func.asteriskToken, /*name*/ undefined, func.typeParameters, func.parameters, func.type, body); + const newNode = factory.createFunctionExpression(func.modifiers, tryCast(func, canHaveAsteriskToken)?.asteriskToken, /*name*/ undefined, func.typeParameters, func.parameters, func.type, body); return textChanges.ChangeTracker.with(context, t => t.replaceNode(file, func, newNode)); } @@ -274,7 +276,7 @@ function getEditInfoForConvertToNamedFunction(context: RefactorContext, func: Fu const modifiersFlags = (getCombinedModifierFlags(variableDeclaration) & ModifierFlags.Export) | getEffectiveModifierFlags(func); const modifiers = factory.createModifiersFromModifierFlags(modifiersFlags); - const newNode = factory.createFunctionDeclaration(length(modifiers) ? modifiers : undefined, func.asteriskToken, name, func.typeParameters, func.parameters, func.type, body); + const newNode = factory.createFunctionDeclaration(length(modifiers) ? modifiers : undefined, tryCast(func, canHaveAsteriskToken)?.asteriskToken, name, func.typeParameters, func.parameters, func.type, body); if (variableDeclarationList.declarations.length === 1) { return textChanges.ChangeTracker.with(context, t => t.replaceNode(file, statement, newNode)); diff --git a/src/services/refactors/extractSymbol.ts b/src/services/refactors/extractSymbol.ts index 2d59e42c433..d419850fcc0 100644 --- a/src/services/refactors/extractSymbol.ts +++ b/src/services/refactors/extractSymbol.ts @@ -9,6 +9,7 @@ import { BreakStatement, CancellationToken, canHaveModifiers, + cast, CharacterCodes, ClassElement, ClassLikeDeclaration, @@ -59,6 +60,7 @@ import { getThisContainer, getUniqueName, hasEffectiveModifier, + hasName, hasSyntacticModifier, Identifier, InternalNodeBuilderFlags, @@ -1646,7 +1648,7 @@ function transformFunctionBody(body: Node, exposedVariableDeclarations: readonly assignments.unshift(factory.createPropertyAssignment(returnValueProperty, visitNode(node.expression, visitor, isExpression))); } if (assignments.length === 1) { - return factory.createReturnStatement(assignments[0].name as Expression); + return factory.createReturnStatement(cast(assignments[0], hasName).name as Expression); } else { return factory.createReturnStatement(factory.createObjectLiteralExpression(assignments)); diff --git a/src/services/suggestionDiagnostics.ts b/src/services/suggestionDiagnostics.ts index 3c4cf5c39b9..d36fc358099 100644 --- a/src/services/suggestionDiagnostics.ts +++ b/src/services/suggestionDiagnostics.ts @@ -6,6 +6,7 @@ import { Block, CallExpression, CancellationToken, + canHaveName, codefix, compilerOptionsIndicateEsModules, createDiagnosticForNode, @@ -24,6 +25,7 @@ import { getAssignmentDeclarationKind, getFunctionFlags, hasInitializer, + hasName, hasPropertyAccessExpressionWithName, Identifier, importFromModuleSpecifier, @@ -55,6 +57,7 @@ import { some, SourceFile, SyntaxKind, + tryCast, TypeChecker, VariableStatement, } from "./_namespaces/ts.js"; @@ -125,7 +128,7 @@ export function computeSuggestionDiagnostics(sourceFile: SourceFile, program: Pr } if (codefix.parameterShouldGetTypeFromJSDoc(node)) { - diags.push(createDiagnosticForNode(node.name || node, Diagnostics.JSDoc_types_may_be_moved_to_TypeScript_types)); + diags.push(createDiagnosticForNode(tryCast(node, canHaveName)?.name ?? node, Diagnostics.JSDoc_types_may_be_moved_to_TypeScript_types)); } } @@ -176,7 +179,7 @@ function addConvertToAsyncFunctionDiagnostics(node: FunctionLikeDeclaration, che // need to check function before checking map so that deeper levels of nested callbacks are checked if (isConvertibleFunction(node, checker) && !visitedNestedConvertibleFunctions.has(getKeyFromNode(node))) { diags.push(createDiagnosticForNode( - !node.name && isVariableDeclaration(node.parent) && isIdentifier(node.parent.name) ? node.parent.name : node, + !hasName(node) && isVariableDeclaration(node.parent) && isIdentifier(node.parent.name) ? node.parent.name : node, Diagnostics.This_may_be_converted_to_an_async_function, )); } diff --git a/src/services/symbolDisplay.ts b/src/services/symbolDisplay.ts index 6c49848435e..ca22f49d297 100644 --- a/src/services/symbolDisplay.ts +++ b/src/services/symbolDisplay.ts @@ -29,6 +29,7 @@ import { getTextOfConstantValue, getTextOfIdentifierOrLiteral, getTextOfNode, + hasName, hasSyntacticModifier, idText, ImportEqualsDeclaration, @@ -509,7 +510,7 @@ function getSymbolDisplayPartsDocumentationAndSymbolKindWorker(typeChecker: Type displayParts.push(keywordPart(SyntaxKind.NewKeyword)); displayParts.push(spacePart()); } - else if (declaration.kind !== SyntaxKind.CallSignature && declaration.name) { + else if (declaration.kind !== SyntaxKind.CallSignature && hasName(declaration)) { addFullSymbolName(declaration.symbol); } addRange(displayParts, signatureToDisplayParts(typeChecker, signature, sourceFile, TypeFormatFlags.WriteTypeArgumentsOfSignature)); diff --git a/src/services/textChanges.ts b/src/services/textChanges.ts index b0a34cecde9..73683a9c095 100644 --- a/src/services/textChanges.ts +++ b/src/services/textChanges.ts @@ -1,7 +1,6 @@ import { addToSeen, ArrowFunction, - ast, BindingElement, CharacterCodes, ClassElement, @@ -67,6 +66,7 @@ import { group, HasJSDoc, hasJSDocNodes, + hasName, ImportClause, ImportSpecifier, indexOfNode, @@ -163,6 +163,7 @@ import { TextRange, textSpanEnd, Token, + TokenSyntaxKind, tokenToString, toSorted, TransformationContext, @@ -681,11 +682,11 @@ export class ChangeTracker { this.insertNodesAt(sourceFile, getAdjustedStartPosition(sourceFile, before, options), newNodes, this.getOptionsForInsertNodeBefore(before, first(newNodes), blankLineBetween)); } - public insertModifierAt(sourceFile: SourceFile, pos: number, modifier: SyntaxKind, options: InsertNodeOptions = {}): void { + public insertModifierAt(sourceFile: SourceFile, pos: number, modifier: TokenSyntaxKind, options: InsertNodeOptions = {}): void { this.insertNodeAt(sourceFile, pos, factory.createToken(modifier), options); } - public insertModifierBefore(sourceFile: SourceFile, modifier: SyntaxKind, before: Node): void { + public insertModifierBefore(sourceFile: SourceFile, modifier: TokenSyntaxKind, before: Node): void { return this.insertModifierAt(sourceFile, before.getStart(sourceFile), modifier, { suffix: " " }); } @@ -980,7 +981,7 @@ export class ChangeTracker { } public insertName(sourceFile: SourceFile, node: FunctionExpression | ClassExpression | ArrowFunction, name: string): void { - Debug.assert(!node.name); + Debug.assert(!hasName(node)); if (node.kind === SyntaxKind.ArrowFunction) { const arrow = findChildOfKind(node, SyntaxKind.EqualsGreaterThanToken, sourceFile)!; const lparen = findChildOfKind(node, SyntaxKind.OpenParenToken, sourceFile); @@ -1384,7 +1385,7 @@ const textChangesTransformationContext: TransformationContext = { export function assignPositionsToNode(node: Node): Node { const visited = visitEachChild(node, assignPositionsToNode, textChangesTransformationContext, assignPositionsToNodeArray, assignPositionsToNode); // create proxy node for non synthesized nodes - const newNode = nodeIsSynthesized(visited) ? visited : (visited as ast.Node).ast.shadow().node; + const newNode = nodeIsSynthesized(visited) ? visited : visited.ast.shadow().node; setTextRangePosEnd(newNode, getPos(node), getEnd(node)); return newNode; } diff --git a/src/services/types.ts b/src/services/types.ts index 30e4ee715d2..a40ed9f838c 100644 --- a/src/services/types.ts +++ b/src/services/types.ts @@ -14,6 +14,7 @@ import { GetEffectiveTypeRootsHost, HasChangedAutomaticTypeDirectiveNames, HasInvalidatedResolutions, + IScriptSnapshot, JSDocParsingMode, LineAndCharacter, MinimalResolutionCacheHost, @@ -43,50 +44,6 @@ import { UserPreferences, } from "./_namespaces/ts.js"; -declare module "../compiler/types.js" { - // Module transform: converted from interface augmentation - export interface Node { - getSourceFile(): SourceFile; - getChildCount(sourceFile?: SourceFile): number; - getChildAt(index: number, sourceFile?: SourceFile): Node; - getChildren(sourceFile?: SourceFile): readonly Node[]; - /** @internal */ - getChildren(sourceFile?: SourceFileLike): readonly Node[]; // eslint-disable-line @typescript-eslint/unified-signatures - getStart(sourceFile?: SourceFile, includeJsDocComment?: boolean): number; - /** @internal */ - getStart(sourceFile?: SourceFileLike, includeJsDocComment?: boolean): number; // eslint-disable-line @typescript-eslint/unified-signatures - getFullStart(): number; - getEnd(): number; - getWidth(sourceFile?: SourceFileLike): number; - getFullWidth(): number; - getLeadingTriviaWidth(sourceFile?: SourceFile): number; - getFullText(sourceFile?: SourceFile): string; - getText(sourceFile?: SourceFile): string; - getFirstToken(sourceFile?: SourceFile): Node | undefined; - /** @internal */ - getFirstToken(sourceFile?: SourceFileLike): Node | undefined; // eslint-disable-line @typescript-eslint/unified-signatures - getLastToken(sourceFile?: SourceFile): Node | undefined; - /** @internal */ - getLastToken(sourceFile?: SourceFileLike): Node | undefined; // eslint-disable-line @typescript-eslint/unified-signatures - // See ts.forEachChild for documentation. - forEachChild(cbNode: (node: Node) => T | undefined, cbNodeArray?: (nodes: NodeArray) => T | undefined): T | undefined; - } -} - -declare module "../compiler/types.js" { - // Module transform: converted from interface augmentation - export interface Identifier { - readonly text: string; - } -} - -declare module "../compiler/types.js" { - // Module transform: converted from interface augmentation - export interface PrivateIdentifier { - readonly text: string; - } -} - declare module "../compiler/types.js" { // Module transform: converted from interface augmentation export interface Symbol { @@ -156,25 +113,6 @@ declare module "../compiler/types.js" { } } -declare module "../compiler/types.js" { - // Module transform: converted from interface augmentation - export interface SourceFile { - /** @internal */ version: string; - /** @internal */ scriptSnapshot: IScriptSnapshot | undefined; - /** @internal */ nameTable: Map<__String, number> | undefined; - - /** @internal */ getNamedDeclarations(): Map; - - getLineAndCharacterOfPosition(pos: number): LineAndCharacter; - getLineEndOfPosition(pos: number): number; - getLineStarts(): readonly number[]; - getPositionOfLineAndCharacter(line: number, character: number): number; - update(newText: string, textChangeRange: TextChangeRange): SourceFile; - - /** @internal */ sourceMapper?: DocumentPositionMapper; - } -} - declare module "../compiler/types.js" { // Module transform: converted from interface augmentation export interface SourceFileLike { @@ -189,32 +127,6 @@ declare module "../compiler/types.js" { } } -/** - * Represents an immutable snapshot of a script at a specified time.Once acquired, the - * snapshot is observably immutable. i.e. the same calls with the same parameters will return - * the same values. - */ -// eslint-disable-next-line @typescript-eslint/naming-convention -export interface IScriptSnapshot { - /** Gets a portion of the script snapshot specified by [start, end). */ - getText(start: number, end: number): string; - - /** Gets the length of this script snapshot. */ - getLength(): number; - - /** - * Gets the TextChangeRange that describe how the text changed between this text and - * an older version. This information is used by the incremental parser to determine - * what sections of the script need to be re-parsed. 'undefined' can be returned if the - * change range cannot be determined. However, in that case, incremental parsing will - * not happen and the entire document will be re - parsed. - */ - getChangeRange(oldSnapshot: IScriptSnapshot): TextChangeRange | undefined; - - /** Releases all resources held by this script snapshot */ - dispose?(): void; -} - export namespace ScriptSnapshot { class StringScriptSnapshot implements IScriptSnapshot { constructor(private text: string) { diff --git a/src/services/utilities.ts b/src/services/utilities.ts index fe06adeb8b2..dbbf3b2e476 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -13,6 +13,7 @@ import { BreakOrContinueStatement, CallExpression, canHaveModifiers, + canHaveName, CaseClause, cast, CatchClause, @@ -279,7 +280,6 @@ import { LanguageServiceHost, last, lastOrUndefined, - LiteralExpression, map, maybeBind, Modifier, @@ -347,6 +347,7 @@ import { startsWith, StringLiteral, StringLiteralLike, + StringLiteralLikeNode, stringToToken, stripQuotes, Symbol, @@ -715,7 +716,7 @@ export function isNameOfModuleDeclaration(node: Node): boolean { /** @internal */ export function isNameOfFunctionDeclaration(node: Node): boolean { - return isIdentifier(node) && tryCast(node.parent, isFunctionLike)?.name === node; + return isIdentifier(node) && tryCast(tryCast(node.parent, isFunctionLike), canHaveName)?.name === node; } /** @internal */ @@ -1863,7 +1864,7 @@ export function isInString(sourceFile: SourceFile, position: number, previousTok } if (position === end) { - return !!(previousToken as LiteralExpression).isUnterminated; + return !!(previousToken as StringLiteralLikeNode).isUnterminated; } } diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index c6e0eda83f9..524d5225e4d 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -14,7 +14,7 @@ and limitations under the License. ***************************************************************************** */ declare namespace ts { - namespace server { + export namespace server { namespace protocol { export import ApplicableRefactorInfo = ts.ApplicableRefactorInfo; export import ClassificationType = ts.ClassificationType; @@ -3585,7 +3585,7 @@ declare namespace ts { responseRequired?: boolean; } } - namespace JsTyping { + export namespace JsTyping { interface TypingResolutionHost { directoryExists(path: string): boolean; fileExists(fileName: string): boolean; @@ -3593,35 +3593,44 @@ declare namespace ts { readDirectory(rootDir: string, extensions: readonly string[], excludes: readonly string[] | undefined, includes: readonly string[] | undefined, depth?: number): string[]; } } - const versionMajorMinor = "5.7"; + const ReadonlyArray: new(...items: readonly T[]) => readonly T[]; + class AstNodeExtraFields { + } + /** + * Holds the id for a `Node`. The id is held by another object to support + * source file redirection. + */ + class AstNodeId { + } + export const versionMajorMinor = "5.7"; /** The version of the TypeScript compiler release */ - const version: string; + export const version: string; /** * Type of objects whose values are all of the same type. * The `in` and `for-in` operators can *not* be safely used, * since `Object.prototype` may be modified by outside code. */ - interface MapLike { + export interface MapLike { [index: string]: T; } - interface SortedReadonlyArray extends ReadonlyArray { + export interface SortedReadonlyArray extends ReadonlyArray { " __sortedArrayBrand": any; } - interface SortedArray extends Array { + export interface SortedArray extends Array { " __sortedArrayBrand": any; } - type Path = string & { + export type Path = string & { __pathBrand: any; }; - interface TextRange { + export interface TextRange { pos: number; end: number; } - interface ReadonlyTextRange { + export interface ReadonlyTextRange { readonly pos: number; readonly end: number; } - enum SyntaxKind { + export enum SyntaxKind { Unknown = 0, EndOfFileToken = 1, SingleLineCommentTrivia = 2, @@ -4018,10 +4027,10 @@ declare namespace ts { FirstJSDocTagNode = 327, LastJSDocTagNode = 351, } - type TriviaSyntaxKind = SyntaxKind.SingleLineCommentTrivia | SyntaxKind.MultiLineCommentTrivia | SyntaxKind.NewLineTrivia | SyntaxKind.WhitespaceTrivia | SyntaxKind.ShebangTrivia | SyntaxKind.ConflictMarkerTrivia; - type LiteralSyntaxKind = SyntaxKind.NumericLiteral | SyntaxKind.BigIntLiteral | SyntaxKind.StringLiteral | SyntaxKind.JsxText | SyntaxKind.JsxTextAllWhiteSpaces | SyntaxKind.RegularExpressionLiteral | SyntaxKind.NoSubstitutionTemplateLiteral; - type PseudoLiteralSyntaxKind = SyntaxKind.TemplateHead | SyntaxKind.TemplateMiddle | SyntaxKind.TemplateTail; - type PunctuationSyntaxKind = + export type TriviaSyntaxKind = SyntaxKind.SingleLineCommentTrivia | SyntaxKind.MultiLineCommentTrivia | SyntaxKind.NewLineTrivia | SyntaxKind.WhitespaceTrivia | SyntaxKind.ShebangTrivia | SyntaxKind.ConflictMarkerTrivia; + export type LiteralSyntaxKind = SyntaxKind.NumericLiteral | SyntaxKind.BigIntLiteral | SyntaxKind.StringLiteral | SyntaxKind.JsxText | SyntaxKind.JsxTextAllWhiteSpaces | SyntaxKind.RegularExpressionLiteral | SyntaxKind.NoSubstitutionTemplateLiteral; + export type PseudoLiteralSyntaxKind = SyntaxKind.TemplateHead | SyntaxKind.TemplateMiddle | SyntaxKind.TemplateTail; + export type PunctuationSyntaxKind = | SyntaxKind.OpenBraceToken | SyntaxKind.CloseBraceToken | SyntaxKind.OpenParenToken @@ -4083,7 +4092,7 @@ declare namespace ts { | SyntaxKind.AmpersandEqualsToken | SyntaxKind.BarEqualsToken | SyntaxKind.CaretEqualsToken; - type KeywordSyntaxKind = + export type KeywordSyntaxKind = | SyntaxKind.AbstractKeyword | SyntaxKind.AccessorKeyword | SyntaxKind.AnyKeyword @@ -4167,12 +4176,50 @@ declare namespace ts { | SyntaxKind.WhileKeyword | SyntaxKind.WithKeyword | SyntaxKind.YieldKeyword; - type ModifierSyntaxKind = SyntaxKind.AbstractKeyword | SyntaxKind.AccessorKeyword | SyntaxKind.AsyncKeyword | SyntaxKind.ConstKeyword | SyntaxKind.DeclareKeyword | SyntaxKind.DefaultKeyword | SyntaxKind.ExportKeyword | SyntaxKind.InKeyword | SyntaxKind.PrivateKeyword | SyntaxKind.ProtectedKeyword | SyntaxKind.PublicKeyword | SyntaxKind.ReadonlyKeyword | SyntaxKind.OutKeyword | SyntaxKind.OverrideKeyword | SyntaxKind.StaticKeyword; - type KeywordTypeSyntaxKind = SyntaxKind.AnyKeyword | SyntaxKind.BigIntKeyword | SyntaxKind.BooleanKeyword | SyntaxKind.IntrinsicKeyword | SyntaxKind.NeverKeyword | SyntaxKind.NumberKeyword | SyntaxKind.ObjectKeyword | SyntaxKind.StringKeyword | SyntaxKind.SymbolKeyword | SyntaxKind.UndefinedKeyword | SyntaxKind.UnknownKeyword | SyntaxKind.VoidKeyword; - type TokenSyntaxKind = SyntaxKind.Unknown | SyntaxKind.EndOfFileToken | TriviaSyntaxKind | LiteralSyntaxKind | PseudoLiteralSyntaxKind | PunctuationSyntaxKind | SyntaxKind.Identifier | SyntaxKind.PrivateIdentifier | KeywordSyntaxKind; - type JsxTokenSyntaxKind = SyntaxKind.LessThanSlashToken | SyntaxKind.EndOfFileToken | SyntaxKind.ConflictMarkerTrivia | SyntaxKind.JsxText | SyntaxKind.JsxTextAllWhiteSpaces | SyntaxKind.OpenBraceToken | SyntaxKind.LessThanToken; - type JSDocSyntaxKind = SyntaxKind.EndOfFileToken | SyntaxKind.WhitespaceTrivia | SyntaxKind.AtToken | SyntaxKind.NewLineTrivia | SyntaxKind.AsteriskToken | SyntaxKind.OpenBraceToken | SyntaxKind.CloseBraceToken | SyntaxKind.LessThanToken | SyntaxKind.GreaterThanToken | SyntaxKind.OpenBracketToken | SyntaxKind.CloseBracketToken | SyntaxKind.OpenParenToken | SyntaxKind.CloseParenToken | SyntaxKind.EqualsToken | SyntaxKind.CommaToken | SyntaxKind.DotToken | SyntaxKind.Identifier | SyntaxKind.BacktickToken | SyntaxKind.HashToken | SyntaxKind.Unknown | KeywordSyntaxKind; - enum NodeFlags { + export type ModifierSyntaxKind = SyntaxKind.AbstractKeyword | SyntaxKind.AccessorKeyword | SyntaxKind.AsyncKeyword | SyntaxKind.ConstKeyword | SyntaxKind.DeclareKeyword | SyntaxKind.DefaultKeyword | SyntaxKind.ExportKeyword | SyntaxKind.InKeyword | SyntaxKind.PrivateKeyword | SyntaxKind.ProtectedKeyword | SyntaxKind.PublicKeyword | SyntaxKind.ReadonlyKeyword | SyntaxKind.OutKeyword | SyntaxKind.OverrideKeyword | SyntaxKind.StaticKeyword; + export type KeywordTypeSyntaxKind = SyntaxKind.AnyKeyword | SyntaxKind.BigIntKeyword | SyntaxKind.BooleanKeyword | SyntaxKind.IntrinsicKeyword | SyntaxKind.NeverKeyword | SyntaxKind.NumberKeyword | SyntaxKind.ObjectKeyword | SyntaxKind.StringKeyword | SyntaxKind.SymbolKeyword | SyntaxKind.UndefinedKeyword | SyntaxKind.UnknownKeyword | SyntaxKind.VoidKeyword; + export type TypeNodeSyntaxKind = + | KeywordTypeSyntaxKind + | SyntaxKind.TypePredicate + | SyntaxKind.TypeReference + | SyntaxKind.FunctionType + | SyntaxKind.ConstructorType + | SyntaxKind.TypeQuery + | SyntaxKind.TypeLiteral + | SyntaxKind.ArrayType + | SyntaxKind.TupleType + | SyntaxKind.NamedTupleMember + | SyntaxKind.OptionalType + | SyntaxKind.RestType + | SyntaxKind.UnionType + | SyntaxKind.IntersectionType + | SyntaxKind.ConditionalType + | SyntaxKind.InferType + | SyntaxKind.ParenthesizedType + | SyntaxKind.ThisType + | SyntaxKind.TypeOperator + | SyntaxKind.IndexedAccessType + | SyntaxKind.MappedType + | SyntaxKind.LiteralType + | SyntaxKind.TemplateLiteralType + | SyntaxKind.TemplateLiteralTypeSpan + | SyntaxKind.ImportType + | SyntaxKind.ExpressionWithTypeArguments + | SyntaxKind.JSDocTypeExpression + | SyntaxKind.JSDocAllType + | SyntaxKind.JSDocUnknownType + | SyntaxKind.JSDocNonNullableType + | SyntaxKind.JSDocNullableType + | SyntaxKind.JSDocOptionalType + | SyntaxKind.JSDocFunctionType + | SyntaxKind.JSDocVariadicType + | SyntaxKind.JSDocNamepathType + | SyntaxKind.JSDocSignature + | SyntaxKind.JSDocTypeLiteral; + export type TokenSyntaxKind = SyntaxKind.Unknown | SyntaxKind.EndOfFileToken | TriviaSyntaxKind | LiteralSyntaxKind | PseudoLiteralSyntaxKind | PunctuationSyntaxKind | SyntaxKind.Identifier | SyntaxKind.PrivateIdentifier | KeywordSyntaxKind; + export type JsxTokenSyntaxKind = SyntaxKind.LessThanSlashToken | SyntaxKind.EndOfFileToken | SyntaxKind.ConflictMarkerTrivia | SyntaxKind.JsxText | SyntaxKind.JsxTextAllWhiteSpaces | SyntaxKind.OpenBraceToken | SyntaxKind.LessThanToken; + export type JSDocSyntaxKind = SyntaxKind.EndOfFileToken | SyntaxKind.WhitespaceTrivia | SyntaxKind.AtToken | SyntaxKind.NewLineTrivia | SyntaxKind.AsteriskToken | SyntaxKind.OpenBraceToken | SyntaxKind.CloseBraceToken | SyntaxKind.LessThanToken | SyntaxKind.GreaterThanToken | SyntaxKind.OpenBracketToken | SyntaxKind.CloseBracketToken | SyntaxKind.OpenParenToken | SyntaxKind.CloseParenToken | SyntaxKind.EqualsToken | SyntaxKind.CommaToken | SyntaxKind.DotToken | SyntaxKind.Identifier | SyntaxKind.BacktickToken | SyntaxKind.HashToken | SyntaxKind.Unknown | KeywordSyntaxKind; + export enum NodeFlags { None = 0, Let = 1, Const = 2, @@ -4206,7 +4253,7 @@ declare namespace ts { ContextFlags = 101441536, TypeExcludesFlags = 81920, } - enum ModifierFlags { + export enum ModifierFlags { None = 0, Public = 1, Private = 2, @@ -4235,7 +4282,7 @@ declare namespace ts { All = 131071, Modifier = 98303, } - enum JsxFlags { + export enum JsxFlags { None = 0, /** An element from a named property of the JSX.IntrinsicElements interface */ IntrinsicNamedElement = 1, @@ -4243,38 +4290,42 @@ declare namespace ts { IntrinsicIndexedElement = 2, IntrinsicElement = 3, } - interface Node extends ReadonlyTextRange { - readonly kind: SyntaxKind; - readonly flags: NodeFlags; - readonly parent: Node; - } - interface Node { + export type NodeConstructor = new(ast: AstNode>) => N; + export class Node implements ReadonlyTextRange { + readonly ast: AstNode>; + constructor(ast: AstNode>); + get kind(): K; + get data(): T; + get pos(): number; + get end(): number; + get flags(): NodeFlags; + get parent(): Node; getSourceFile(): SourceFile; - getChildCount(sourceFile?: SourceFile): number; - getChildAt(index: number, sourceFile?: SourceFile): Node; - getChildren(sourceFile?: SourceFile): readonly Node[]; - getStart(sourceFile?: SourceFile, includeJsDocComment?: boolean): number; + getStart(sourceFile?: SourceFileLike, includeJsDocComment?: boolean): number; getFullStart(): number; getEnd(): number; getWidth(sourceFile?: SourceFileLike): number; getFullWidth(): number; - getLeadingTriviaWidth(sourceFile?: SourceFile): number; - getFullText(sourceFile?: SourceFile): string; - getText(sourceFile?: SourceFile): string; - getFirstToken(sourceFile?: SourceFile): Node | undefined; - getLastToken(sourceFile?: SourceFile): Node | undefined; + getLeadingTriviaWidth(sourceFile?: SourceFileLike): number; + getFullText(sourceFile?: SourceFileLike): string; + getText(sourceFile?: SourceFileLike): string; + getChildCount(sourceFile?: SourceFileLike): number; + getChildAt(index: number, sourceFile?: SourceFileLike): Node; + getChildren(sourceFile?: SourceFileLike): readonly Node[]; + getFirstToken(sourceFile?: SourceFileLike): Node | undefined; + getLastToken(sourceFile?: SourceFileLike): Node | undefined; forEachChild(cbNode: (node: Node) => T | undefined, cbNodeArray?: (nodes: NodeArray) => T | undefined): T | undefined; } - interface JSDocContainer extends Node { + export interface JSDocContainer extends Node { _jsdocContainerBrand: any; } - interface LocalsContainer extends Node { + export interface LocalsContainer extends Node { _localsContainerBrand: any; } - interface FlowContainer extends Node { + export interface FlowContainer extends Node { _flowContainerBrand: any; } - type HasJSDoc = + export type HasJSDoc = | AccessorDeclaration | ArrowFunction | BinaryExpression @@ -4339,236 +4390,349 @@ declare namespace ts { | VariableStatement | WhileStatement | WithStatement; - type HasType = SignatureDeclaration | VariableDeclaration | ParameterDeclaration | PropertySignature | PropertyDeclaration | TypePredicateNode | ParenthesizedTypeNode | TypeOperatorNode | MappedTypeNode | AssertionExpression | TypeAliasDeclaration | JSDocTypeExpression | JSDocNonNullableType | JSDocNullableType | JSDocOptionalType | JSDocVariadicType; - type HasTypeArguments = CallExpression | NewExpression | TaggedTemplateExpression | JsxOpeningElement | JsxSelfClosingElement; - type HasInitializer = HasExpressionInitializer | ForStatement | ForInStatement | ForOfStatement | JsxAttribute; - type HasExpressionInitializer = VariableDeclaration | ParameterDeclaration | BindingElement | PropertyDeclaration | PropertyAssignment | EnumMember; - type HasDecorators = ParameterDeclaration | PropertyDeclaration | MethodDeclaration | GetAccessorDeclaration | SetAccessorDeclaration | ClassExpression | ClassDeclaration; - type HasModifiers = TypeParameterDeclaration | ParameterDeclaration | ConstructorTypeNode | PropertySignature | PropertyDeclaration | MethodSignature | MethodDeclaration | ConstructorDeclaration | GetAccessorDeclaration | SetAccessorDeclaration | IndexSignatureDeclaration | FunctionExpression | ArrowFunction | ClassExpression | VariableStatement | FunctionDeclaration | ClassDeclaration | InterfaceDeclaration | TypeAliasDeclaration | EnumDeclaration | ModuleDeclaration | ImportEqualsDeclaration | ImportDeclaration | ExportAssignment | ExportDeclaration; - interface NodeArray extends ReadonlyArray, ReadonlyTextRange { - readonly hasTrailingComma: boolean; + export type HasType = SignatureDeclaration | VariableDeclaration | ParameterDeclaration | PropertySignature | PropertyDeclaration | TypePredicateNode | ParenthesizedTypeNode | TypeOperatorNode | MappedTypeNode | AssertionExpression | TypeAliasDeclaration | JSDocTypeExpression | JSDocNonNullableType | JSDocNullableType | JSDocOptionalType | JSDocVariadicType; + export type HasTypeArguments = CallExpression | NewExpression | TaggedTemplateExpression | JsxOpeningElement | JsxSelfClosingElement; + export type HasInitializer = HasExpressionInitializer | ForStatement | ForInStatement | ForOfStatement | JsxAttribute; + export type HasExpressionInitializer = VariableDeclaration | ParameterDeclaration | BindingElement | PropertyDeclaration | PropertyAssignment | EnumMember; + export type HasDecorators = ParameterDeclaration | PropertyDeclaration | MethodDeclaration | GetAccessorDeclaration | SetAccessorDeclaration | ClassExpression | ClassDeclaration; + export type HasModifiers = TypeParameterDeclaration | ParameterDeclaration | ConstructorTypeNode | PropertySignature | PropertyDeclaration | MethodSignature | MethodDeclaration | ConstructorDeclaration | GetAccessorDeclaration | SetAccessorDeclaration | IndexSignatureDeclaration | FunctionExpression | ArrowFunction | ClassExpression | VariableStatement | FunctionDeclaration | ClassDeclaration | InterfaceDeclaration | TypeAliasDeclaration | EnumDeclaration | ModuleDeclaration | ImportEqualsDeclaration | ImportDeclaration | ExportAssignment | ExportDeclaration; + export class NodeArray extends ReadonlyArray { + readonly ast: AstNodeArray; + constructor(ast: AstNodeArray); + static get [globalThis.Symbol.species](): ArrayConstructor; + get pos(): number; + get end(): number; + get hasTrailingComma(): boolean; } - interface Token extends Node { + export class Token extends Node { + getChildCount(_sourceFile?: SourceFileLike): number; + getChildAt(index: number, _sourceFile?: SourceFileLike): Node; + getChildren(_sourceFile?: SourceFileLike): readonly Node[]; + getFirstToken(_sourceFile?: SourceFileLike): Node | undefined; + getLastToken(_sourceFile?: SourceFileLike): Node | undefined; + forEachChild(_cbNode: (node: Node) => T | undefined, _cbNodeArray?: (nodes: NodeArray) => T | undefined): T | undefined; + } + export class EndOfFileToken extends Token implements JSDocContainer { + _jsdocContainerBrand: any; + readonly ast: AstEndOfFileToken; + } + export interface PunctuationToken extends Token { + } + export type DotToken = PunctuationToken; + export type DotDotDotToken = PunctuationToken; + export type QuestionToken = PunctuationToken; + export type ExclamationToken = PunctuationToken; + export type ColonToken = PunctuationToken; + export type EqualsToken = PunctuationToken; + export type AmpersandAmpersandEqualsToken = PunctuationToken; + export type BarBarEqualsToken = PunctuationToken; + export type QuestionQuestionEqualsToken = PunctuationToken; + export type AsteriskToken = PunctuationToken; + export type EqualsGreaterThanToken = PunctuationToken; + export type PlusToken = PunctuationToken; + export type MinusToken = PunctuationToken; + export type QuestionDotToken = PunctuationToken; + export interface KeywordToken extends Token { + } + export type AssertsKeyword = KeywordToken; + export type AssertKeyword = KeywordToken; + export type AwaitKeyword = KeywordToken; + export type CaseKeyword = KeywordToken; + export interface ModifierToken extends KeywordToken { + } + export type AbstractKeyword = ModifierToken; + export type AccessorKeyword = ModifierToken; + export type AsyncKeyword = ModifierToken; + export type ConstKeyword = ModifierToken; + export type DeclareKeyword = ModifierToken; + export type DefaultKeyword = ModifierToken; + export type ExportKeyword = ModifierToken; + export type InKeyword = ModifierToken; + export type PrivateKeyword = ModifierToken; + export type ProtectedKeyword = ModifierToken; + export type PublicKeyword = ModifierToken; + export type ReadonlyKeyword = ModifierToken; + export type OutKeyword = ModifierToken; + export type OverrideKeyword = ModifierToken; + export type StaticKeyword = ModifierToken; + export type Modifier = AbstractKeyword | AccessorKeyword | AsyncKeyword | ConstKeyword | DeclareKeyword | DefaultKeyword | ExportKeyword | InKeyword | PrivateKeyword | ProtectedKeyword | PublicKeyword | OutKeyword | OverrideKeyword | ReadonlyKeyword | StaticKeyword; + export type ModifierLike = Modifier | Decorator; + export type AccessibilityModifier = PublicKeyword | PrivateKeyword | ProtectedKeyword; + export type ParameterPropertyModifier = AccessibilityModifier | ReadonlyKeyword; + export type ClassMemberModifier = AccessibilityModifier | ReadonlyKeyword | StaticKeyword | AccessorKeyword; + export type ModifiersArray = NodeArray; + export interface KeywordExpression extends PrimaryExpression, KeywordToken { + readonly ast: AstKeywordExpression; readonly kind: TKind; } - interface EndOfFileToken extends Token, JSDocContainer { - readonly kind: SyntaxKind.EndOfFileToken; - } - interface PunctuationToken extends Token { - } - type DotToken = PunctuationToken; - type DotDotDotToken = PunctuationToken; - type QuestionToken = PunctuationToken; - type ExclamationToken = PunctuationToken; - type ColonToken = PunctuationToken; - type EqualsToken = PunctuationToken; - type AmpersandAmpersandEqualsToken = PunctuationToken; - type BarBarEqualsToken = PunctuationToken; - type QuestionQuestionEqualsToken = PunctuationToken; - type AsteriskToken = PunctuationToken; - type EqualsGreaterThanToken = PunctuationToken; - type PlusToken = PunctuationToken; - type MinusToken = PunctuationToken; - type QuestionDotToken = PunctuationToken; - interface KeywordToken extends Token { - } - type AssertsKeyword = KeywordToken; - type AssertKeyword = KeywordToken; - type AwaitKeyword = KeywordToken; - type CaseKeyword = KeywordToken; - interface ModifierToken extends KeywordToken { - } - type AbstractKeyword = ModifierToken; - type AccessorKeyword = ModifierToken; - type AsyncKeyword = ModifierToken; - type ConstKeyword = ModifierToken; - type DeclareKeyword = ModifierToken; - type DefaultKeyword = ModifierToken; - type ExportKeyword = ModifierToken; - type InKeyword = ModifierToken; - type PrivateKeyword = ModifierToken; - type ProtectedKeyword = ModifierToken; - type PublicKeyword = ModifierToken; - type ReadonlyKeyword = ModifierToken; - type OutKeyword = ModifierToken; - type OverrideKeyword = ModifierToken; - type StaticKeyword = ModifierToken; - type Modifier = AbstractKeyword | AccessorKeyword | AsyncKeyword | ConstKeyword | DeclareKeyword | DefaultKeyword | ExportKeyword | InKeyword | PrivateKeyword | ProtectedKeyword | PublicKeyword | OutKeyword | OverrideKeyword | ReadonlyKeyword | StaticKeyword; - type ModifierLike = Modifier | Decorator; - type AccessibilityModifier = PublicKeyword | PrivateKeyword | ProtectedKeyword; - type ParameterPropertyModifier = AccessibilityModifier | ReadonlyKeyword; - type ClassMemberModifier = AccessibilityModifier | ReadonlyKeyword | StaticKeyword | AccessorKeyword; - type ModifiersArray = NodeArray; - enum GeneratedIdentifierFlags { + export enum GeneratedIdentifierFlags { None = 0, ReservedInNestedScopes = 8, Optimistic = 16, FileLevel = 32, AllowNameSubstitution = 64, } - interface Identifier extends PrimaryExpression, Declaration, JSDocContainer, FlowContainer { - readonly kind: SyntaxKind.Identifier; + export class Identifier extends Token implements PrimaryExpression, Declaration, JSDocContainer, FlowContainer { + _primaryExpressionBrand: any; + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + _declarationBrand: any; + _jsdocContainerBrand: any; + _flowContainerBrand: any; + readonly ast: AstIdentifier; /** - * Prefer to use `id.unescapedText`. (Note: This is available only in services, not internally to the TypeScript compiler.) + * Prefer to use {@link text}. * Text of identifier, but if the identifier begins with two underscores, this will begin with three. */ - readonly escapedText: __String; + get escapedText(): __String; + get text(): string; } - interface Identifier { - readonly text: string; + export class QualifiedName extends Node implements FlowContainer { + _flowContainerBrand: any; + readonly ast: AstQualifiedName; + get left(): EntityName; + get right(): Identifier; } - interface TransientIdentifier extends Identifier { - resolvedSymbol: Symbol; - } - interface QualifiedName extends Node, FlowContainer { - readonly kind: SyntaxKind.QualifiedName; - readonly left: EntityName; - readonly right: Identifier; - } - type EntityName = Identifier | QualifiedName; - type PropertyName = Identifier | StringLiteral | NoSubstitutionTemplateLiteral | NumericLiteral | ComputedPropertyName | PrivateIdentifier | BigIntLiteral; - type MemberName = Identifier | PrivateIdentifier; - type DeclarationName = PropertyName | JsxAttributeName | StringLiteralLike | ElementAccessExpression | BindingPattern | EntityNameExpression; - interface Declaration extends Node { + export type EntityName = Identifier | QualifiedName; + export type PropertyName = Identifier | StringLiteral | NoSubstitutionTemplateLiteral | NumericLiteral | ComputedPropertyName | PrivateIdentifier | BigIntLiteral; + export type MemberName = Identifier | PrivateIdentifier; + export type DeclarationName = PropertyName | JsxAttributeName | StringLiteralLike | ElementAccessExpression | BindingPattern | EntityNameExpression; + export interface Declaration extends Node { _declarationBrand: any; + readonly ast: AstDeclaration; } - interface NamedDeclaration extends Declaration { + export interface NamedDeclaration extends Declaration { readonly name?: DeclarationName | undefined; } - interface DeclarationStatement extends NamedDeclaration, Statement { + export interface DeclarationStatement extends NamedDeclaration, Statement { + readonly ast: AstNode; readonly name?: Identifier | StringLiteral | NumericLiteral | undefined; } - interface ComputedPropertyName extends Node { - readonly kind: SyntaxKind.ComputedPropertyName; - readonly parent: Declaration; - readonly expression: Expression; + export class ComputedPropertyName extends Node { + readonly ast: AstComputedPropertyName; + get parent(): Declaration; + get expression(): Expression; } - interface PrivateIdentifier extends PrimaryExpression { - readonly kind: SyntaxKind.PrivateIdentifier; - readonly escapedText: __String; + export class PrivateIdentifier extends Token { + _primaryExpressionBrand: any; + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + readonly ast: AstPrivateIdentifier; + get escapedText(): __String; + get text(): string; } - interface PrivateIdentifier { - readonly text: string; + export class Decorator extends Node { + readonly ast: AstDecorator; + get parent(): Declaration; + get expression(): LeftHandSideExpression; } - interface Decorator extends Node { - readonly kind: SyntaxKind.Decorator; - readonly parent: NamedDeclaration; - readonly expression: LeftHandSideExpression; + export class TypeParameterDeclaration extends Node implements Declaration, JSDocContainer { + _declarationBrand: any; + _jsdocContainerBrand: any; + readonly ast: AstTypeParameterDeclaration; + get parent(): DeclarationWithTypeParameterChildren | InferTypeNode; + get modifiers(): NodeArray | undefined; + get name(): Identifier; + /** + * NOTE: Consider calling `getEffectiveConstraintOfTypeParameter` + */ + get constraint(): TypeNode | undefined; + get default(): TypeNode | undefined; } - interface TypeParameterDeclaration extends NamedDeclaration, JSDocContainer { - readonly kind: SyntaxKind.TypeParameter; - readonly parent: DeclarationWithTypeParameterChildren | InferTypeNode; - readonly modifiers?: NodeArray | undefined; - readonly name: Identifier; - /** Note: Consider calling `getEffectiveConstraintOfTypeParameter` */ - readonly constraint?: TypeNode | undefined; - readonly default?: TypeNode | undefined; - expression?: Expression | undefined; - } - interface SignatureDeclarationBase extends NamedDeclaration, JSDocContainer { + export interface SignatureDeclarationBase extends NamedDeclaration, JSDocContainer { + readonly ast: AstNode; readonly kind: SignatureDeclaration["kind"]; readonly name?: PropertyName | undefined; readonly typeParameters?: NodeArray | undefined; readonly parameters: NodeArray; readonly type?: TypeNode | undefined; } - type SignatureDeclaration = CallSignatureDeclaration | ConstructSignatureDeclaration | MethodSignature | IndexSignatureDeclaration | FunctionTypeNode | ConstructorTypeNode | JSDocFunctionType | FunctionDeclaration | MethodDeclaration | ConstructorDeclaration | AccessorDeclaration | FunctionExpression | ArrowFunction; - interface CallSignatureDeclaration extends SignatureDeclarationBase, TypeElement, LocalsContainer { - readonly kind: SyntaxKind.CallSignature; + export type SignatureDeclaration = CallSignatureDeclaration | ConstructSignatureDeclaration | MethodSignature | IndexSignatureDeclaration | FunctionTypeNode | ConstructorTypeNode | JSDocFunctionType | FunctionDeclaration | MethodDeclaration | ConstructorDeclaration | AccessorDeclaration | FunctionExpression | ArrowFunction; + export class CallSignatureDeclaration extends Node implements SignatureDeclarationBase, TypeElement, LocalsContainer { + _signatureDeclarationBrand: any; + _declarationBrand: any; + _jsdocContainerBrand: any; + _typeElementBrand: any; + _localsContainerBrand: any; + readonly ast: AstCallSignatureDeclaration; + get typeParameters(): NodeArray | undefined; + get parameters(): NodeArray; + get type(): TypeNode | undefined; } - interface ConstructSignatureDeclaration extends SignatureDeclarationBase, TypeElement, LocalsContainer { - readonly kind: SyntaxKind.ConstructSignature; + export class ConstructSignatureDeclaration extends Node implements SignatureDeclarationBase, TypeElement, LocalsContainer { + _signatureDeclarationBrand: any; + _declarationBrand: any; + _jsdocContainerBrand: any; + _typeElementBrand: any; + _localsContainerBrand: any; + readonly ast: AstConstructSignatureDeclaration; + get typeParameters(): NodeArray | undefined; + get parameters(): NodeArray; + get type(): TypeNode | undefined; } - type BindingName = Identifier | BindingPattern; - interface VariableDeclaration extends NamedDeclaration, JSDocContainer { - readonly kind: SyntaxKind.VariableDeclaration; - readonly parent: VariableDeclarationList | CatchClause; - readonly name: BindingName; - readonly exclamationToken?: ExclamationToken | undefined; - readonly type?: TypeNode | undefined; - readonly initializer?: Expression | undefined; + export type BindingName = Identifier | BindingPattern; + export class VariableDeclaration extends Node implements Declaration, JSDocContainer { + _declarationBrand: any; + _jsdocContainerBrand: any; + readonly ast: AstVariableDeclaration; + get parent(): VariableDeclarationList | CatchClause; + /** + * Declared variable name + */ + get name(): BindingName; + /** + * Optional definite assignment assertion + */ + get exclamationToken(): ExclamationToken | undefined; + /** + * Optional type annotation + */ + get type(): TypeNode | undefined; + /** + * Optional initializer + */ + get initializer(): Expression | undefined; } - interface VariableDeclarationList extends Node { - readonly kind: SyntaxKind.VariableDeclarationList; - readonly parent: VariableStatement | ForStatement | ForOfStatement | ForInStatement; - readonly declarations: NodeArray; + export class VariableDeclarationList extends Node { + readonly ast: AstVariableDeclarationList; + get parent(): VariableStatement | ForStatement | ForOfStatement | ForInStatement; + get declarations(): NodeArray; } - interface ParameterDeclaration extends NamedDeclaration, JSDocContainer { - readonly kind: SyntaxKind.Parameter; - readonly parent: SignatureDeclaration; - readonly modifiers?: NodeArray | undefined; - readonly dotDotDotToken?: DotDotDotToken | undefined; - readonly name: BindingName; - readonly questionToken?: QuestionToken | undefined; - readonly type?: TypeNode | undefined; - readonly initializer?: Expression | undefined; + export class ParameterDeclaration extends Node implements Declaration, JSDocContainer { + _declarationBrand: any; + _jsdocContainerBrand: any; + readonly ast: AstParameterDeclaration; + get parent(): SignatureDeclaration; + get modifiers(): NodeArray | undefined; + get dotDotDotToken(): DotDotDotToken | undefined; + get name(): BindingName; + get questionToken(): QuestionToken | undefined; + get type(): TypeNode | undefined; + get initializer(): Expression | undefined; } - interface BindingElement extends NamedDeclaration, FlowContainer { - readonly kind: SyntaxKind.BindingElement; - readonly parent: BindingPattern; - readonly propertyName?: PropertyName | undefined; - readonly dotDotDotToken?: DotDotDotToken | undefined; - readonly name: BindingName; - readonly initializer?: Expression | undefined; + export class BindingElement extends Node implements Declaration, FlowContainer { + _declarationBrand: any; + _flowContainerBrand: any; + readonly ast: AstBindingElement; + get parent(): BindingPattern; + /** + * Binding property name (in object binding pattern) + */ + get propertyName(): PropertyName | undefined; + /** + * Present on rest element (in object binding pattern) + */ + get dotDotDotToken(): DotDotDotToken | undefined; + /** + * Declared binding element name + */ + get name(): BindingName; + /** + * Optional initializer + */ + get initializer(): Expression | undefined; } - interface PropertySignature extends TypeElement, JSDocContainer { - readonly kind: SyntaxKind.PropertySignature; - readonly parent: TypeLiteralNode | InterfaceDeclaration; - readonly modifiers?: NodeArray | undefined; - readonly name: PropertyName; - readonly questionToken?: QuestionToken | undefined; - readonly type?: TypeNode | undefined; + export class PropertySignature extends Node implements TypeElement, JSDocContainer { + _typeElementBrand: any; + _declarationBrand: any; + _jsdocContainerBrand: any; + readonly ast: AstPropertySignature; + get parent(): TypeLiteralNode | InterfaceDeclaration; + get modifiers(): NodeArray | undefined; + /** + * Declared property name + */ + get name(): PropertyName; + /** + * Present on optional property + */ + get questionToken(): QuestionToken | undefined; + /** + * Optional type annotation + */ + get type(): TypeNode | undefined; } - interface PropertyDeclaration extends ClassElement, JSDocContainer { - readonly kind: SyntaxKind.PropertyDeclaration; - readonly parent: ClassLikeDeclaration; - readonly modifiers?: NodeArray | undefined; - readonly name: PropertyName; - readonly questionToken?: QuestionToken | undefined; - readonly exclamationToken?: ExclamationToken | undefined; - readonly type?: TypeNode | undefined; - readonly initializer?: Expression | undefined; + export class PropertyDeclaration extends Node implements ClassElement, JSDocContainer { + _classElementBrand: any; + _declarationBrand: any; + _jsdocContainerBrand: any; + readonly ast: AstPropertyDeclaration; + get parent(): ClassLikeDeclaration; + get modifiers(): NodeArray | undefined; + get name(): PropertyName; + /** + * Optional field. Disallowed for auto-accessors and only used to report a grammar error (see `isGrammarError` in utilities.ts) + */ + get questionToken(): QuestionToken | undefined; + get exclamationToken(): ExclamationToken | undefined; + get type(): TypeNode | undefined; + /** + * Optional initializer + */ + get initializer(): Expression | undefined; } - interface AutoAccessorPropertyDeclaration extends PropertyDeclaration { + export interface AutoAccessorPropertyDeclaration extends PropertyDeclaration { _autoAccessorBrand: any; } - interface ObjectLiteralElement extends NamedDeclaration { + export interface ObjectLiteralElement extends NamedDeclaration { _objectLiteralBrand: any; + readonly ast: AstObjectLiteralElement; readonly name?: PropertyName | undefined; } /** Unlike ObjectLiteralElement, excludes JSXAttribute and JSXSpreadAttribute. */ - type ObjectLiteralElementLike = PropertyAssignment | ShorthandPropertyAssignment | SpreadAssignment | MethodDeclaration | AccessorDeclaration; - interface PropertyAssignment extends ObjectLiteralElement, JSDocContainer { - readonly kind: SyntaxKind.PropertyAssignment; - readonly parent: ObjectLiteralExpression; - readonly name: PropertyName; - readonly initializer: Expression; + export type ObjectLiteralElementLike = PropertyAssignment | ShorthandPropertyAssignment | SpreadAssignment | MethodDeclaration | AccessorDeclaration; + export class PropertyAssignment extends Node implements ObjectLiteralElement, Declaration, JSDocContainer { + _objectLiteralBrand: any; + _declarationBrand: any; + _jsdocContainerBrand: any; + readonly ast: AstPropertyAssignment; + get parent(): ObjectLiteralExpression; + get modifiers(): NodeArray | undefined; + get name(): PropertyName; + get questionToken(): QuestionToken | undefined; + get exclamationToken(): ExclamationToken | undefined; + get initializer(): Expression; } - interface ShorthandPropertyAssignment extends ObjectLiteralElement, JSDocContainer { - readonly kind: SyntaxKind.ShorthandPropertyAssignment; - readonly parent: ObjectLiteralExpression; - readonly name: Identifier; - readonly equalsToken?: EqualsToken | undefined; - readonly objectAssignmentInitializer?: Expression | undefined; + export class ShorthandPropertyAssignment extends Node implements ObjectLiteralElement, Declaration, JSDocContainer { + _objectLiteralBrand: any; + _declarationBrand: any; + _jsdocContainerBrand: any; + readonly ast: AstShorthandPropertyAssignment; + get parent(): ObjectLiteralExpression; + get modifiers(): NodeArray | undefined; + get name(): Identifier; + get questionToken(): QuestionToken | undefined; + get exclamationToken(): ExclamationToken | undefined; + get equalsToken(): EqualsToken | undefined; + get objectAssignmentInitializer(): Expression | undefined; } - interface SpreadAssignment extends ObjectLiteralElement, JSDocContainer { - readonly kind: SyntaxKind.SpreadAssignment; - readonly parent: ObjectLiteralExpression; - readonly expression: Expression; + export class SpreadAssignment extends Node implements ObjectLiteralElement, JSDocContainer { + _objectLiteralBrand: any; + _declarationBrand: any; + _jsdocContainerBrand: any; + readonly ast: AstSpreadAssignment; + get parent(): ObjectLiteralExpression; + get expression(): Expression; } - type VariableLikeDeclaration = VariableDeclaration | ParameterDeclaration | BindingElement | PropertyDeclaration | PropertyAssignment | PropertySignature | JsxAttribute | ShorthandPropertyAssignment | EnumMember | JSDocPropertyTag | JSDocParameterTag; - interface ObjectBindingPattern extends Node { - readonly kind: SyntaxKind.ObjectBindingPattern; - readonly parent: VariableDeclaration | ParameterDeclaration | BindingElement; - readonly elements: NodeArray; + export type VariableLikeDeclaration = VariableDeclaration | ParameterDeclaration | BindingElement | PropertyDeclaration | PropertyAssignment | PropertySignature | JsxAttribute | ShorthandPropertyAssignment | EnumMember | JSDocPropertyTag | JSDocParameterTag; + export class ObjectBindingPattern extends Node { + readonly ast: AstObjectBindingPattern; + get parent(): VariableDeclaration | ParameterDeclaration | BindingElement; + get elements(): NodeArray; } - interface ArrayBindingPattern extends Node { - readonly kind: SyntaxKind.ArrayBindingPattern; - readonly parent: VariableDeclaration | ParameterDeclaration | BindingElement; - readonly elements: NodeArray; + export class ArrayBindingPattern extends Node { + readonly ast: AstArrayBindingPattern; + get parent(): VariableDeclaration | ParameterDeclaration | BindingElement; + get elements(): NodeArray; } - type BindingPattern = ObjectBindingPattern | ArrayBindingPattern; - type ArrayBindingElement = BindingElement | OmittedExpression; + export type BindingPattern = ObjectBindingPattern | ArrayBindingPattern; + export type ArrayBindingElement = BindingElement | OmittedExpression; /** * Several node kinds share function-like features such as a signature, * a name, and a body. These nodes should extend FunctionLikeDeclarationBase. @@ -4577,392 +4741,658 @@ declare namespace ts { * - MethodDeclaration * - AccessorDeclaration */ - interface FunctionLikeDeclarationBase extends SignatureDeclarationBase { + export interface FunctionLikeDeclarationBase extends SignatureDeclarationBase { _functionLikeDeclarationBrand: any; readonly asteriskToken?: AsteriskToken | undefined; readonly questionToken?: QuestionToken | undefined; readonly exclamationToken?: ExclamationToken | undefined; readonly body?: Block | Expression | undefined; } - type FunctionLikeDeclaration = FunctionDeclaration | MethodDeclaration | GetAccessorDeclaration | SetAccessorDeclaration | ConstructorDeclaration | FunctionExpression | ArrowFunction; + export type FunctionLikeDeclaration = FunctionDeclaration | MethodDeclaration | GetAccessorDeclaration | SetAccessorDeclaration | ConstructorDeclaration | FunctionExpression | ArrowFunction; /** @deprecated Use SignatureDeclaration */ - type FunctionLike = SignatureDeclaration; - interface FunctionDeclaration extends FunctionLikeDeclarationBase, DeclarationStatement, LocalsContainer { - readonly kind: SyntaxKind.FunctionDeclaration; - readonly modifiers?: NodeArray | undefined; - readonly name?: Identifier | undefined; - readonly body?: FunctionBody | undefined; + export type FunctionLike = SignatureDeclaration; + export class FunctionDeclaration extends Node implements FunctionLikeDeclarationBase, DeclarationStatement, LocalsContainer { + _functionLikeDeclarationBrand: any; + _signatureDeclarationBrand: any; + _declarationBrand: any; + _jsdocContainerBrand: any; + _statementBrand: any; + _localsContainerBrand: any; + readonly ast: AstFunctionDeclaration; + get modifiers(): NodeArray | undefined; + get asteriskToken(): AsteriskToken | undefined; + get name(): Identifier | undefined; + get typeParameters(): NodeArray | undefined; + get parameters(): NodeArray; + get type(): TypeNode | undefined; + get body(): Block | undefined; } - interface MethodSignature extends SignatureDeclarationBase, TypeElement, LocalsContainer { - readonly kind: SyntaxKind.MethodSignature; - readonly parent: TypeLiteralNode | InterfaceDeclaration; - readonly modifiers?: NodeArray | undefined; - readonly name: PropertyName; + export class MethodSignature extends Node implements SignatureDeclarationBase, TypeElement, LocalsContainer { + _signatureDeclarationBrand: any; + _declarationBrand: any; + _jsdocContainerBrand: any; + _typeElementBrand: any; + _localsContainerBrand: any; + readonly ast: AstMethodSignature; + get parent(): TypeLiteralNode | InterfaceDeclaration; + get modifiers(): NodeArray | undefined; + get name(): PropertyName; + get questionToken(): QuestionToken | undefined; + get typeParameters(): NodeArray | undefined; + get parameters(): NodeArray; + get type(): TypeNode | undefined; } - interface MethodDeclaration extends FunctionLikeDeclarationBase, ClassElement, ObjectLiteralElement, JSDocContainer, LocalsContainer, FlowContainer { - readonly kind: SyntaxKind.MethodDeclaration; - readonly parent: ClassLikeDeclaration | ObjectLiteralExpression; - readonly modifiers?: NodeArray | undefined; - readonly name: PropertyName; - readonly body?: FunctionBody | undefined; + export class MethodDeclaration extends Node implements FunctionLikeDeclarationBase, ClassElement, ObjectLiteralElement, LocalsContainer, FlowContainer { + _functionLikeDeclarationBrand: any; + _signatureDeclarationBrand: any; + _declarationBrand: any; + _jsdocContainerBrand: any; + _classElementBrand: any; + _objectLiteralBrand: any; + _localsContainerBrand: any; + _flowContainerBrand: any; + readonly ast: AstMethodDeclaration; + get parent(): ClassLikeDeclaration | ObjectLiteralExpression; + get modifiers(): NodeArray | undefined; + get asteriskToken(): AsteriskToken | undefined; + get name(): PropertyName; + get questionToken(): QuestionToken | undefined; + get typeParameters(): NodeArray | undefined; + get parameters(): NodeArray; + get type(): TypeNode | undefined; + get body(): Block | undefined; } - interface ConstructorDeclaration extends FunctionLikeDeclarationBase, ClassElement, JSDocContainer, LocalsContainer { - readonly kind: SyntaxKind.Constructor; - readonly parent: ClassLikeDeclaration; - readonly modifiers?: NodeArray | undefined; - readonly body?: FunctionBody | undefined; + export class ConstructorDeclaration extends Node implements FunctionLikeDeclarationBase, ClassElement, JSDocContainer, LocalsContainer { + _functionLikeDeclarationBrand: any; + _signatureDeclarationBrand: any; + _declarationBrand: any; + _jsdocContainerBrand: any; + _classElementBrand: any; + _localsContainerBrand: any; + readonly ast: AstConstructorDeclaration; + get parent(): ClassLikeDeclaration; + get modifiers(): NodeArray | undefined; + get body(): Block | undefined; + get parameters(): NodeArray; } /** For when we encounter a semicolon in a class declaration. ES6 allows these as class elements. */ - interface SemicolonClassElement extends ClassElement, JSDocContainer { - readonly kind: SyntaxKind.SemicolonClassElement; - readonly parent: ClassLikeDeclaration; + export class SemicolonClassElement extends Node implements ClassElement, JSDocContainer { + _classElementBrand: any; + _declarationBrand: any; + _jsdocContainerBrand: any; + symbol: never; + localSymbol: never; + readonly ast: AstSemicolonClassElement; + get parent(): ClassLikeDeclaration; } - interface GetAccessorDeclaration extends FunctionLikeDeclarationBase, ClassElement, TypeElement, ObjectLiteralElement, JSDocContainer, LocalsContainer, FlowContainer { - readonly kind: SyntaxKind.GetAccessor; - readonly parent: ClassLikeDeclaration | ObjectLiteralExpression | TypeLiteralNode | InterfaceDeclaration; - readonly modifiers?: NodeArray | undefined; - readonly name: PropertyName; - readonly body?: FunctionBody | undefined; + export class GetAccessorDeclaration extends Node implements FunctionLikeDeclarationBase, ClassElement, TypeElement, ObjectLiteralElement, JSDocContainer, LocalsContainer, FlowContainer { + _functionLikeDeclarationBrand: any; + _signatureDeclarationBrand: any; + _declarationBrand: any; + _jsdocContainerBrand: any; + _classElementBrand: any; + _typeElementBrand: any; + _objectLiteralBrand: any; + _localsContainerBrand: any; + _flowContainerBrand: any; + readonly ast: AstGetAccessorDeclaration; + get parent(): ClassLikeDeclaration | ObjectLiteralExpression | InterfaceDeclaration | TypeLiteralNode; + get modifiers(): NodeArray | undefined; + get name(): PropertyName; + get body(): Block | undefined; + get parameters(): NodeArray; + get type(): TypeNode | undefined; } - interface SetAccessorDeclaration extends FunctionLikeDeclarationBase, ClassElement, TypeElement, ObjectLiteralElement, JSDocContainer, LocalsContainer, FlowContainer { - readonly kind: SyntaxKind.SetAccessor; - readonly parent: ClassLikeDeclaration | ObjectLiteralExpression | TypeLiteralNode | InterfaceDeclaration; - readonly modifiers?: NodeArray | undefined; - readonly name: PropertyName; - readonly body?: FunctionBody | undefined; + export class SetAccessorDeclaration extends Node implements FunctionLikeDeclarationBase, ClassElement, TypeElement, ObjectLiteralElement, JSDocContainer, LocalsContainer, FlowContainer { + _functionLikeDeclarationBrand: any; + _signatureDeclarationBrand: any; + _declarationBrand: any; + _jsdocContainerBrand: any; + _classElementBrand: any; + _typeElementBrand: any; + _objectLiteralBrand: any; + _localsContainerBrand: any; + _flowContainerBrand: any; + readonly ast: AstSetAccessorDeclaration; + get parent(): ClassLikeDeclaration | ObjectLiteralExpression | InterfaceDeclaration | TypeLiteralNode; + get modifiers(): NodeArray | undefined; + get name(): PropertyName; + get body(): Block | undefined; + get parameters(): NodeArray; } - type AccessorDeclaration = GetAccessorDeclaration | SetAccessorDeclaration; - interface IndexSignatureDeclaration extends SignatureDeclarationBase, ClassElement, TypeElement, LocalsContainer { - readonly kind: SyntaxKind.IndexSignature; - readonly parent: ObjectTypeDeclaration; - readonly modifiers?: NodeArray | undefined; - readonly type: TypeNode; + export type AccessorDeclaration = GetAccessorDeclaration | SetAccessorDeclaration; + export class IndexSignatureDeclaration extends Node implements SignatureDeclarationBase, ClassElement, TypeElement, LocalsContainer { + _declarationBrand: any; + _jsdocContainerBrand: any; + _classElementBrand: any; + _typeElementBrand: any; + _localsContainerBrand: any; + readonly ast: AstIndexSignatureDeclaration; + get parent(): ObjectTypeDeclaration; + get modifiers(): NodeArray | undefined; + get parameters(): NodeArray; + get type(): TypeNode; } - interface ClassStaticBlockDeclaration extends ClassElement, JSDocContainer, LocalsContainer { - readonly kind: SyntaxKind.ClassStaticBlockDeclaration; - readonly parent: ClassDeclaration | ClassExpression; - readonly body: Block; + export class ClassStaticBlockDeclaration extends Node implements ClassElement, JSDocContainer, LocalsContainer { + _signatureDeclarationBrand: any; + _classElementBrand: any; + _declarationBrand: any; + _jsdocContainerBrand: any; + _localsContainerBrand: any; + readonly ast: AstClassStaticBlockDeclaration; + get parent(): ClassLikeDeclaration; + get body(): Block; } - interface TypeNode extends Node { + export interface TypeNode extends Node { _typeNodeBrand: any; + readonly ast: AstTypeNode; } - interface KeywordTypeNode extends KeywordToken, TypeNode { + export interface KeywordTypeNode extends KeywordToken, TypeNode { + readonly ast: AstKeywordTypeNode; readonly kind: TKind; } /** @deprecated */ - interface ImportTypeAssertionContainer extends Node { - readonly kind: SyntaxKind.ImportTypeAssertionContainer; - readonly parent: ImportTypeNode; - /** @deprecated */ readonly assertClause: AssertClause; - readonly multiLine?: boolean | undefined; + export class ImportTypeAssertionContainer extends Node { + readonly ast: AstImportTypeAssertionContainer; + get parent(): ImportTypeNode; + /** @deprecated */ + get assertClause(): ImportAttributes; } - interface ImportTypeNode extends NodeWithTypeArguments { - readonly kind: SyntaxKind.ImportType; - readonly isTypeOf: boolean; - readonly argument: TypeNode; - /** @deprecated */ readonly assertions?: ImportTypeAssertionContainer | undefined; - readonly attributes?: ImportAttributes | undefined; - readonly qualifier?: EntityName | undefined; + export class ImportTypeNode extends Node implements TypeNode, NodeWithTypeArguments { + _typeNodeBrand: any; + readonly ast: AstImportTypeNode; + get isTypeOf(): boolean; + get argument(): TypeNode; + get attributes(): ImportAttributes | undefined; + /** @deprecated */ + get assertions(): ImportTypeAssertionContainer | undefined; + get qualifier(): EntityName | undefined; + get typeArguments(): NodeArray | undefined; } - interface ThisTypeNode extends TypeNode { - readonly kind: SyntaxKind.ThisType; + export class ThisTypeNode extends Node implements TypeNode { + _typeNodeBrand: any; + readonly ast: AstThisTypeNode; } - type FunctionOrConstructorTypeNode = FunctionTypeNode | ConstructorTypeNode; - interface FunctionOrConstructorTypeNodeBase extends TypeNode, SignatureDeclarationBase { + export type FunctionOrConstructorTypeNode = FunctionTypeNode | ConstructorTypeNode; + export interface FunctionOrConstructorTypeNodeBase extends TypeNode, SignatureDeclarationBase { + readonly ast: AstNode; readonly kind: SyntaxKind.FunctionType | SyntaxKind.ConstructorType; readonly type: TypeNode; } - interface FunctionTypeNode extends FunctionOrConstructorTypeNodeBase, LocalsContainer { - readonly kind: SyntaxKind.FunctionType; + export class FunctionTypeNode extends Node implements FunctionOrConstructorTypeNodeBase, LocalsContainer { + _signatureDeclarationBrand: any; + _typeNodeBrand: any; + _declarationBrand: any; + _jsdocContainerBrand: any; + _localsContainerBrand: any; + readonly ast: AstFunctionTypeNode; + get typeParameters(): NodeArray | undefined; + get parameters(): NodeArray; + get type(): TypeNode; } - interface ConstructorTypeNode extends FunctionOrConstructorTypeNodeBase, LocalsContainer { - readonly kind: SyntaxKind.ConstructorType; - readonly modifiers?: NodeArray | undefined; + export class ConstructorTypeNode extends Node implements FunctionOrConstructorTypeNodeBase, LocalsContainer { + readonly ast: AstConstructorTypeNode; + _signatureDeclarationBrand: any; + _typeNodeBrand: any; + _declarationBrand: any; + _jsdocContainerBrand: any; + _localsContainerBrand: any; + get modifiers(): NodeArray | undefined; + get typeParameters(): NodeArray | undefined; + get parameters(): NodeArray; + get type(): TypeNode; } - interface NodeWithTypeArguments extends TypeNode { + export interface NodeWithTypeArguments extends TypeNode { readonly typeArguments?: NodeArray | undefined; } - type TypeReferenceType = TypeReferenceNode | ExpressionWithTypeArguments; - interface TypeReferenceNode extends NodeWithTypeArguments { - readonly kind: SyntaxKind.TypeReference; - readonly typeName: EntityName; + export type TypeReferenceType = TypeReferenceNode | ExpressionWithTypeArguments; + export class TypeReferenceNode extends Node implements NodeWithTypeArguments { + _typeNodeBrand: any; + readonly ast: AstTypeReferenceNode; + get typeName(): Identifier | QualifiedName; + get typeArguments(): NodeArray | undefined; } - interface TypePredicateNode extends TypeNode { - readonly kind: SyntaxKind.TypePredicate; - readonly parent: SignatureDeclaration | JSDocTypeExpression; - readonly assertsModifier?: AssertsKeyword | undefined; - readonly parameterName: Identifier | ThisTypeNode; - readonly type?: TypeNode | undefined; + export class TypePredicateNode extends Node implements TypeNode { + _typeNodeBrand: any; + readonly ast: AstTypePredicateNode; + get parent(): SignatureDeclaration | JSDocTypeExpression; + get assertsModifier(): AssertsKeyword | undefined; + get parameterName(): Identifier | ThisTypeNode; + get type(): TypeNode | undefined; } - interface TypeQueryNode extends NodeWithTypeArguments { - readonly kind: SyntaxKind.TypeQuery; - readonly exprName: EntityName; + export class TypeQueryNode extends Node implements NodeWithTypeArguments { + _typeNodeBrand: any; + readonly ast: AstTypeQueryNode; + get exprName(): Identifier | QualifiedName; + get typeArguments(): NodeArray | undefined; } - interface TypeLiteralNode extends TypeNode, Declaration { - readonly kind: SyntaxKind.TypeLiteral; - readonly members: NodeArray; + export class TypeLiteralNode extends Node implements TypeNode, Declaration { + _typeNodeBrand: any; + _declarationBrand: any; + readonly ast: AstTypeLiteralNode; + get members(): NodeArray; } - interface ArrayTypeNode extends TypeNode { - readonly kind: SyntaxKind.ArrayType; - readonly elementType: TypeNode; + export class ArrayTypeNode extends Node implements TypeNode { + _typeNodeBrand: any; + readonly ast: AstArrayTypeNode; + get elementType(): TypeNode; } - interface TupleTypeNode extends TypeNode { - readonly kind: SyntaxKind.TupleType; - readonly elements: NodeArray; + export class TupleTypeNode extends Node implements TypeNode { + _typeNodeBrand: any; + readonly ast: AstTupleTypeNode; + get elements(): NodeArray; } - interface NamedTupleMember extends TypeNode, Declaration, JSDocContainer { - readonly kind: SyntaxKind.NamedTupleMember; - readonly dotDotDotToken?: DotDotDotToken | undefined; - readonly name: Identifier; - readonly questionToken?: QuestionToken | undefined; - readonly type: TypeNode; + export class NamedTupleMember extends Node implements TypeNode, Declaration, JSDocContainer { + _typeNodeBrand: any; + _declarationBrand: any; + _jsdocContainerBrand: any; + readonly ast: AstNamedTupleMember; + get dotDotDotToken(): DotDotDotToken | undefined; + get name(): Identifier; + get questionToken(): QuestionToken | undefined; + get type(): TypeNode; } - interface OptionalTypeNode extends TypeNode { - readonly kind: SyntaxKind.OptionalType; - readonly type: TypeNode; + export class OptionalTypeNode extends Node implements TypeNode { + _typeNodeBrand: any; + readonly ast: AstOptionalTypeNode; + get type(): TypeNode; } - interface RestTypeNode extends TypeNode { - readonly kind: SyntaxKind.RestType; - readonly type: TypeNode; + export class RestTypeNode extends Node implements TypeNode { + _typeNodeBrand: any; + readonly ast: AstRestTypeNode; + get type(): TypeNode; } - type UnionOrIntersectionTypeNode = UnionTypeNode | IntersectionTypeNode; - interface UnionTypeNode extends TypeNode { - readonly kind: SyntaxKind.UnionType; - readonly types: NodeArray; + export type UnionOrIntersectionTypeNode = UnionTypeNode | IntersectionTypeNode; + export class UnionTypeNode extends Node implements TypeNode { + _typeNodeBrand: any; + readonly ast: AstUnionTypeNode; + get types(): NodeArray; } - interface IntersectionTypeNode extends TypeNode { - readonly kind: SyntaxKind.IntersectionType; - readonly types: NodeArray; + export class IntersectionTypeNode extends Node implements TypeNode { + _typeNodeBrand: any; + readonly ast: AstIntersectionTypeNode; + get types(): NodeArray; } - interface ConditionalTypeNode extends TypeNode, LocalsContainer { - readonly kind: SyntaxKind.ConditionalType; - readonly checkType: TypeNode; - readonly extendsType: TypeNode; - readonly trueType: TypeNode; - readonly falseType: TypeNode; + export class ConditionalTypeNode extends Node implements TypeNode, LocalsContainer { + _typeNodeBrand: any; + _localsContainerBrand: any; + readonly ast: AstConditionalTypeNode; + get checkType(): TypeNode; + get extendsType(): TypeNode; + get trueType(): TypeNode; + get falseType(): TypeNode; } - interface InferTypeNode extends TypeNode { - readonly kind: SyntaxKind.InferType; - readonly typeParameter: TypeParameterDeclaration; + export class InferTypeNode extends Node implements TypeNode { + _typeNodeBrand: any; + readonly ast: AstInferTypeNode; + get typeParameter(): TypeParameterDeclaration; } - interface ParenthesizedTypeNode extends TypeNode { - readonly kind: SyntaxKind.ParenthesizedType; - readonly type: TypeNode; + export class ParenthesizedTypeNode extends Node implements TypeNode { + _typeNodeBrand: any; + readonly ast: AstParenthesizedTypeNode; + get type(): TypeNode; } - interface TypeOperatorNode extends TypeNode { - readonly kind: SyntaxKind.TypeOperator; - readonly operator: SyntaxKind.KeyOfKeyword | SyntaxKind.UniqueKeyword | SyntaxKind.ReadonlyKeyword; - readonly type: TypeNode; + export class TypeOperatorNode extends Node implements TypeNode { + _typeNodeBrand: any; + readonly ast: AstTypeOperatorNode; + get operator(): SyntaxKind.KeyOfKeyword | SyntaxKind.ReadonlyKeyword | SyntaxKind.UniqueKeyword; + get type(): TypeNode; } - interface IndexedAccessTypeNode extends TypeNode { - readonly kind: SyntaxKind.IndexedAccessType; - readonly objectType: TypeNode; - readonly indexType: TypeNode; + export class IndexedAccessTypeNode extends Node implements TypeNode { + _typeNodeBrand: any; + readonly ast: AstIndexedAccessTypeNode; + get objectType(): TypeNode; + get indexType(): TypeNode; } - interface MappedTypeNode extends TypeNode, Declaration, LocalsContainer { - readonly kind: SyntaxKind.MappedType; - readonly readonlyToken?: ReadonlyKeyword | PlusToken | MinusToken | undefined; - readonly typeParameter: TypeParameterDeclaration; - readonly nameType?: TypeNode | undefined; - readonly questionToken?: QuestionToken | PlusToken | MinusToken | undefined; - readonly type?: TypeNode | undefined; - /** Used only to produce grammar errors */ - readonly members?: NodeArray | undefined; + export class MappedTypeNode extends Node implements TypeNode, Declaration, LocalsContainer { + _typeNodeBrand: any; + _declarationBrand: any; + _localsContainerBrand: any; + readonly ast: AstMappedTypeNode; + get readonlyToken(): PlusToken | MinusToken | ReadonlyKeyword | undefined; + get typeParameter(): TypeParameterDeclaration; + get nameType(): TypeNode | undefined; + get questionToken(): QuestionToken | PlusToken | MinusToken | undefined; + get type(): TypeNode | undefined; + get members(): NodeArray | undefined; } - interface LiteralTypeNode extends TypeNode { - readonly kind: SyntaxKind.LiteralType; - readonly literal: NullLiteral | BooleanLiteral | LiteralExpression | PrefixUnaryExpression; + export class LiteralTypeNode extends Node implements TypeNode { + _typeNodeBrand: any; + readonly ast: AstLiteralTypeNode; + get literal(): NullLiteral | TrueLiteral | FalseLiteral | PrefixUnaryExpression | LiteralExpression; } - interface StringLiteral extends LiteralExpression, Declaration { - readonly kind: SyntaxKind.StringLiteral; - } - type StringLiteralLike = StringLiteral | NoSubstitutionTemplateLiteral; - type PropertyNameLiteral = Identifier | StringLiteralLike | NumericLiteral | JsxNamespacedName | BigIntLiteral; - interface TemplateLiteralTypeNode extends TypeNode { - readonly kind: SyntaxKind.TemplateLiteralType; - readonly head: TemplateHead; - readonly templateSpans: NodeArray; - } - interface TemplateLiteralTypeSpan extends TypeNode { - readonly kind: SyntaxKind.TemplateLiteralTypeSpan; - readonly parent: TemplateLiteralTypeNode; - readonly type: TypeNode; - readonly literal: TemplateMiddle | TemplateTail; - } - interface Expression extends Node { - _expressionBrand: any; - } - interface OmittedExpression extends Expression { - readonly kind: SyntaxKind.OmittedExpression; - } - interface PartiallyEmittedExpression extends LeftHandSideExpression { - readonly kind: SyntaxKind.PartiallyEmittedExpression; - readonly expression: Expression; - } - interface UnaryExpression extends Expression { - _unaryExpressionBrand: any; - } - /** Deprecated, please use UpdateExpression */ - type IncrementExpression = UpdateExpression; - interface UpdateExpression extends UnaryExpression { - _updateExpressionBrand: any; - } - type PrefixUnaryOperator = SyntaxKind.PlusPlusToken | SyntaxKind.MinusMinusToken | SyntaxKind.PlusToken | SyntaxKind.MinusToken | SyntaxKind.TildeToken | SyntaxKind.ExclamationToken; - interface PrefixUnaryExpression extends UpdateExpression { - readonly kind: SyntaxKind.PrefixUnaryExpression; - readonly operator: PrefixUnaryOperator; - readonly operand: UnaryExpression; - } - type PostfixUnaryOperator = SyntaxKind.PlusPlusToken | SyntaxKind.MinusMinusToken; - interface PostfixUnaryExpression extends UpdateExpression { - readonly kind: SyntaxKind.PostfixUnaryExpression; - readonly operand: LeftHandSideExpression; - readonly operator: PostfixUnaryOperator; - } - interface LeftHandSideExpression extends UpdateExpression { - _leftHandSideExpressionBrand: any; - } - interface MemberExpression extends LeftHandSideExpression { - _memberExpressionBrand: any; - } - interface PrimaryExpression extends MemberExpression { + export class StringLiteral extends Token implements LiteralExpression, StringLiteralLikeNode, Declaration { + _literalExpressionBrand: any; _primaryExpressionBrand: any; + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + _declarationBrand: any; + readonly ast: AstStringLiteral; + get text(): string; + get isUnterminated(): boolean; + get hasExtendedUnicodeEscape(): boolean; } - interface NullLiteral extends PrimaryExpression { - readonly kind: SyntaxKind.NullKeyword; + export type StringLiteralLike = StringLiteral | NoSubstitutionTemplateLiteral; + export type PropertyNameLiteral = Identifier | StringLiteralLike | NumericLiteral | JsxNamespacedName | BigIntLiteral; + export class TemplateLiteralTypeNode extends Node implements TypeNode { + _typeNodeBrand: any; + readonly ast: AstTemplateLiteralTypeNode; + get head(): TemplateHead; + get templateSpans(): NodeArray; } - interface TrueLiteral extends PrimaryExpression { - readonly kind: SyntaxKind.TrueKeyword; + export class TemplateLiteralTypeSpan extends Node { + _typeNodeBrand: any; + readonly ast: AstTemplateLiteralTypeSpan; + get parent(): TemplateLiteralTypeNode; + get type(): TypeNode; + get literal(): TemplateMiddle | TemplateTail; } - interface FalseLiteral extends PrimaryExpression { - readonly kind: SyntaxKind.FalseKeyword; + export interface Expression extends Node { + _expressionBrand: any; + readonly ast: AstExpression; } - type BooleanLiteral = TrueLiteral | FalseLiteral; - interface ThisExpression extends PrimaryExpression, FlowContainer { - readonly kind: SyntaxKind.ThisKeyword; + export class OmittedExpression extends Node implements Expression { + _expressionBrand: any; + readonly ast: AstOmittedExpression; } - interface SuperExpression extends PrimaryExpression, FlowContainer { - readonly kind: SyntaxKind.SuperKeyword; + export class PartiallyEmittedExpression extends Node implements LeftHandSideExpression { + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + readonly ast: AstPartiallyEmittedExpression; + get expression(): Expression; } - interface ImportExpression extends PrimaryExpression { - readonly kind: SyntaxKind.ImportKeyword; + export interface UnaryExpression extends Expression { + _unaryExpressionBrand: any; + readonly ast: AstUnaryExpression; } - interface DeleteExpression extends UnaryExpression { - readonly kind: SyntaxKind.DeleteExpression; - readonly expression: UnaryExpression; + /** @deprecated use UpdateExpression instead */ + export type IncrementExpression = UpdateExpression; + export interface UpdateExpression extends UnaryExpression { + _updateExpressionBrand: any; + readonly ast: AstUpdateExpression; } - interface TypeOfExpression extends UnaryExpression { - readonly kind: SyntaxKind.TypeOfExpression; - readonly expression: UnaryExpression; + export type PrefixUnaryOperator = SyntaxKind.PlusPlusToken | SyntaxKind.MinusMinusToken | SyntaxKind.PlusToken | SyntaxKind.MinusToken | SyntaxKind.TildeToken | SyntaxKind.ExclamationToken; + export class PrefixUnaryExpression extends Node implements UpdateExpression { + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + readonly ast: AstPrefixUnaryExpression; + get operator(): PrefixUnaryOperator; + get operand(): UnaryExpression; } - interface VoidExpression extends UnaryExpression { - readonly kind: SyntaxKind.VoidExpression; - readonly expression: UnaryExpression; + export type PostfixUnaryOperator = SyntaxKind.PlusPlusToken | SyntaxKind.MinusMinusToken; + export class PostfixUnaryExpression extends Node implements UpdateExpression { + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + readonly ast: AstPostfixUnaryExpression; + get operand(): LeftHandSideExpression; + get operator(): PostfixUnaryOperator; } - interface AwaitExpression extends UnaryExpression { - readonly kind: SyntaxKind.AwaitExpression; - readonly expression: UnaryExpression; + export interface LeftHandSideExpression extends UpdateExpression { + _leftHandSideExpressionBrand: any; + readonly ast: AstLeftHandSideExpression; } - interface YieldExpression extends Expression { - readonly kind: SyntaxKind.YieldExpression; - readonly asteriskToken?: AsteriskToken | undefined; - readonly expression?: Expression | undefined; + export interface MemberExpression extends LeftHandSideExpression { + _memberExpressionBrand: any; + readonly ast: AstMemberExpression; } - interface SyntheticExpression extends Expression { - readonly kind: SyntaxKind.SyntheticExpression; - readonly isSpread: boolean; - readonly type: Type; - readonly tupleNameSource?: ParameterDeclaration | NamedTupleMember | undefined; + export interface PrimaryExpression extends MemberExpression { + _primaryExpressionBrand: any; + readonly ast: AstPrimaryExpression; } - type ExponentiationOperator = SyntaxKind.AsteriskAsteriskToken; - type MultiplicativeOperator = SyntaxKind.AsteriskToken | SyntaxKind.SlashToken | SyntaxKind.PercentToken; - type MultiplicativeOperatorOrHigher = ExponentiationOperator | MultiplicativeOperator; - type AdditiveOperator = SyntaxKind.PlusToken | SyntaxKind.MinusToken; - type AdditiveOperatorOrHigher = MultiplicativeOperatorOrHigher | AdditiveOperator; - type ShiftOperator = SyntaxKind.LessThanLessThanToken | SyntaxKind.GreaterThanGreaterThanToken | SyntaxKind.GreaterThanGreaterThanGreaterThanToken; - type ShiftOperatorOrHigher = AdditiveOperatorOrHigher | ShiftOperator; - type RelationalOperator = SyntaxKind.LessThanToken | SyntaxKind.LessThanEqualsToken | SyntaxKind.GreaterThanToken | SyntaxKind.GreaterThanEqualsToken | SyntaxKind.InstanceOfKeyword | SyntaxKind.InKeyword; - type RelationalOperatorOrHigher = ShiftOperatorOrHigher | RelationalOperator; - type EqualityOperator = SyntaxKind.EqualsEqualsToken | SyntaxKind.EqualsEqualsEqualsToken | SyntaxKind.ExclamationEqualsEqualsToken | SyntaxKind.ExclamationEqualsToken; - type EqualityOperatorOrHigher = RelationalOperatorOrHigher | EqualityOperator; - type BitwiseOperator = SyntaxKind.AmpersandToken | SyntaxKind.BarToken | SyntaxKind.CaretToken; - type BitwiseOperatorOrHigher = EqualityOperatorOrHigher | BitwiseOperator; - type LogicalOperator = SyntaxKind.AmpersandAmpersandToken | SyntaxKind.BarBarToken; - type LogicalOperatorOrHigher = BitwiseOperatorOrHigher | LogicalOperator; - type CompoundAssignmentOperator = SyntaxKind.PlusEqualsToken | SyntaxKind.MinusEqualsToken | SyntaxKind.AsteriskAsteriskEqualsToken | SyntaxKind.AsteriskEqualsToken | SyntaxKind.SlashEqualsToken | SyntaxKind.PercentEqualsToken | SyntaxKind.AmpersandEqualsToken | SyntaxKind.BarEqualsToken | SyntaxKind.CaretEqualsToken | SyntaxKind.LessThanLessThanEqualsToken | SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken | SyntaxKind.GreaterThanGreaterThanEqualsToken | SyntaxKind.BarBarEqualsToken | SyntaxKind.AmpersandAmpersandEqualsToken | SyntaxKind.QuestionQuestionEqualsToken; - type AssignmentOperator = SyntaxKind.EqualsToken | CompoundAssignmentOperator; - type AssignmentOperatorOrHigher = SyntaxKind.QuestionQuestionToken | LogicalOperatorOrHigher | AssignmentOperator; - type BinaryOperator = AssignmentOperatorOrHigher | SyntaxKind.CommaToken; - type LogicalOrCoalescingAssignmentOperator = SyntaxKind.AmpersandAmpersandEqualsToken | SyntaxKind.BarBarEqualsToken | SyntaxKind.QuestionQuestionEqualsToken; - type BinaryOperatorToken = Token; - interface BinaryExpression extends Expression, Declaration, JSDocContainer { - readonly kind: SyntaxKind.BinaryExpression; - readonly left: Expression; - readonly operatorToken: BinaryOperatorToken; - readonly right: Expression; + export class NullLiteral extends Token implements KeywordExpression { + _primaryExpressionBrand: any; + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + readonly ast: AstNullLiteral; } - type AssignmentOperatorToken = Token; - interface AssignmentExpression extends BinaryExpression { + export class TrueLiteral extends Token implements KeywordExpression { + _primaryExpressionBrand: any; + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + readonly ast: AstTrueLiteral; + } + export class FalseLiteral extends Token implements KeywordExpression { + _primaryExpressionBrand: any; + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + readonly ast: AstFalseLiteral; + } + export type BooleanLiteral = TrueLiteral | FalseLiteral; + export class ThisExpression extends Token implements KeywordExpression, FlowContainer { + _primaryExpressionBrand: any; + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + _flowContainerBrand: any; + readonly ast: AstThisExpression; + } + export class SuperExpression extends Token implements KeywordExpression, FlowContainer { + _primaryExpressionBrand: any; + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + _flowContainerBrand: any; + readonly ast: AstSuperExpression; + } + export class ImportExpression extends Token implements KeywordExpression { + _primaryExpressionBrand: any; + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + readonly ast: AstImportExpression; + } + export class DeleteExpression extends Node implements UnaryExpression { + _unaryExpressionBrand: any; + _expressionBrand: any; + readonly ast: AstDeleteExpression; + get expression(): UnaryExpression; + } + export class TypeOfExpression extends Node implements UnaryExpression { + _unaryExpressionBrand: any; + _expressionBrand: any; + readonly ast: AstTypeOfExpression; + get expression(): UnaryExpression; + } + export class VoidExpression extends Node implements UnaryExpression { + _unaryExpressionBrand: any; + _expressionBrand: any; + readonly ast: AstVoidExpression; + get expression(): UnaryExpression; + } + export class AwaitExpression extends Node implements UnaryExpression { + _unaryExpressionBrand: any; + _expressionBrand: any; + readonly ast: AstAwaitExpression; + get expression(): UnaryExpression; + } + export class YieldExpression extends Node implements Expression { + _expressionBrand: any; + readonly ast: AstYieldExpression; + get asteriskToken(): AsteriskToken | undefined; + get expression(): Expression | undefined; + } + export class SyntheticExpression extends Node implements Expression { + _expressionBrand: any; + readonly ast: AstSyntheticExpression; + get isSpread(): boolean; + get type(): Type; + get tupleNameSource(): ParameterDeclaration | NamedTupleMember | undefined; + } + export type ExponentiationOperator = SyntaxKind.AsteriskAsteriskToken; + export type MultiplicativeOperator = SyntaxKind.AsteriskToken | SyntaxKind.SlashToken | SyntaxKind.PercentToken; + export type MultiplicativeOperatorOrHigher = ExponentiationOperator | MultiplicativeOperator; + export type AdditiveOperator = SyntaxKind.PlusToken | SyntaxKind.MinusToken; + export type AdditiveOperatorOrHigher = MultiplicativeOperatorOrHigher | AdditiveOperator; + export type ShiftOperator = SyntaxKind.LessThanLessThanToken | SyntaxKind.GreaterThanGreaterThanToken | SyntaxKind.GreaterThanGreaterThanGreaterThanToken; + export type ShiftOperatorOrHigher = AdditiveOperatorOrHigher | ShiftOperator; + export type RelationalOperator = SyntaxKind.LessThanToken | SyntaxKind.LessThanEqualsToken | SyntaxKind.GreaterThanToken | SyntaxKind.GreaterThanEqualsToken | SyntaxKind.InstanceOfKeyword | SyntaxKind.InKeyword; + export type RelationalOperatorOrHigher = ShiftOperatorOrHigher | RelationalOperator; + export type EqualityOperator = SyntaxKind.EqualsEqualsToken | SyntaxKind.EqualsEqualsEqualsToken | SyntaxKind.ExclamationEqualsEqualsToken | SyntaxKind.ExclamationEqualsToken; + export type EqualityOperatorOrHigher = RelationalOperatorOrHigher | EqualityOperator; + export type BitwiseOperator = SyntaxKind.AmpersandToken | SyntaxKind.BarToken | SyntaxKind.CaretToken; + export type BitwiseOperatorOrHigher = EqualityOperatorOrHigher | BitwiseOperator; + export type LogicalOperator = SyntaxKind.AmpersandAmpersandToken | SyntaxKind.BarBarToken; + export type LogicalOperatorOrHigher = BitwiseOperatorOrHigher | LogicalOperator; + export type CompoundAssignmentOperator = SyntaxKind.PlusEqualsToken | SyntaxKind.MinusEqualsToken | SyntaxKind.AsteriskAsteriskEqualsToken | SyntaxKind.AsteriskEqualsToken | SyntaxKind.SlashEqualsToken | SyntaxKind.PercentEqualsToken | SyntaxKind.AmpersandEqualsToken | SyntaxKind.BarEqualsToken | SyntaxKind.CaretEqualsToken | SyntaxKind.LessThanLessThanEqualsToken | SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken | SyntaxKind.GreaterThanGreaterThanEqualsToken | SyntaxKind.BarBarEqualsToken | SyntaxKind.AmpersandAmpersandEqualsToken | SyntaxKind.QuestionQuestionEqualsToken; + export type AssignmentOperator = SyntaxKind.EqualsToken | CompoundAssignmentOperator; + export type AssignmentOperatorOrHigher = SyntaxKind.QuestionQuestionToken | LogicalOperatorOrHigher | AssignmentOperator; + export type BinaryOperator = AssignmentOperatorOrHigher | SyntaxKind.CommaToken; + export type LogicalOrCoalescingAssignmentOperator = SyntaxKind.AmpersandAmpersandEqualsToken | SyntaxKind.BarBarEqualsToken | SyntaxKind.QuestionQuestionEqualsToken; + export type BinaryOperatorToken = Token; + export class BinaryExpression extends Node implements Expression, Declaration, JSDocContainer { + _expressionBrand: any; + _declarationBrand: any; + _jsdocContainerBrand: any; + readonly ast: AstBinaryExpression; + get left(): Expression; + get operatorToken(): BinaryOperatorToken; + get right(): Expression; + } + export type AssignmentOperatorToken = Token; + export interface AssignmentExpression extends BinaryExpression { readonly left: LeftHandSideExpression; readonly operatorToken: TOperator; } - interface ObjectDestructuringAssignment extends AssignmentExpression { + export interface ObjectDestructuringAssignment extends AssignmentExpression { readonly left: ObjectLiteralExpression; } - interface ArrayDestructuringAssignment extends AssignmentExpression { + export interface ArrayDestructuringAssignment extends AssignmentExpression { readonly left: ArrayLiteralExpression; } - type DestructuringAssignment = ObjectDestructuringAssignment | ArrayDestructuringAssignment; - type BindingOrAssignmentElement = VariableDeclaration | ParameterDeclaration | ObjectBindingOrAssignmentElement | ArrayBindingOrAssignmentElement; - type ObjectBindingOrAssignmentElement = BindingElement | PropertyAssignment | ShorthandPropertyAssignment | SpreadAssignment; - type ArrayBindingOrAssignmentElement = BindingElement | OmittedExpression | SpreadElement | ArrayLiteralExpression | ObjectLiteralExpression | AssignmentExpression | Identifier | PropertyAccessExpression | ElementAccessExpression; - type BindingOrAssignmentElementRestIndicator = DotDotDotToken | SpreadElement | SpreadAssignment; - type BindingOrAssignmentElementTarget = BindingOrAssignmentPattern | Identifier | PropertyAccessExpression | ElementAccessExpression | OmittedExpression; - type ObjectBindingOrAssignmentPattern = ObjectBindingPattern | ObjectLiteralExpression; - type ArrayBindingOrAssignmentPattern = ArrayBindingPattern | ArrayLiteralExpression; - type AssignmentPattern = ObjectLiteralExpression | ArrayLiteralExpression; - type BindingOrAssignmentPattern = ObjectBindingOrAssignmentPattern | ArrayBindingOrAssignmentPattern; - interface ConditionalExpression extends Expression { - readonly kind: SyntaxKind.ConditionalExpression; - readonly condition: Expression; - readonly questionToken: QuestionToken; - readonly whenTrue: Expression; - readonly colonToken: ColonToken; - readonly whenFalse: Expression; + export type DestructuringAssignment = ObjectDestructuringAssignment | ArrayDestructuringAssignment; + export type BindingOrAssignmentElement = VariableDeclaration | ParameterDeclaration | ObjectBindingOrAssignmentElement | ArrayBindingOrAssignmentElement; + export type ObjectBindingOrAssignmentElement = BindingElement | PropertyAssignment | ShorthandPropertyAssignment | SpreadAssignment; + export type ArrayBindingOrAssignmentElement = BindingElement | OmittedExpression | SpreadElement | ArrayLiteralExpression | ObjectLiteralExpression | AssignmentExpression | Identifier | PropertyAccessExpression | ElementAccessExpression; + export type BindingOrAssignmentElementRestIndicator = DotDotDotToken | SpreadElement | SpreadAssignment; + export type BindingOrAssignmentElementTarget = BindingOrAssignmentPattern | Identifier | PropertyAccessExpression | ElementAccessExpression | OmittedExpression; + export type ObjectBindingOrAssignmentPattern = ObjectBindingPattern | ObjectLiteralExpression; + export type ArrayBindingOrAssignmentPattern = ArrayBindingPattern | ArrayLiteralExpression; + export type AssignmentPattern = ObjectLiteralExpression | ArrayLiteralExpression; + export type BindingOrAssignmentPattern = ObjectBindingOrAssignmentPattern | ArrayBindingOrAssignmentPattern; + export interface InstanceofExpression extends BinaryExpression { + readonly operatorToken: Token; } - type FunctionBody = Block; - type ConciseBody = FunctionBody | Expression; - interface FunctionExpression extends PrimaryExpression, FunctionLikeDeclarationBase, JSDocContainer, LocalsContainer, FlowContainer { - readonly kind: SyntaxKind.FunctionExpression; - readonly modifiers?: NodeArray | undefined; - readonly name?: Identifier | undefined; - readonly body: FunctionBody; + export class ConditionalExpression extends Node implements Expression { + _expressionBrand: any; + readonly ast: AstConditionalExpression; + get condition(): Expression; + get questionToken(): QuestionToken; + get whenTrue(): Expression; + get colonToken(): ColonToken; + get whenFalse(): Expression; } - interface ArrowFunction extends Expression, FunctionLikeDeclarationBase, JSDocContainer, LocalsContainer, FlowContainer { - readonly kind: SyntaxKind.ArrowFunction; - readonly modifiers?: NodeArray | undefined; - readonly equalsGreaterThanToken: EqualsGreaterThanToken; - readonly body: ConciseBody; - readonly name: never; + export type FunctionBody = Block; + export type ConciseBody = FunctionBody | Expression; + export class FunctionExpression extends Node implements PrimaryExpression, FunctionLikeDeclarationBase, JSDocContainer, LocalsContainer, FlowContainer { + _primaryExpressionBrand: any; + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + _functionLikeDeclarationBrand: any; + _signatureDeclarationBrand: any; + _declarationBrand: any; + _jsdocContainerBrand: any; + _localsContainerBrand: any; + _flowContainerBrand: any; + readonly ast: AstFunctionExpression; + get modifiers(): NodeArray | undefined; + get asteriskToken(): AsteriskToken | undefined; + get name(): Identifier | undefined; + get typeParameters(): NodeArray | undefined; + get parameters(): NodeArray; + get type(): TypeNode | undefined; + get body(): Block; } - interface LiteralLikeNode extends Node { - text: string; - isUnterminated?: boolean | undefined; - hasExtendedUnicodeEscape?: boolean | undefined; + export class ArrowFunction extends Node implements Expression, FunctionLikeDeclarationBase, JSDocContainer, LocalsContainer, FlowContainer { + _expressionBrand: any; + _functionLikeDeclarationBrand: any; + _signatureDeclarationBrand: any; + _declarationBrand: any; + _jsdocContainerBrand: any; + _localsContainerBrand: any; + _flowContainerBrand: any; + readonly ast: AstArrowFunction; + get modifiers(): NodeArray | undefined; + get equalsGreaterThanToken(): EqualsGreaterThanToken; + get typeParameters(): NodeArray | undefined; + get parameters(): NodeArray; + get type(): TypeNode | undefined; + get body(): Block | Expression; } - interface TemplateLiteralLikeNode extends LiteralLikeNode { - rawText?: string | undefined; + export interface LiteralLikeNode extends Node { + readonly ast: AstLiteralLikeNode; + readonly data: AstLiteralLikeNodeData; + get text(): string; } - interface LiteralExpression extends LiteralLikeNode, PrimaryExpression { + export interface StringLiteralLikeNode extends LiteralLikeNode { + readonly ast: AstStringLiteralLikeNode; + readonly data: AstStringLiteralLikeNodeData; + get isUnterminated(): boolean | undefined; + get hasExtendedUnicodeEscape(): boolean | undefined; + } + export interface TemplateLiteralLikeNode extends StringLiteralLikeNode { + readonly ast: AstTemplateLiteralLikeNode; + readonly data: AstTemplateLiteralLikeNodeData; + get rawText(): string | undefined; + } + export interface LiteralExpression extends LiteralLikeNode, PrimaryExpression { _literalExpressionBrand: any; + readonly ast: AstLiteralExpression; + readonly data: AstLiteralExpressionData; } - interface RegularExpressionLiteral extends LiteralExpression { - readonly kind: SyntaxKind.RegularExpressionLiteral; + export class RegularExpressionLiteral extends Token implements StringLiteralLikeNode { + _literalExpressionBrand: any; + _primaryExpressionBrand: any; + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + readonly ast: AstRegularExpressionLiteral; + get text(): string; + get isUnterminated(): boolean | undefined; + get hasExtendedUnicodeEscape(): boolean | undefined; } - interface NoSubstitutionTemplateLiteral extends LiteralExpression, TemplateLiteralLikeNode, Declaration { - readonly kind: SyntaxKind.NoSubstitutionTemplateLiteral; + export class NoSubstitutionTemplateLiteral extends Token implements LiteralExpression, TemplateLiteralLikeNode, Declaration { + _literalExpressionBrand: any; + _primaryExpressionBrand: any; + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + _declarationBrand: any; + readonly ast: AstNoSubstitutionTemplateLiteral; + get text(): string; + get rawText(): string | undefined; + get isUnterminated(): boolean | undefined; + get hasExtendedUnicodeEscape(): boolean | undefined; } - enum TokenFlags { + export enum TokenFlags { None = 0, Scientific = 16, Octal = 32, @@ -4970,51 +5400,100 @@ declare namespace ts { BinarySpecifier = 128, OctalSpecifier = 256, } - interface NumericLiteral extends LiteralExpression, Declaration { - readonly kind: SyntaxKind.NumericLiteral; + export class NumericLiteral extends Token implements LiteralExpression, LiteralLikeNode, Declaration { + _literalExpressionBrand: any; + _primaryExpressionBrand: any; + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + _declarationBrand: any; + readonly ast: AstNumericLiteral; + get text(): string; } - interface BigIntLiteral extends LiteralExpression { - readonly kind: SyntaxKind.BigIntLiteral; + export class BigIntLiteral extends Token implements LiteralExpression, LiteralLikeNode { + _literalExpressionBrand: any; + _primaryExpressionBrand: any; + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + readonly ast: AstBigIntLiteral; + get text(): string; } - type LiteralToken = NumericLiteral | BigIntLiteral | StringLiteral | JsxText | RegularExpressionLiteral | NoSubstitutionTemplateLiteral; - interface TemplateHead extends TemplateLiteralLikeNode { - readonly kind: SyntaxKind.TemplateHead; - readonly parent: TemplateExpression | TemplateLiteralTypeNode; + export type LiteralToken = NumericLiteral | BigIntLiteral | StringLiteral | JsxText | RegularExpressionLiteral | NoSubstitutionTemplateLiteral; + export class TemplateHead extends Token implements TemplateLiteralLikeNode { + readonly ast: AstTemplateHead; + get parent(): TemplateExpression | TemplateLiteralTypeNode; + get text(): string; + get isUnterminated(): boolean | undefined; + get hasExtendedUnicodeEscape(): boolean | undefined; + get rawText(): string | undefined; } - interface TemplateMiddle extends TemplateLiteralLikeNode { - readonly kind: SyntaxKind.TemplateMiddle; - readonly parent: TemplateSpan | TemplateLiteralTypeSpan; + export class TemplateMiddle extends Token implements TemplateLiteralLikeNode { + readonly ast: AstTemplateMiddle; + get parent(): TemplateSpan | TemplateLiteralTypeSpan; + get text(): string; + get isUnterminated(): boolean | undefined; + get hasExtendedUnicodeEscape(): boolean | undefined; + get rawText(): string | undefined; } - interface TemplateTail extends TemplateLiteralLikeNode { - readonly kind: SyntaxKind.TemplateTail; - readonly parent: TemplateSpan | TemplateLiteralTypeSpan; + export class TemplateTail extends Token implements TemplateLiteralLikeNode { + readonly ast: AstTemplateTail; + get parent(): TemplateSpan | TemplateLiteralTypeSpan; + get text(): string; + get isUnterminated(): boolean | undefined; + get hasExtendedUnicodeEscape(): boolean | undefined; + get rawText(): string | undefined; } - type PseudoLiteralToken = TemplateHead | TemplateMiddle | TemplateTail; - type TemplateLiteralToken = NoSubstitutionTemplateLiteral | PseudoLiteralToken; - interface TemplateExpression extends PrimaryExpression { - readonly kind: SyntaxKind.TemplateExpression; - readonly head: TemplateHead; - readonly templateSpans: NodeArray; + export type PseudoLiteralToken = TemplateHead | TemplateMiddle | TemplateTail; + export type TemplateLiteralToken = NoSubstitutionTemplateLiteral | PseudoLiteralToken; + export class TemplateExpression extends Node implements PrimaryExpression { + _primaryExpressionBrand: any; + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + readonly ast: AstTemplateExpression; + get head(): TemplateHead; + get templateSpans(): NodeArray; } - type TemplateLiteral = TemplateExpression | NoSubstitutionTemplateLiteral; - interface TemplateSpan extends Node { - readonly kind: SyntaxKind.TemplateSpan; - readonly parent: TemplateExpression; - readonly expression: Expression; - readonly literal: TemplateMiddle | TemplateTail; + export type TemplateLiteral = TemplateExpression | NoSubstitutionTemplateLiteral; + export class TemplateSpan extends Node { + readonly ast: AstTemplateSpan; + get parent(): TemplateExpression; + get expression(): Expression; + get literal(): TemplateMiddle | TemplateTail; } - interface ParenthesizedExpression extends PrimaryExpression, JSDocContainer { - readonly kind: SyntaxKind.ParenthesizedExpression; - readonly expression: Expression; + export class ParenthesizedExpression extends Node implements PrimaryExpression, JSDocContainer { + _primaryExpressionBrand: any; + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + _jsdocContainerBrand: any; + readonly ast: AstParenthesizedExpression; + get expression(): Expression; } - interface ArrayLiteralExpression extends PrimaryExpression { - readonly kind: SyntaxKind.ArrayLiteralExpression; - readonly elements: NodeArray; + export class ArrayLiteralExpression extends Node implements PrimaryExpression { + _primaryExpressionBrand: any; + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + readonly ast: AstArrayLiteralExpression; + get elements(): NodeArray; } - interface SpreadElement extends Expression { - readonly kind: SyntaxKind.SpreadElement; - readonly parent: ArrayLiteralExpression | CallExpression | NewExpression; - readonly expression: Expression; + export class SpreadElement extends Node implements Expression { + _expressionBrand: any; + readonly ast: AstSpreadElement; + get parent(): ArrayLiteralExpression | CallExpression | NewExpression; + get expression(): Expression; } /** * This interface is a base interface for ObjectLiteralExpression and JSXAttributes to extend from. JSXAttributes is similar to @@ -5022,531 +5501,795 @@ declare namespace ts { * JSXAttribute or JSXSpreadAttribute. ObjectLiteralExpression, on the other hand, can only have properties of type * ObjectLiteralElement (e.g. PropertyAssignment, ShorthandPropertyAssignment etc.) */ - interface ObjectLiteralExpressionBase extends PrimaryExpression, Declaration { + export interface ObjectLiteralExpressionBase extends PrimaryExpression, Declaration { + readonly ast: AstNode; readonly properties: NodeArray; } - interface ObjectLiteralExpression extends ObjectLiteralExpressionBase, JSDocContainer { - readonly kind: SyntaxKind.ObjectLiteralExpression; + export class ObjectLiteralExpression extends Node implements ObjectLiteralExpressionBase, JSDocContainer { + _primaryExpressionBrand: any; + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + _declarationBrand: any; + _jsdocContainerBrand: any; + readonly ast: AstObjectLiteralExpression; + get properties(): NodeArray; } - type EntityNameExpression = Identifier | PropertyAccessEntityNameExpression; - type EntityNameOrEntityNameExpression = EntityName | EntityNameExpression; - type AccessExpression = PropertyAccessExpression | ElementAccessExpression; - interface PropertyAccessExpression extends MemberExpression, NamedDeclaration, JSDocContainer, FlowContainer { - readonly kind: SyntaxKind.PropertyAccessExpression; - readonly expression: LeftHandSideExpression; - readonly questionDotToken?: QuestionDotToken | undefined; - readonly name: MemberName; + export type EntityNameExpression = Identifier | PropertyAccessEntityNameExpression; + export type EntityNameOrEntityNameExpression = EntityName | EntityNameExpression; + export type AccessExpression = PropertyAccessExpression | ElementAccessExpression; + export class PropertyAccessExpression extends Node implements MemberExpression, NamedDeclaration, JSDocContainer, FlowContainer { + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + _declarationBrand: any; + _jsdocContainerBrand: any; + _flowContainerBrand: any; + readonly ast: AstPropertyAccessExpression; + get expression(): LeftHandSideExpression; + get questionDotToken(): QuestionDotToken | undefined; + get name(): Identifier | PrivateIdentifier; } - interface PropertyAccessChain extends PropertyAccessExpression { + export interface JsxTagNamePropertyAccess extends PropertyAccessExpression { + readonly ast: AstJsxTagNamePropertyAccess; + readonly data: AstJsxTagNamePropertyAccessData; + readonly expression: Identifier | ThisExpression | JsxTagNamePropertyAccess; + } + export interface PropertyAccessChain extends PropertyAccessExpression { _optionalChainBrand: any; + readonly ast: AstPropertyAccessChain; readonly name: MemberName; } - interface SuperPropertyAccessExpression extends PropertyAccessExpression { + export interface SuperPropertyAccessExpression extends PropertyAccessExpression { readonly expression: SuperExpression; } /** Brand for a PropertyAccessExpression which, like a QualifiedName, consists of a sequence of identifiers separated by dots. */ - interface PropertyAccessEntityNameExpression extends PropertyAccessExpression { + export interface PropertyAccessEntityNameExpression extends PropertyAccessExpression { _propertyAccessExpressionLikeQualifiedNameBrand?: any; readonly expression: EntityNameExpression; readonly name: Identifier; } - interface ElementAccessExpression extends MemberExpression, Declaration, JSDocContainer, FlowContainer { - readonly kind: SyntaxKind.ElementAccessExpression; - readonly expression: LeftHandSideExpression; - readonly questionDotToken?: QuestionDotToken | undefined; - readonly argumentExpression: Expression; + export class ElementAccessExpression extends Node implements MemberExpression, Declaration, JSDocContainer, FlowContainer { + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + _declarationBrand: any; + _jsdocContainerBrand: any; + _flowContainerBrand: any; + readonly ast: AstElementAccessExpression; + get expression(): LeftHandSideExpression; + get questionDotToken(): QuestionDotToken | undefined; + get argumentExpression(): Expression; } - interface ElementAccessChain extends ElementAccessExpression { + export interface ElementAccessChain extends ElementAccessExpression { _optionalChainBrand: any; + readonly ast: AstElementAccessChain; } - interface SuperElementAccessExpression extends ElementAccessExpression { + export interface SuperElementAccessExpression extends ElementAccessExpression { readonly expression: SuperExpression; } - type SuperProperty = SuperPropertyAccessExpression | SuperElementAccessExpression; - interface CallExpression extends LeftHandSideExpression, Declaration { - readonly kind: SyntaxKind.CallExpression; - readonly expression: LeftHandSideExpression; - readonly questionDotToken?: QuestionDotToken | undefined; - readonly typeArguments?: NodeArray | undefined; - readonly arguments: NodeArray; + export type SuperProperty = SuperPropertyAccessExpression | SuperElementAccessExpression; + export class CallExpression extends Node implements LeftHandSideExpression, Declaration { + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + _declarationBrand: any; + readonly ast: AstCallExpression; + get expression(): LeftHandSideExpression; + get questionDotToken(): QuestionDotToken | undefined; + get typeArguments(): NodeArray | undefined; + get arguments(): NodeArray; } - interface CallChain extends CallExpression { + export interface CallChain extends CallExpression { _optionalChainBrand: any; + readonly ast: AstCallChain; } - type OptionalChain = PropertyAccessChain | ElementAccessChain | CallChain | NonNullChain; - interface SuperCall extends CallExpression { + export type OptionalChain = PropertyAccessChain | ElementAccessChain | CallChain | NonNullChain; + export interface SuperCall extends CallExpression { readonly expression: SuperExpression; } - interface ImportCall extends CallExpression { + export interface ImportCall extends CallExpression { readonly expression: ImportExpression; } - interface ExpressionWithTypeArguments extends MemberExpression, NodeWithTypeArguments { - readonly kind: SyntaxKind.ExpressionWithTypeArguments; - readonly expression: LeftHandSideExpression; + export class ExpressionWithTypeArguments extends Node implements MemberExpression, NodeWithTypeArguments { + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + _typeNodeBrand: any; + readonly ast: AstExpressionWithTypeArguments; + get expression(): LeftHandSideExpression; + get typeArguments(): NodeArray | undefined; } - interface NewExpression extends PrimaryExpression, Declaration { - readonly kind: SyntaxKind.NewExpression; - readonly expression: LeftHandSideExpression; - readonly typeArguments?: NodeArray | undefined; - readonly arguments?: NodeArray | undefined; + export class NewExpression extends Node implements PrimaryExpression, Declaration { + _primaryExpressionBrand: any; + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + _declarationBrand: any; + readonly ast: AstNewExpression; + get expression(): LeftHandSideExpression; + get typeArguments(): NodeArray | undefined; + get arguments(): NodeArray | undefined; } - interface TaggedTemplateExpression extends MemberExpression { - readonly kind: SyntaxKind.TaggedTemplateExpression; - readonly tag: LeftHandSideExpression; - readonly typeArguments?: NodeArray | undefined; - readonly template: TemplateLiteral; + export class TaggedTemplateExpression extends Node implements MemberExpression { + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + readonly ast: AstTaggedTemplateExpression; + get tag(): LeftHandSideExpression; + get typeArguments(): NodeArray | undefined; + get template(): NoSubstitutionTemplateLiteral | TemplateExpression; } - interface InstanceofExpression extends BinaryExpression { - readonly operatorToken: Token; + export type CallLikeExpression = CallExpression | NewExpression | TaggedTemplateExpression | Decorator | JsxOpeningLikeElement | InstanceofExpression; + export class AsExpression extends Node implements Expression { + _expressionBrand: any; + readonly ast: AstAsExpression; + get expression(): Expression; + get type(): TypeNode; } - type CallLikeExpression = CallExpression | NewExpression | TaggedTemplateExpression | Decorator | JsxOpeningLikeElement | InstanceofExpression; - interface AsExpression extends Expression { - readonly kind: SyntaxKind.AsExpression; - readonly expression: Expression; - readonly type: TypeNode; + export class TypeAssertionExpression extends Node implements UnaryExpression { + _unaryExpressionBrand: any; + _expressionBrand: any; + readonly ast: AstTypeAssertion; + get type(): TypeNode; + get expression(): UnaryExpression; } - interface TypeAssertion extends UnaryExpression { - readonly kind: SyntaxKind.TypeAssertionExpression; - readonly type: TypeNode; - readonly expression: UnaryExpression; + /** @deprecated Use `TypeAssertionExpression` instead */ + export type TypeAssertion = TypeAssertionExpression; + export type AssertionExpression = TypeAssertionExpression | AsExpression; + export class SatisfiesExpression extends Node implements Expression { + _expressionBrand: any; + readonly ast: AstSatisfiesExpression; + get expression(): Expression; + get type(): TypeNode; } - interface SatisfiesExpression extends Expression { - readonly kind: SyntaxKind.SatisfiesExpression; - readonly expression: Expression; - readonly type: TypeNode; + export class NonNullExpression extends Node implements LeftHandSideExpression { + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + readonly ast: AstNonNullExpression; + get expression(): Expression; } - type AssertionExpression = TypeAssertion | AsExpression; - interface NonNullExpression extends LeftHandSideExpression { - readonly kind: SyntaxKind.NonNullExpression; - readonly expression: Expression; - } - interface NonNullChain extends NonNullExpression { + export interface NonNullChain extends NonNullExpression { _optionalChainBrand: any; + readonly ast: AstNonNullChain; } - interface MetaProperty extends PrimaryExpression, FlowContainer { - readonly kind: SyntaxKind.MetaProperty; - readonly keywordToken: SyntaxKind.NewKeyword | SyntaxKind.ImportKeyword; - readonly name: Identifier; + export class MetaProperty extends Node implements PrimaryExpression, FlowContainer { + _primaryExpressionBrand: any; + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + _flowContainerBrand: any; + readonly ast: AstMetaProperty; + get keywordToken(): SyntaxKind.ImportKeyword | SyntaxKind.NewKeyword; + get name(): Identifier; } - interface JsxElement extends PrimaryExpression { - readonly kind: SyntaxKind.JsxElement; - readonly openingElement: JsxOpeningElement; - readonly children: NodeArray; - readonly closingElement: JsxClosingElement; + export class JsxElement extends Node implements PrimaryExpression { + _primaryExpressionBrand: any; + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + readonly ast: AstJsxElement; + get openingElement(): JsxOpeningElement; + get children(): NodeArray; + get closingElement(): JsxClosingElement; } - type JsxOpeningLikeElement = JsxSelfClosingElement | JsxOpeningElement; - type JsxAttributeLike = JsxAttribute | JsxSpreadAttribute; - type JsxAttributeName = Identifier | JsxNamespacedName; - type JsxTagNameExpression = Identifier | ThisExpression | JsxTagNamePropertyAccess | JsxNamespacedName; - interface JsxTagNamePropertyAccess extends PropertyAccessExpression { - readonly expression: Identifier | ThisExpression | JsxTagNamePropertyAccess; + export type JsxOpeningLikeElement = JsxSelfClosingElement | JsxOpeningElement; + export type JsxAttributeLike = JsxAttribute | JsxSpreadAttribute; + export type JsxAttributeName = Identifier | JsxNamespacedName; + export type JsxTagNameExpression = Identifier | ThisExpression | JsxTagNamePropertyAccess | JsxNamespacedName; + export class JsxAttributes extends Node implements PrimaryExpression, Declaration { + _primaryExpressionBrand: any; + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + _declarationBrand: any; + readonly ast: AstJsxAttributes; + get parent(): JsxOpeningLikeElement; + get properties(): NodeArray; } - interface JsxAttributes extends PrimaryExpression, Declaration { - readonly kind: SyntaxKind.JsxAttributes; - readonly properties: NodeArray; - readonly parent: JsxOpeningLikeElement; + export class JsxNamespacedName extends Node { + readonly ast: AstJsxNamespacedName; + get name(): Identifier; + get namespace(): Identifier; } - interface JsxNamespacedName extends Node { - readonly kind: SyntaxKind.JsxNamespacedName; - readonly name: Identifier; - readonly namespace: Identifier; + export class JsxOpeningElement extends Node implements Expression { + _expressionBrand: any; + readonly ast: AstJsxOpeningElement; + get parent(): JsxElement; + get tagName(): JsxTagNameExpression; + get typeArguments(): NodeArray | undefined; + get attributes(): JsxAttributes; } - interface JsxOpeningElement extends Expression { - readonly kind: SyntaxKind.JsxOpeningElement; - readonly parent: JsxElement; - readonly tagName: JsxTagNameExpression; - readonly typeArguments?: NodeArray | undefined; - readonly attributes: JsxAttributes; + export class JsxSelfClosingElement extends Node implements PrimaryExpression { + _primaryExpressionBrand: any; + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + readonly ast: AstJsxSelfClosingElement; + get tagName(): JsxTagNameExpression; + get typeArguments(): NodeArray | undefined; + get attributes(): JsxAttributes; } - interface JsxSelfClosingElement extends PrimaryExpression { - readonly kind: SyntaxKind.JsxSelfClosingElement; - readonly tagName: JsxTagNameExpression; - readonly typeArguments?: NodeArray | undefined; - readonly attributes: JsxAttributes; + export class JsxFragment extends Node implements PrimaryExpression { + _primaryExpressionBrand: any; + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + readonly ast: AstJsxFragment; + get openingFragment(): JsxOpeningFragment; + get children(): NodeArray; + get closingFragment(): JsxClosingFragment; } - interface JsxFragment extends PrimaryExpression { - readonly kind: SyntaxKind.JsxFragment; - readonly openingFragment: JsxOpeningFragment; - readonly children: NodeArray; - readonly closingFragment: JsxClosingFragment; + export class JsxOpeningFragment extends Node implements Expression { + _expressionBrand: any; + readonly ast: AstJsxOpeningFragment; + get parent(): JsxFragment; } - interface JsxOpeningFragment extends Expression { - readonly kind: SyntaxKind.JsxOpeningFragment; - readonly parent: JsxFragment; + export class JsxClosingFragment extends Node implements Expression { + _expressionBrand: any; + readonly ast: AstJsxClosingFragment; + get parent(): JsxFragment; } - interface JsxClosingFragment extends Expression { - readonly kind: SyntaxKind.JsxClosingFragment; - readonly parent: JsxFragment; + export class JsxAttribute extends Node implements Declaration { + readonly ast: AstJsxAttribute; + _declarationBrand: any; + get parent(): JsxAttributes; + get name(): JsxAttributeName; + get initializer(): JsxAttributeValue | undefined; } - interface JsxAttribute extends Declaration { - readonly kind: SyntaxKind.JsxAttribute; - readonly parent: JsxAttributes; - readonly name: JsxAttributeName; - readonly initializer?: JsxAttributeValue | undefined; + export type JsxAttributeValue = StringLiteral | JsxExpression | JsxElement | JsxSelfClosingElement | JsxFragment; + export class JsxSpreadAttribute extends Node implements ObjectLiteralElement { + _objectLiteralBrand: any; + _declarationBrand: any; + readonly ast: AstJsxSpreadAttribute; + get parent(): JsxAttributes; + get expression(): Expression; } - type JsxAttributeValue = StringLiteral | JsxExpression | JsxElement | JsxSelfClosingElement | JsxFragment; - interface JsxSpreadAttribute extends ObjectLiteralElement { - readonly kind: SyntaxKind.JsxSpreadAttribute; - readonly parent: JsxAttributes; - readonly expression: Expression; + export class JsxClosingElement extends Node { + readonly ast: AstJsxClosingElement; + get parent(): JsxElement; + get tagName(): JsxTagNameExpression; } - interface JsxClosingElement extends Node { - readonly kind: SyntaxKind.JsxClosingElement; - readonly parent: JsxElement; - readonly tagName: JsxTagNameExpression; + export class JsxExpression extends Node implements Expression { + _expressionBrand: any; + readonly ast: AstJsxExpression; + get parent(): JsxElement | JsxFragment | JsxAttributeLike; + get dotDotDotToken(): DotDotDotToken | undefined; + get expression(): Expression | undefined; } - interface JsxExpression extends Expression { - readonly kind: SyntaxKind.JsxExpression; - readonly parent: JsxElement | JsxFragment | JsxAttributeLike; - readonly dotDotDotToken?: Token | undefined; - readonly expression?: Expression | undefined; + export class JsxText extends Token implements LiteralLikeNode { + readonly ast: AstJsxText; + get parent(): JsxElement | JsxFragment; + get text(): string; + get isUnterminated(): boolean | undefined; + get hasExtendedUnicodeEscape(): boolean | undefined; + get containsOnlyTriviaWhiteSpaces(): boolean; } - interface JsxText extends LiteralLikeNode { - readonly kind: SyntaxKind.JsxText; - readonly parent: JsxElement | JsxFragment; - readonly containsOnlyTriviaWhiteSpaces: boolean; - } - type JsxChild = JsxText | JsxExpression | JsxElement | JsxSelfClosingElement | JsxFragment; - interface Statement extends Node, JSDocContainer { + export type JsxChild = JsxText | JsxExpression | JsxElement | JsxSelfClosingElement | JsxFragment; + export interface Statement extends JSDocContainer { _statementBrand: any; + readonly ast: AstStatement; } - interface NotEmittedStatement extends Statement { - readonly kind: SyntaxKind.NotEmittedStatement; + export class NotEmittedStatement extends Node implements Statement { + _statementBrand: any; + _jsdocContainerBrand: any; + readonly ast: AstNotEmittedStatement; } - interface NotEmittedTypeElement extends TypeElement { - readonly kind: SyntaxKind.NotEmittedTypeElement; + export class NotEmittedTypeElement extends Node implements TypeElement { + _typeElementBrand: any; + _declarationBrand: any; + readonly ast: AstNotEmittedTypeElement; } /** * A list of comma-separated expressions. This node is only created by transformations. */ - interface CommaListExpression extends Expression { - readonly kind: SyntaxKind.CommaListExpression; - readonly elements: NodeArray; + export class CommaListExpression extends Node implements Expression { + _expressionBrand: any; + readonly ast: AstCommaListExpression; + get elements(): NodeArray; } - interface EmptyStatement extends Statement { - readonly kind: SyntaxKind.EmptyStatement; + export class EmptyStatement extends Node implements Statement, JSDocContainer { + _statementBrand: any; + _jsdocContainerBrand: any; + readonly ast: AstEmptyStatement; } - interface DebuggerStatement extends Statement, FlowContainer { - readonly kind: SyntaxKind.DebuggerStatement; + export class DebuggerStatement extends Node implements Statement, FlowContainer { + _statementBrand: any; + _jsdocContainerBrand: any; + _flowContainerBrand: any; + readonly ast: AstDebuggerStatement; } - interface MissingDeclaration extends DeclarationStatement, PrimaryExpression { - readonly kind: SyntaxKind.MissingDeclaration; - readonly name?: Identifier | undefined; + export class MissingDeclaration extends Node implements DeclarationStatement { + _declarationBrand: any; + _statementBrand: any; + _jsdocContainerBrand: any; + _primaryExpressionBrand: any; + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + readonly ast: AstMissingDeclaration; + get name(): Identifier | undefined; + get modifiers(): NodeArray | undefined; } - type BlockLike = SourceFile | Block | ModuleBlock | CaseOrDefaultClause; - interface Block extends Statement, LocalsContainer { - readonly kind: SyntaxKind.Block; - readonly statements: NodeArray; + export type BlockLike = SourceFile | Block | ModuleBlock | CaseOrDefaultClause; + export class Block extends Node implements Statement, LocalsContainer { + _statementBrand: any; + _jsdocContainerBrand: any; + _localsContainerBrand: any; + readonly ast: AstBlock; + get statements(): NodeArray; } - interface VariableStatement extends Statement, FlowContainer { - readonly kind: SyntaxKind.VariableStatement; - readonly modifiers?: NodeArray | undefined; - readonly declarationList: VariableDeclarationList; + export class VariableStatement extends Node implements Statement, FlowContainer { + _statementBrand: any; + _jsdocContainerBrand: any; + _flowContainerBrand: any; + readonly ast: AstVariableStatement; + get modifiers(): NodeArray | undefined; + get declarationList(): VariableDeclarationList; } - interface ExpressionStatement extends Statement, FlowContainer { - readonly kind: SyntaxKind.ExpressionStatement; - readonly expression: Expression; + export class ExpressionStatement extends Node implements Statement, FlowContainer { + _statementBrand: any; + _jsdocContainerBrand: any; + _flowContainerBrand: any; + readonly ast: AstExpressionStatement; + get expression(): Expression; } - interface IfStatement extends Statement, FlowContainer { - readonly kind: SyntaxKind.IfStatement; - readonly expression: Expression; - readonly thenStatement: Statement; - readonly elseStatement?: Statement | undefined; + export class IfStatement extends Node implements Statement, FlowContainer { + _statementBrand: any; + _jsdocContainerBrand: any; + _flowContainerBrand: any; + readonly ast: AstIfStatement; + get expression(): Expression; + get thenStatement(): Statement; + get elseStatement(): Statement | undefined; } - interface IterationStatement extends Statement { + export interface IterationStatement extends Statement { readonly statement: Statement; } - interface DoStatement extends IterationStatement, FlowContainer { - readonly kind: SyntaxKind.DoStatement; - readonly expression: Expression; + export class DoStatement extends Node implements IterationStatement, FlowContainer { + _statementBrand: any; + _jsdocContainerBrand: any; + _flowContainerBrand: any; + readonly ast: AstDoStatement; + get statement(): Statement; + get expression(): Expression; } - interface WhileStatement extends IterationStatement, FlowContainer { - readonly kind: SyntaxKind.WhileStatement; - readonly expression: Expression; + export class WhileStatement extends Node implements IterationStatement, FlowContainer { + _statementBrand: any; + _jsdocContainerBrand: any; + _flowContainerBrand: any; + readonly ast: AstWhileStatement; + get expression(): Expression; + get statement(): Statement; } - type ForInitializer = VariableDeclarationList | Expression; - interface ForStatement extends IterationStatement, LocalsContainer, FlowContainer { - readonly kind: SyntaxKind.ForStatement; - readonly initializer?: ForInitializer | undefined; - readonly condition?: Expression | undefined; - readonly incrementor?: Expression | undefined; + export type ForInitializer = VariableDeclarationList | Expression; + export class ForStatement extends Node implements IterationStatement, LocalsContainer, FlowContainer { + _statementBrand: any; + _jsdocContainerBrand: any; + _localsContainerBrand: any; + _flowContainerBrand: any; + readonly ast: AstForStatement; + get initializer(): ForInitializer | undefined; + get condition(): Expression | undefined; + get incrementor(): Expression | undefined; + get statement(): Statement; } - type ForInOrOfStatement = ForInStatement | ForOfStatement; - interface ForInStatement extends IterationStatement, LocalsContainer, FlowContainer { - readonly kind: SyntaxKind.ForInStatement; - readonly initializer: ForInitializer; - readonly expression: Expression; + export type ForInOrOfStatement = ForInStatement | ForOfStatement; + export class ForInStatement extends Node implements IterationStatement, LocalsContainer, FlowContainer { + _statementBrand: any; + _jsdocContainerBrand: any; + _localsContainerBrand: any; + _flowContainerBrand: any; + readonly ast: AstForInStatement; + get initializer(): ForInitializer; + get expression(): Expression; + get statement(): Statement; } - interface ForOfStatement extends IterationStatement, LocalsContainer, FlowContainer { - readonly kind: SyntaxKind.ForOfStatement; - readonly awaitModifier?: AwaitKeyword | undefined; - readonly initializer: ForInitializer; - readonly expression: Expression; + export class ForOfStatement extends Node implements IterationStatement, LocalsContainer, FlowContainer { + _statementBrand: any; + _jsdocContainerBrand: any; + _localsContainerBrand: any; + _flowContainerBrand: any; + readonly ast: AstForOfStatement; + get awaitModifier(): AwaitKeyword | undefined; + get initializer(): ForInitializer; + get expression(): Expression; + get statement(): Statement; } - interface BreakStatement extends Statement, FlowContainer { - readonly kind: SyntaxKind.BreakStatement; - readonly label?: Identifier | undefined; + export class BreakStatement extends Node implements Statement, FlowContainer { + _statementBrand: any; + _jsdocContainerBrand: any; + _flowContainerBrand: any; + readonly ast: AstBreakStatement; + get label(): Identifier | undefined; } - interface ContinueStatement extends Statement, FlowContainer { - readonly kind: SyntaxKind.ContinueStatement; - readonly label?: Identifier | undefined; + export class ContinueStatement extends Node implements Statement, FlowContainer { + _statementBrand: any; + _jsdocContainerBrand: any; + _flowContainerBrand: any; + readonly ast: AstContinueStatement; + get label(): Identifier | undefined; } - type BreakOrContinueStatement = BreakStatement | ContinueStatement; - interface ReturnStatement extends Statement, FlowContainer { - readonly kind: SyntaxKind.ReturnStatement; - readonly expression?: Expression | undefined; + export type BreakOrContinueStatement = BreakStatement | ContinueStatement; + export class ReturnStatement extends Node implements Statement, FlowContainer { + _statementBrand: any; + _jsdocContainerBrand: any; + _flowContainerBrand: any; + readonly ast: AstReturnStatement; + get expression(): Expression | undefined; } - interface WithStatement extends Statement, FlowContainer { - readonly kind: SyntaxKind.WithStatement; - readonly expression: Expression; - readonly statement: Statement; + export class WithStatement extends Node implements Statement, FlowContainer { + _statementBrand: any; + _jsdocContainerBrand: any; + _flowContainerBrand: any; + readonly ast: AstWithStatement; + get expression(): Expression; + get statement(): Statement; } - interface SwitchStatement extends Statement, FlowContainer { - readonly kind: SyntaxKind.SwitchStatement; - readonly expression: Expression; - readonly caseBlock: CaseBlock; - possiblyExhaustive?: boolean | undefined; + export class SwitchStatement extends Node implements Statement, FlowContainer { + _statementBrand: any; + _jsdocContainerBrand: any; + _flowContainerBrand: any; + readonly ast: AstSwitchStatement; + get expression(): Expression; + get caseBlock(): CaseBlock; + get possiblyExhaustive(): boolean | undefined; } - interface CaseBlock extends Node, LocalsContainer { - readonly kind: SyntaxKind.CaseBlock; - readonly parent: SwitchStatement; - readonly clauses: NodeArray; + export class CaseBlock extends Node implements LocalsContainer { + _localsContainerBrand: any; + readonly ast: AstCaseBlock; + get parent(): SwitchStatement; + get clauses(): NodeArray; } - interface CaseClause extends Node, JSDocContainer { - readonly kind: SyntaxKind.CaseClause; - readonly parent: CaseBlock; - readonly expression: Expression; - readonly statements: NodeArray; + export class CaseClause extends Node implements JSDocContainer { + _jsdocContainerBrand: any; + readonly ast: AstCaseClause; + get parent(): CaseBlock; + get expression(): Expression; + get statements(): NodeArray; } - interface DefaultClause extends Node { - readonly kind: SyntaxKind.DefaultClause; - readonly parent: CaseBlock; - readonly statements: NodeArray; + export class DefaultClause extends Node { + readonly ast: AstDefaultClause; + get parent(): CaseBlock; + get statements(): NodeArray; } - type CaseOrDefaultClause = CaseClause | DefaultClause; - interface LabeledStatement extends Statement, FlowContainer { - readonly kind: SyntaxKind.LabeledStatement; - readonly label: Identifier; - readonly statement: Statement; + export type CaseOrDefaultClause = CaseClause | DefaultClause; + export class LabeledStatement extends Node implements Statement, FlowContainer { + _statementBrand: any; + _jsdocContainerBrand: any; + _flowContainerBrand: any; + readonly ast: AstLabeledStatement; + get label(): Identifier; + get statement(): Statement; } - interface ThrowStatement extends Statement, FlowContainer { - readonly kind: SyntaxKind.ThrowStatement; - readonly expression: Expression; + export class ThrowStatement extends Node implements Statement, FlowContainer { + _statementBrand: any; + _jsdocContainerBrand: any; + _flowContainerBrand: any; + readonly ast: AstThrowStatement; + get expression(): Expression; } - interface TryStatement extends Statement, FlowContainer { - readonly kind: SyntaxKind.TryStatement; - readonly tryBlock: Block; - readonly catchClause?: CatchClause | undefined; - readonly finallyBlock?: Block | undefined; + export class TryStatement extends Node implements Statement, FlowContainer { + _statementBrand: any; + _jsdocContainerBrand: any; + _flowContainerBrand: any; + readonly ast: AstTryStatement; + get tryBlock(): Block; + get catchClause(): CatchClause | undefined; + get finallyBlock(): Block | undefined; } - interface CatchClause extends Node, LocalsContainer { - readonly kind: SyntaxKind.CatchClause; - readonly parent: TryStatement; - readonly variableDeclaration?: VariableDeclaration | undefined; - readonly block: Block; + export class CatchClause extends Node implements LocalsContainer { + _localsContainerBrand: any; + readonly ast: AstCatchClause; + get parent(): TryStatement; + get variableDeclaration(): VariableDeclaration | undefined; + get block(): Block; } - type ObjectTypeDeclaration = ClassLikeDeclaration | InterfaceDeclaration | TypeLiteralNode; - type DeclarationWithTypeParameters = DeclarationWithTypeParameterChildren | JSDocTypedefTag | JSDocCallbackTag | JSDocSignature; - type DeclarationWithTypeParameterChildren = SignatureDeclaration | ClassLikeDeclaration | InterfaceDeclaration | TypeAliasDeclaration | JSDocTemplateTag; - interface ClassLikeDeclarationBase extends NamedDeclaration, JSDocContainer { + export type ObjectTypeDeclaration = ClassLikeDeclaration | InterfaceDeclaration | TypeLiteralNode; + export type DeclarationWithTypeParameters = DeclarationWithTypeParameterChildren | JSDocTypedefTag | JSDocCallbackTag | JSDocSignature; + export type DeclarationWithTypeParameterChildren = SignatureDeclaration | ClassLikeDeclaration | InterfaceDeclaration | TypeAliasDeclaration | JSDocTemplateTag; + export interface ClassLikeDeclarationBase extends NamedDeclaration, JSDocContainer { + readonly ast: AstNode; readonly kind: SyntaxKind.ClassDeclaration | SyntaxKind.ClassExpression; readonly name?: Identifier | undefined; readonly typeParameters?: NodeArray | undefined; readonly heritageClauses?: NodeArray | undefined; readonly members: NodeArray; } - interface ClassDeclaration extends ClassLikeDeclarationBase, DeclarationStatement { - readonly kind: SyntaxKind.ClassDeclaration; - readonly modifiers?: NodeArray | undefined; + export class ClassDeclaration extends Node implements ClassLikeDeclarationBase, DeclarationStatement { + _declarationBrand: any; + _statementBrand: any; + _jsdocContainerBrand: any; + readonly ast: AstClassDeclaration; + get modifiers(): NodeArray | undefined; + get name(): Identifier | undefined; + get typeParameters(): NodeArray | undefined; + get heritageClauses(): NodeArray | undefined; + get members(): NodeArray; + } + export class ClassExpression extends Node implements ClassLikeDeclarationBase, PrimaryExpression { + _declarationBrand: any; + _jsdocContainerBrand: any; + _primaryExpressionBrand: any; + _memberExpressionBrand: any; + _leftHandSideExpressionBrand: any; + _updateExpressionBrand: any; + _unaryExpressionBrand: any; + _expressionBrand: any; + readonly ast: AstClassExpression; + get modifiers(): NodeArray | undefined; /** May be undefined in `export default class { ... }`. */ - readonly name?: Identifier | undefined; + get name(): Identifier | undefined; + get typeParameters(): NodeArray | undefined; + get heritageClauses(): NodeArray | undefined; + get members(): NodeArray; } - interface ClassExpression extends ClassLikeDeclarationBase, PrimaryExpression { - readonly kind: SyntaxKind.ClassExpression; - readonly modifiers?: NodeArray | undefined; - } - type ClassLikeDeclaration = ClassDeclaration | ClassExpression; - interface ClassElement extends NamedDeclaration { + export type ClassLikeDeclaration = ClassDeclaration | ClassExpression; + export interface ClassElement extends Declaration { _classElementBrand: any; + readonly ast: AstClassElement; readonly name?: PropertyName | undefined; } - interface TypeElement extends NamedDeclaration { + export interface TypeElement extends Declaration { _typeElementBrand: any; + readonly ast: AstTypeElement; readonly name?: PropertyName | undefined; readonly questionToken?: QuestionToken | undefined; } - interface InterfaceDeclaration extends DeclarationStatement, JSDocContainer { - readonly kind: SyntaxKind.InterfaceDeclaration; - readonly modifiers?: NodeArray | undefined; - readonly name: Identifier; - readonly typeParameters?: NodeArray | undefined; - readonly heritageClauses?: NodeArray | undefined; - readonly members: NodeArray; + export class InterfaceDeclaration extends Node implements DeclarationStatement, JSDocContainer { + _declarationBrand: any; + _statementBrand: any; + _jsdocContainerBrand: any; + readonly ast: AstInterfaceDeclaration; + get modifiers(): NodeArray | undefined; + get name(): Identifier; + get typeParameters(): NodeArray | undefined; + get heritageClauses(): NodeArray | undefined; + get members(): NodeArray; } - interface HeritageClause extends Node { - readonly kind: SyntaxKind.HeritageClause; - readonly parent: InterfaceDeclaration | ClassLikeDeclaration; - readonly token: SyntaxKind.ExtendsKeyword | SyntaxKind.ImplementsKeyword; - readonly types: NodeArray; + export class HeritageClause extends Node { + readonly ast: AstHeritageClause; + get parent(): InterfaceDeclaration | ClassLikeDeclaration; + get token(): SyntaxKind.ExtendsKeyword | SyntaxKind.ImplementsKeyword; + get types(): NodeArray; } - interface TypeAliasDeclaration extends DeclarationStatement, JSDocContainer, LocalsContainer { - readonly kind: SyntaxKind.TypeAliasDeclaration; - readonly modifiers?: NodeArray | undefined; - readonly name: Identifier; - readonly typeParameters?: NodeArray | undefined; - readonly type: TypeNode; + export class TypeAliasDeclaration extends Node implements DeclarationStatement, JSDocContainer, LocalsContainer { + _declarationBrand: any; + _statementBrand: any; + _jsdocContainerBrand: any; + _localsContainerBrand: any; + readonly ast: AstTypeAliasDeclaration; + get modifiers(): NodeArray | undefined; + get name(): Identifier; + get typeParameters(): NodeArray | undefined; + get type(): TypeNode; } - interface EnumMember extends NamedDeclaration, JSDocContainer { - readonly kind: SyntaxKind.EnumMember; - readonly parent: EnumDeclaration; - readonly name: PropertyName; - readonly initializer?: Expression | undefined; + export class EnumMember extends Node implements NamedDeclaration, JSDocContainer { + _declarationBrand: any; + _jsdocContainerBrand: any; + readonly ast: AstEnumMember; + get parent(): EnumDeclaration; + get name(): PropertyName; + get initializer(): Expression | undefined; } - interface EnumDeclaration extends DeclarationStatement, JSDocContainer { - readonly kind: SyntaxKind.EnumDeclaration; - readonly modifiers?: NodeArray | undefined; - readonly name: Identifier; - readonly members: NodeArray; + export class EnumDeclaration extends Node implements DeclarationStatement, JSDocContainer { + _declarationBrand: any; + _statementBrand: any; + _jsdocContainerBrand: any; + readonly ast: AstEnumDeclaration; + get modifiers(): NodeArray | undefined; + get name(): Identifier; + get members(): NodeArray; } - type ModuleName = Identifier | StringLiteral; - type ModuleBody = NamespaceBody | JSDocNamespaceBody; - interface ModuleDeclaration extends DeclarationStatement, JSDocContainer, LocalsContainer { - readonly kind: SyntaxKind.ModuleDeclaration; - readonly parent: ModuleBody | SourceFile; - readonly modifiers?: NodeArray | undefined; - readonly name: ModuleName; - readonly body?: ModuleBody | JSDocNamespaceDeclaration | undefined; + export type ModuleName = Identifier | StringLiteral; + export type ModuleBody = NamespaceBody | JSDocNamespaceBody; + export class ModuleDeclaration extends Node implements DeclarationStatement, JSDocContainer, LocalsContainer { + _declarationBrand: any; + _statementBrand: any; + _jsdocContainerBrand: any; + _localsContainerBrand: any; + readonly ast: AstModuleDeclaration; + get parent(): ModuleDeclaration | ModuleBlock | SourceFile; + get modifiers(): NodeArray | undefined; + get name(): ModuleName; + get body(): ModuleBody | JSDocNamespaceDeclaration | undefined; } - type NamespaceBody = ModuleBlock | NamespaceDeclaration; - interface NamespaceDeclaration extends ModuleDeclaration { + export type NamespaceBody = ModuleBlock | NamespaceDeclaration; + export interface NamespaceDeclaration extends ModuleDeclaration { + readonly ast: AstNamespaceDeclaration; + readonly data: AstNamespaceDeclarationData; readonly name: Identifier; readonly body: NamespaceBody; } - type JSDocNamespaceBody = Identifier | JSDocNamespaceDeclaration; - interface JSDocNamespaceDeclaration extends ModuleDeclaration { + export type JSDocNamespaceBody = Identifier | JSDocNamespaceDeclaration; + export interface JSDocNamespaceDeclaration extends ModuleDeclaration { + readonly ast: AstJSDocNamespaceDeclaration; + readonly data: AstJSDocNamespaceDeclarationData; readonly name: Identifier; - readonly body?: JSDocNamespaceBody | undefined; + readonly body: JSDocNamespaceBody | undefined; } - interface ModuleBlock extends Node, Statement { - readonly kind: SyntaxKind.ModuleBlock; - readonly parent: ModuleDeclaration; - readonly statements: NodeArray; + export class ModuleBlock extends Node implements Statement, JSDocContainer { + _statementBrand: any; + _jsdocContainerBrand: any; + readonly ast: AstModuleBlock; + get parent(): ModuleDeclaration; + get statements(): NodeArray; } - type ModuleReference = EntityName | ExternalModuleReference; + export type ModuleReference = EntityName | ExternalModuleReference; /** * One of: * - import x = require("mod"); * - import x = M.x; */ - interface ImportEqualsDeclaration extends DeclarationStatement, JSDocContainer { - readonly kind: SyntaxKind.ImportEqualsDeclaration; - readonly parent: SourceFile | ModuleBlock; - readonly modifiers?: NodeArray | undefined; - readonly name: Identifier; - readonly isTypeOnly: boolean; - readonly moduleReference: ModuleReference; + export class ImportEqualsDeclaration extends Node implements DeclarationStatement, JSDocContainer { + _declarationBrand: any; + _statementBrand: any; + _jsdocContainerBrand: any; + readonly ast: AstImportEqualsDeclaration; + get parent(): ModuleBlock | SourceFile; + get modifiers(): NodeArray | undefined; + get name(): Identifier; + get isTypeOnly(): boolean; + /** + * 'EntityName' for an internal module reference, 'ExternalModuleReference' for an external module reference. + */ + get moduleReference(): ModuleReference; } - interface ExternalModuleReference extends Node { - readonly kind: SyntaxKind.ExternalModuleReference; - readonly parent: ImportEqualsDeclaration; - readonly expression: Expression; + export class ExternalModuleReference extends Node { + readonly ast: AstExternalModuleReference; + get parent(): ImportEqualsDeclaration; + get expression(): Expression; } - interface ImportDeclaration extends Statement { - readonly kind: SyntaxKind.ImportDeclaration; - readonly parent: SourceFile | ModuleBlock; - readonly modifiers?: NodeArray | undefined; - readonly importClause?: ImportClause | undefined; + export class ImportDeclaration extends Node implements Declaration, JSDocContainer { + _declarationBrand: any; + _statementBrand: any; + _jsdocContainerBrand: any; + readonly ast: AstImportDeclaration; + get parent(): ModuleBlock | SourceFile; + get modifiers(): NodeArray | undefined; + get importClause(): ImportClause | undefined; /** If this is not a StringLiteral it will be a grammar error. */ - readonly moduleSpecifier: Expression; - /** @deprecated */ readonly assertClause?: AssertClause | undefined; - readonly attributes?: ImportAttributes | undefined; + get moduleSpecifier(): Expression; + /** @deprecated */ + get assertClause(): ImportAttributes | undefined; + get attributes(): ImportAttributes | undefined; } - type NamedImportBindings = NamespaceImport | NamedImports; - type NamedExportBindings = NamespaceExport | NamedExports; - interface ImportClause extends NamedDeclaration { - readonly kind: SyntaxKind.ImportClause; - readonly parent: ImportDeclaration | JSDocImportTag; - readonly isTypeOnly: boolean; - readonly name?: Identifier | undefined; - readonly namedBindings?: NamedImportBindings | undefined; + export type NamedImportBindings = NamespaceImport | NamedImports; + export type NamedExportBindings = NamespaceExport | NamedExports; + export class ImportClause extends Node implements NamedDeclaration { + _declarationBrand: any; + readonly ast: AstImportClause; + get parent(): ImportDeclaration | JSDocImportTag; + get isTypeOnly(): boolean; + get name(): Identifier | undefined; + get namedBindings(): NamedImportBindings | undefined; } /** @deprecated */ - type AssertionKey = ImportAttributeName; + export type AssertionKey = ImportAttributeName; /** @deprecated */ - interface AssertEntry extends ImportAttribute { + export interface AssertEntry extends ImportAttribute { } /** @deprecated */ - interface AssertClause extends ImportAttributes { + export interface AssertClause extends ImportAttributes { } - type ImportAttributeName = Identifier | StringLiteral; - interface ImportAttribute extends Node { - readonly kind: SyntaxKind.ImportAttribute; - readonly parent: ImportAttributes; - readonly name: ImportAttributeName; - readonly value: Expression; + export type ImportAttributeName = Identifier | StringLiteral; + export class ImportAttribute extends Node { + readonly ast: AstImportAttribute; + get parent(): ImportAttributes; + get name(): ImportAttributeName; + get value(): Expression; } - interface ImportAttributes extends Node { - readonly kind: SyntaxKind.ImportAttributes; - readonly token: SyntaxKind.WithKeyword | SyntaxKind.AssertKeyword; - readonly parent: ImportDeclaration | ExportDeclaration; - readonly elements: NodeArray; - readonly multiLine?: boolean | undefined; + export class ImportAttributes extends Node { + readonly ast: AstImportAttributes; + get parent(): ImportDeclaration | ExportDeclaration; + get token(): SyntaxKind.WithKeyword | SyntaxKind.AssertKeyword; + get elements(): NodeArray; + get multiLine(): boolean | undefined; } - interface NamespaceImport extends NamedDeclaration { - readonly kind: SyntaxKind.NamespaceImport; - readonly parent: ImportClause; - readonly name: Identifier; + export class NamespaceImport extends Node implements NamedDeclaration { + _declarationBrand: any; + readonly ast: AstNamespaceImport; + get parent(): ImportClause; + get name(): Identifier; } - interface NamespaceExport extends NamedDeclaration { - readonly kind: SyntaxKind.NamespaceExport; - readonly parent: ExportDeclaration; - readonly name: ModuleExportName; + export class NamespaceExport extends Node implements NamedDeclaration { + _declarationBrand: any; + readonly ast: AstNamespaceExport; + get parent(): ExportDeclaration; + get name(): ModuleExportName; } - interface NamespaceExportDeclaration extends DeclarationStatement, JSDocContainer { - readonly kind: SyntaxKind.NamespaceExportDeclaration; - readonly name: Identifier; + export class NamespaceExportDeclaration extends Node implements DeclarationStatement, JSDocContainer { + _declarationBrand: any; + _statementBrand: any; + _jsdocContainerBrand: any; + readonly ast: AstNamespaceExportDeclaration; + get name(): Identifier; } - interface ExportDeclaration extends DeclarationStatement, JSDocContainer { - readonly kind: SyntaxKind.ExportDeclaration; - readonly parent: SourceFile | ModuleBlock; - readonly modifiers?: NodeArray | undefined; - readonly isTypeOnly: boolean; - /** Will not be assigned in the case of `export * from "foo";` */ - readonly exportClause?: NamedExportBindings | undefined; - /** If this is not a StringLiteral it will be a grammar error. */ - readonly moduleSpecifier?: Expression | undefined; - /** @deprecated */ readonly assertClause?: AssertClause | undefined; - readonly attributes?: ImportAttributes | undefined; + export class ExportDeclaration extends Node implements DeclarationStatement, JSDocContainer { + _declarationBrand: any; + _statementBrand: any; + _jsdocContainerBrand: any; + readonly ast: AstExportDeclaration; + get parent(): SourceFile | ModuleBlock; + get modifiers(): NodeArray | undefined; + get isTypeOnly(): boolean; + get exportClause(): NamedExportBindings | undefined; + get moduleSpecifier(): Expression | undefined; + /** @deprecated */ + get assertClause(): ImportAttributes | undefined; + get attributes(): ImportAttributes | undefined; } - interface NamedImports extends Node { - readonly kind: SyntaxKind.NamedImports; - readonly parent: ImportClause; - readonly elements: NodeArray; + export class NamedImports extends Node { + readonly ast: AstNamedImports; + get parent(): ImportClause; + get elements(): NodeArray; } - interface NamedExports extends Node { - readonly kind: SyntaxKind.NamedExports; - readonly parent: ExportDeclaration; - readonly elements: NodeArray; + export class NamedExports extends Node { + readonly ast: AstNamedExports; + get parent(): ExportDeclaration; + get elements(): NodeArray; } - type NamedImportsOrExports = NamedImports | NamedExports; - interface ImportSpecifier extends NamedDeclaration { - readonly kind: SyntaxKind.ImportSpecifier; - readonly parent: NamedImports; - readonly propertyName?: ModuleExportName | undefined; - readonly name: Identifier; - readonly isTypeOnly: boolean; + export type NamedImportsOrExports = NamedImports | NamedExports; + export class ImportSpecifier extends Node implements NamedDeclaration { + _declarationBrand: any; + readonly ast: AstImportSpecifier; + get parent(): NamedImports; + get isTypeOnly(): boolean; + /** + * Name preceding "as" keyword (or undefined when "as" is absent) + */ + get propertyName(): ModuleExportName | undefined; + /** + * Declared name + */ + get name(): Identifier; } - interface ExportSpecifier extends NamedDeclaration, JSDocContainer { - readonly kind: SyntaxKind.ExportSpecifier; - readonly parent: NamedExports; - readonly isTypeOnly: boolean; - readonly propertyName?: ModuleExportName | undefined; - readonly name: ModuleExportName; + export class ExportSpecifier extends Node implements NamedDeclaration, JSDocContainer { + _declarationBrand: any; + _jsdocContainerBrand: any; + readonly ast: AstExportSpecifier; + get parent(): NamedExports; + get isTypeOnly(): boolean; + /** + * Name preceding "as" keyword (or undefined when "as" is absent) + */ + get propertyName(): ModuleExportName | undefined; + /** + * Declared name + */ + get name(): ModuleExportName; } - type ModuleExportName = Identifier | StringLiteral; - type ImportOrExportSpecifier = ImportSpecifier | ExportSpecifier; - type TypeOnlyCompatibleAliasDeclaration = ImportClause | ImportEqualsDeclaration | NamespaceImport | ImportOrExportSpecifier | ExportDeclaration | NamespaceExport; - type TypeOnlyImportDeclaration = + export type ModuleExportName = Identifier | StringLiteral; + export type ImportOrExportSpecifier = ImportSpecifier | ExportSpecifier; + export type TypeOnlyCompatibleAliasDeclaration = ImportClause | ImportEqualsDeclaration | NamespaceImport | ImportOrExportSpecifier | ExportDeclaration | NamespaceExport; + export type TypeOnlyImportDeclaration = | ImportClause & { readonly isTypeOnly: true; readonly name: Identifier; @@ -5569,7 +6312,7 @@ declare namespace ts { }; }; }); - type TypeOnlyExportDeclaration = + export type TypeOnlyExportDeclaration = | ExportSpecifier & ({ readonly isTypeOnly: true; @@ -5590,215 +6333,260 @@ declare namespace ts { readonly moduleSpecifier: Expression; }; }; - type TypeOnlyAliasDeclaration = TypeOnlyImportDeclaration | TypeOnlyExportDeclaration; + export type TypeOnlyAliasDeclaration = TypeOnlyImportDeclaration | TypeOnlyExportDeclaration; /** * This is either an `export =` or an `export default` declaration. * Unless `isExportEquals` is set, this node was parsed as an `export default`. */ - interface ExportAssignment extends DeclarationStatement, JSDocContainer { - readonly kind: SyntaxKind.ExportAssignment; - readonly parent: SourceFile; - readonly modifiers?: NodeArray | undefined; - readonly isExportEquals?: boolean | undefined; - readonly expression: Expression; + export class ExportAssignment extends Node implements DeclarationStatement, JSDocContainer { + _declarationBrand: any; + _statementBrand: any; + _jsdocContainerBrand: any; + readonly ast: AstExportAssignment; + get parent(): SourceFile; + get modifiers(): NodeArray | undefined; + get isExportEquals(): boolean | undefined; + get expression(): Expression; } - interface FileReference extends TextRange { + export interface FileReference extends TextRange { fileName: string; resolutionMode?: ResolutionMode; preserve?: boolean; } - interface CheckJsDirective extends TextRange { + export interface CheckJsDirective extends TextRange { enabled: boolean; } - type CommentKind = SyntaxKind.SingleLineCommentTrivia | SyntaxKind.MultiLineCommentTrivia; - interface CommentRange extends TextRange { + export type CommentKind = SyntaxKind.SingleLineCommentTrivia | SyntaxKind.MultiLineCommentTrivia; + export interface CommentRange extends TextRange { hasTrailingNewLine?: boolean; kind: CommentKind; } - interface SynthesizedComment extends CommentRange { + export interface SynthesizedComment extends CommentRange { text: string; pos: -1; end: -1; hasLeadingNewline?: boolean; } - interface JSDocTypeExpression extends TypeNode { - readonly kind: SyntaxKind.JSDocTypeExpression; - readonly type: TypeNode; + export class JSDocTypeExpression extends Node implements TypeNode { + _typeNodeBrand: any; + readonly ast: AstJSDocTypeExpression; + get type(): TypeNode; } - interface JSDocNameReference extends Node { - readonly kind: SyntaxKind.JSDocNameReference; - readonly name: EntityName | JSDocMemberName; + export class JSDocNameReference extends Node { + readonly ast: AstJSDocNameReference; + get name(): EntityName | JSDocMemberName; } /** Class#method reference in JSDoc */ - interface JSDocMemberName extends Node { - readonly kind: SyntaxKind.JSDocMemberName; - readonly left: EntityName | JSDocMemberName; - readonly right: Identifier; + export class JSDocMemberName extends Node { + readonly ast: AstJSDocMemberName; + get left(): EntityName | JSDocMemberName; + get right(): Identifier; } - interface JSDocType extends TypeNode { + export interface JSDocType extends TypeNode { _jsDocTypeBrand: any; } - interface JSDocAllType extends JSDocType { - readonly kind: SyntaxKind.JSDocAllType; + export class JSDocAllType extends Node implements JSDocType { + _jsDocTypeBrand: any; + _typeNodeBrand: any; + readonly ast: AstJSDocAllType; } - interface JSDocUnknownType extends JSDocType { - readonly kind: SyntaxKind.JSDocUnknownType; + export class JSDocUnknownType extends Node implements JSDocType { + _jsDocTypeBrand: any; + _typeNodeBrand: any; + readonly ast: AstJSDocUnknownType; } - interface JSDocNonNullableType extends JSDocType { - readonly kind: SyntaxKind.JSDocNonNullableType; - readonly type: TypeNode; - readonly postfix: boolean; + export class JSDocNonNullableType extends Node implements JSDocType { + _jsDocTypeBrand: any; + _typeNodeBrand: any; + readonly ast: AstJSDocNonNullableType; + get type(): TypeNode; + get postfix(): boolean; } - interface JSDocNullableType extends JSDocType { - readonly kind: SyntaxKind.JSDocNullableType; - readonly type: TypeNode; - readonly postfix: boolean; + export class JSDocNullableType extends Node implements JSDocType { + _jsDocTypeBrand: any; + _typeNodeBrand: any; + readonly ast: AstJSDocNullableType; + get type(): TypeNode; + get postfix(): boolean; } - interface JSDocOptionalType extends JSDocType { - readonly kind: SyntaxKind.JSDocOptionalType; - readonly type: TypeNode; + export class JSDocOptionalType extends Node implements JSDocType { + _jsDocTypeBrand: any; + _typeNodeBrand: any; + readonly ast: AstJSDocOptionalType; + get type(): TypeNode; } - interface JSDocFunctionType extends JSDocType, SignatureDeclarationBase, LocalsContainer { - readonly kind: SyntaxKind.JSDocFunctionType; + export class JSDocFunctionType extends Node implements JSDocType, SignatureDeclarationBase, LocalsContainer { + _signatureDeclarationBrand: any; + _jsDocTypeBrand: any; + _typeNodeBrand: any; + _declarationBrand: any; + _jsdocContainerBrand: any; + _localsContainerBrand: any; + readonly ast: AstJSDocFunctionType; + get typeParameters(): NodeArray | undefined; + get parameters(): NodeArray; + get type(): TypeNode | undefined; + get typeArguments(): NodeArray | undefined; } - interface JSDocVariadicType extends JSDocType { - readonly kind: SyntaxKind.JSDocVariadicType; - readonly type: TypeNode; + export class JSDocVariadicType extends Node implements JSDocType { + _jsDocTypeBrand: any; + _typeNodeBrand: any; + readonly ast: AstJSDocVariadicType; + get type(): TypeNode; } - interface JSDocNamepathType extends JSDocType { - readonly kind: SyntaxKind.JSDocNamepathType; - readonly type: TypeNode; + export class JSDocNamepathType extends Node implements JSDocType { + _jsDocTypeBrand: any; + _typeNodeBrand: any; + readonly ast: AstJSDocNamepathType; + get type(): TypeNode; } - type JSDocTypeReferencingNode = JSDocVariadicType | JSDocOptionalType | JSDocNullableType | JSDocNonNullableType; - interface JSDoc extends Node { - readonly kind: SyntaxKind.JSDoc; - readonly parent: HasJSDoc; - readonly tags?: NodeArray | undefined; - readonly comment?: string | NodeArray | undefined; + export type JSDocTypeReferencingNode = JSDocVariadicType | JSDocOptionalType | JSDocNullableType | JSDocNonNullableType; + export class JSDoc extends Node { + readonly ast: AstJSDoc; + get parent(): HasJSDoc; + get tags(): NodeArray | undefined; + get comment(): string | NodeArray | undefined; } - interface JSDocTag extends Node { - readonly parent: JSDoc | JSDocTypeLiteral; - readonly tagName: Identifier; - readonly comment?: string | NodeArray | undefined; + export class JSDocTag extends Node { + readonly ast: AstBaseJSDocTag; + get parent(): JSDoc | JSDocTypeLiteral; + get tagName(): Identifier; + get comment(): string | NodeArray | undefined; } - interface JSDocLink extends Node { - readonly kind: SyntaxKind.JSDocLink; - readonly name?: EntityName | JSDocMemberName | undefined; - text: string; + export class JSDocLink extends Node { + readonly ast: AstJSDocLink; + get name(): EntityName | JSDocMemberName | undefined; + get text(): string; } - interface JSDocLinkCode extends Node { - readonly kind: SyntaxKind.JSDocLinkCode; - readonly name?: EntityName | JSDocMemberName | undefined; - text: string; + export class JSDocLinkCode extends Node { + readonly ast: AstJSDocLinkCode; + get name(): EntityName | JSDocMemberName | undefined; + get text(): string; } - interface JSDocLinkPlain extends Node { - readonly kind: SyntaxKind.JSDocLinkPlain; - readonly name?: EntityName | JSDocMemberName | undefined; - text: string; + export class JSDocLinkPlain extends Node { + readonly ast: AstJSDocLinkPlain; + get name(): EntityName | JSDocMemberName | undefined; + get text(): string; } - type JSDocComment = JSDocText | JSDocLink | JSDocLinkCode | JSDocLinkPlain; - interface JSDocText extends Node { - readonly kind: SyntaxKind.JSDocText; - text: string; + export type JSDocComment = JSDocText | JSDocLink | JSDocLinkCode | JSDocLinkPlain; + export class JSDocText extends Node { + readonly ast: AstJSDocText; + get text(): string; } - interface JSDocUnknownTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocTag; + export class JSDocUnknownTag extends JSDocTag { + readonly ast: AstJSDocUnknownTag; } - interface JSDocClassReference extends ExpressionWithTypeArguments { + export interface JSDocClassReference extends ExpressionWithTypeArguments { + readonly ast: AstJSDocClassReference; + readonly data: AstJSDocClassReferenceData; readonly expression: Identifier | PropertyAccessEntityNameExpression; } /** * Note that `@extends` is a synonym of `@augments`. * Both tags are represented by this interface. */ - interface JSDocAugmentsTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocAugmentsTag; - readonly class: JSDocClassReference; + export class JSDocAugmentsTag extends JSDocTag { + readonly ast: AstJSDocAugmentsTag; + get class(): JSDocClassReference; } - interface JSDocImplementsTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocImplementsTag; - readonly class: JSDocClassReference; + export class JSDocImplementsTag extends JSDocTag { + readonly ast: AstJSDocImplementsTag; + get class(): JSDocClassReference; } - interface JSDocAuthorTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocAuthorTag; + export class JSDocAuthorTag extends JSDocTag { + readonly ast: AstJSDocAuthorTag; } - interface JSDocDeprecatedTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocDeprecatedTag; + export class JSDocDeprecatedTag extends JSDocTag { + readonly ast: AstJSDocDeprecatedTag; } - interface JSDocClassTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocClassTag; + export class JSDocClassTag extends JSDocTag { + readonly ast: AstJSDocClassTag; } - interface JSDocPublicTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocPublicTag; + export class JSDocPublicTag extends JSDocTag { + readonly ast: AstJSDocPublicTag; } - interface JSDocPrivateTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocPrivateTag; + export class JSDocPrivateTag extends JSDocTag { + readonly ast: AstJSDocPrivateTag; } - interface JSDocProtectedTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocProtectedTag; + export class JSDocProtectedTag extends JSDocTag { + readonly ast: AstJSDocProtectedTag; } - interface JSDocReadonlyTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocReadonlyTag; + export class JSDocReadonlyTag extends JSDocTag { + readonly ast: AstJSDocReadonlyTag; } - interface JSDocOverrideTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocOverrideTag; + export class JSDocOverrideTag extends JSDocTag { + readonly ast: AstJSDocOverrideTag; } - interface JSDocEnumTag extends JSDocTag, Declaration, LocalsContainer { - readonly kind: SyntaxKind.JSDocEnumTag; - readonly parent: JSDoc; - readonly typeExpression: JSDocTypeExpression; + export class JSDocEnumTag extends JSDocTag implements Declaration, LocalsContainer { + _declarationBrand: any; + _localsContainerBrand: any; + readonly ast: AstJSDocEnumTag; + get parent(): JSDoc; + get typeExpression(): JSDocTypeExpression; } - interface JSDocThisTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocThisTag; - readonly typeExpression: JSDocTypeExpression; + export class JSDocThisTag extends JSDocTag { + readonly ast: AstJSDocThisTag; + get typeExpression(): JSDocTypeExpression; } - interface JSDocTemplateTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocTemplateTag; - readonly constraint: JSDocTypeExpression | undefined; - readonly typeParameters: NodeArray; + export class JSDocTemplateTag extends JSDocTag { + readonly ast: AstJSDocTemplateTag; + get constraint(): JSDocTypeExpression | undefined; + get typeParameters(): NodeArray; } - interface JSDocSeeTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocSeeTag; - readonly name?: JSDocNameReference | undefined; + export class JSDocSeeTag extends JSDocTag { + readonly ast: AstJSDocSeeTag; + get name(): JSDocNameReference | undefined; } - interface JSDocReturnTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocReturnTag; - readonly typeExpression?: JSDocTypeExpression | undefined; + export class JSDocReturnTag extends JSDocTag { + readonly ast: AstJSDocReturnTag; + get typeExpression(): JSDocTypeExpression | undefined; } - interface JSDocTypeTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocTypeTag; - readonly typeExpression: JSDocTypeExpression; + export class JSDocTypeTag extends JSDocTag { + readonly ast: AstJSDocTypeTag; + get typeExpression(): JSDocTypeExpression; } - interface JSDocTypedefTag extends JSDocTag, NamedDeclaration, LocalsContainer { - readonly kind: SyntaxKind.JSDocTypedefTag; - readonly parent: JSDoc; - readonly fullName?: JSDocNamespaceDeclaration | Identifier | undefined; - readonly name?: Identifier | undefined; - readonly typeExpression?: JSDocTypeExpression | JSDocTypeLiteral | undefined; + export class JSDocTypedefTag extends JSDocTag implements Declaration, LocalsContainer { + _declarationBrand: any; + _localsContainerBrand: any; + readonly ast: AstJSDocTypedefTag; + get parent(): JSDoc; + get fullName(): Identifier | JSDocNamespaceDeclaration | undefined; + get name(): Identifier | undefined; + get typeExpression(): JSDocTypeLiteral | JSDocTypeExpression | undefined; } - interface JSDocCallbackTag extends JSDocTag, NamedDeclaration, LocalsContainer { - readonly kind: SyntaxKind.JSDocCallbackTag; - readonly parent: JSDoc; - readonly fullName?: JSDocNamespaceDeclaration | Identifier | undefined; - readonly name?: Identifier | undefined; - readonly typeExpression: JSDocSignature; + export class JSDocCallbackTag extends JSDocTag implements Declaration, LocalsContainer { + _declarationBrand: any; + _localsContainerBrand: any; + readonly ast: AstJSDocCallbackTag; + get parent(): JSDoc; + get fullName(): Identifier | JSDocNamespaceDeclaration | undefined; + get name(): Identifier | undefined; + get typeExpression(): JSDocSignature; } - interface JSDocOverloadTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocOverloadTag; - readonly parent: JSDoc; - readonly typeExpression: JSDocSignature; + export class JSDocOverloadTag extends JSDocTag { + readonly ast: AstJSDocOverloadTag; + get parent(): JSDoc; + get typeExpression(): JSDocSignature; } - interface JSDocThrowsTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocThrowsTag; - readonly typeExpression?: JSDocTypeExpression | undefined; + export class JSDocThrowsTag extends JSDocTag { + readonly ast: AstJSDocThrowsTag; + get typeExpression(): JSDocTypeExpression | undefined; } - interface JSDocSignature extends JSDocType, Declaration, JSDocContainer, LocalsContainer { - readonly kind: SyntaxKind.JSDocSignature; - readonly typeParameters?: readonly JSDocTemplateTag[] | undefined; - readonly parameters: readonly JSDocParameterTag[]; - readonly type: JSDocReturnTag | undefined; + export class JSDocSignature extends Node implements JSDocType, Declaration, JSDocContainer, LocalsContainer { + _jsDocTypeBrand: any; + _typeNodeBrand: any; + _declarationBrand: any; + _jsdocContainerBrand: any; + _localsContainerBrand: any; + _signatureDeclarationBrand: any; + readonly ast: AstJSDocSignature; + get typeParameters(): NodeArray | undefined; + get parameters(): NodeArray; + get type(): JSDocReturnTag | undefined; } - interface JSDocPropertyLikeTag extends JSDocTag, Declaration { + export interface JSDocPropertyLikeTag extends JSDocTag, Declaration { + readonly ast: AstJSDocPropertyLikeTag; + readonly data: AstJSDocTagData & AstDeclarationData; readonly parent: JSDoc; readonly name: EntityName; readonly typeExpression?: JSDocTypeExpression | undefined; @@ -5806,61 +6594,80 @@ declare namespace ts { readonly isNameFirst: boolean; readonly isBracketed: boolean; } - interface JSDocPropertyTag extends JSDocPropertyLikeTag { - readonly kind: SyntaxKind.JSDocPropertyTag; + export class JSDocPropertyTag extends JSDocTag implements JSDocPropertyLikeTag, Declaration { + _declarationBrand: any; + readonly ast: AstJSDocPropertyTag; + get parent(): JSDoc; + get name(): Identifier | QualifiedName; + get typeExpression(): JSDocTypeExpression | undefined; + /** Whether the property name came before the type -- non-standard for JSDoc, but Typescript-like */ + get isNameFirst(): boolean; + get isBracketed(): boolean; } - interface JSDocParameterTag extends JSDocPropertyLikeTag { - readonly kind: SyntaxKind.JSDocParameterTag; + export class JSDocParameterTag extends JSDocTag implements JSDocPropertyLikeTag { + _declarationBrand: any; + readonly ast: AstJSDocParameterTag; + get parent(): JSDoc; + get name(): Identifier | QualifiedName; + get typeExpression(): JSDocTypeExpression | undefined; + /** Whether the property name came before the type -- non-standard for JSDoc, but Typescript-like */ + get isNameFirst(): boolean; + get isBracketed(): boolean; } - interface JSDocTypeLiteral extends JSDocType, Declaration { - readonly kind: SyntaxKind.JSDocTypeLiteral; - readonly jsDocPropertyTags?: readonly JSDocPropertyLikeTag[] | undefined; + export class JSDocTypeLiteral extends Node implements JSDocType, Declaration { + _jsDocTypeBrand: any; + _typeNodeBrand: any; + _declarationBrand: any; + readonly ast: AstJSDocTypeLiteral; + get jsDocPropertyTags(): NodeArray | undefined; /** If true, then this type literal represents an *array* of its type. */ - readonly isArrayType: boolean; + get isArrayType(): boolean; } - interface JSDocSatisfiesTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocSatisfiesTag; - readonly typeExpression: JSDocTypeExpression; + export class JSDocSatisfiesTag extends JSDocTag { + readonly ast: AstJSDocSatisfiesTag; + get typeExpression(): JSDocTypeExpression; } - interface JSDocImportTag extends JSDocTag { - readonly kind: SyntaxKind.JSDocImportTag; - readonly parent: JSDoc; - readonly importClause?: ImportClause | undefined; - readonly moduleSpecifier: Expression; - readonly attributes?: ImportAttributes | undefined; + export class JSDocImportTag extends JSDocTag { + readonly ast: AstJSDocImportTag; + get parent(): JSDoc; + get importClause(): ImportClause | undefined; + get moduleSpecifier(): Expression; + get attributes(): ImportAttributes | undefined; } - type FlowType = Type | IncompleteType; - interface IncompleteType { + export type FlowType = Type | IncompleteType; + export interface IncompleteType { flags: TypeFlags | 0; type: Type; } - interface AmdDependency { + export interface AmdDependency { path: string; name?: string; } /** * Subset of properties from SourceFile that are used in multiple utility functions */ - interface SourceFileLike { + export interface SourceFileLike { readonly text: string; } - interface SourceFileLike { + export interface SourceFileLike { getLineAndCharacterOfPosition(pos: number): LineAndCharacter; } - type ResolutionMode = ModuleKind.ESNext | ModuleKind.CommonJS | undefined; - interface SourceFile extends Declaration, LocalsContainer { - readonly kind: SyntaxKind.SourceFile; - readonly statements: NodeArray; - readonly endOfFileToken: Token; - fileName: string; - text: string; - amdDependencies: readonly AmdDependency[]; - moduleName?: string | undefined; - referencedFiles: readonly FileReference[]; - typeReferenceDirectives: readonly FileReference[]; - libReferenceDirectives: readonly FileReference[]; - languageVariant: LanguageVariant; - isDeclarationFile: boolean; + export type ResolutionMode = ModuleKind.ESNext | ModuleKind.CommonJS | undefined; + export class SourceFile extends Node implements Declaration, LocalsContainer, ReadonlyPragmaContext { + _declarationBrand: any; + _localsContainerBrand: any; + readonly ast: AstSourceFile; + get statements(): NodeArray; + get endOfFileToken(): EndOfFileToken; + get fileName(): string; + get text(): string; + get amdDependencies(): AmdDependency[]; + get moduleName(): string | undefined; + get referencedFiles(): readonly FileReference[]; + get typeReferenceDirectives(): readonly FileReference[]; + get libReferenceDirectives(): readonly FileReference[]; + get languageVariant(): LanguageVariant; + get isDeclarationFile(): boolean; /** * lib.d.ts should have a reference comment like * @@ -5869,8 +6676,8 @@ declare namespace ts { * If any other file has this comment, it signals not to include lib.d.ts * because this containing file is intended to act as a default library. */ - hasNoDefaultLib: boolean; - languageVersion: ScriptTarget; + get hasNoDefaultLib(): boolean; + get languageVersion(): ScriptTarget; /** * When `module` is `Node16` or `NodeNext`, this field controls whether the * source file in question is an ESNext-output-format file, or a CommonJS-output-format @@ -5888,40 +6695,73 @@ declare namespace ts { * of `node`). If so, this field will be unset and source files will be considered to be * CommonJS-output-format by the node module transformer and type checker, regardless of extension or context. */ - impliedNodeFormat?: ResolutionMode | undefined; - } - interface SourceFile { - getLineAndCharacterOfPosition(pos: number): LineAndCharacter; - getLineEndOfPosition(pos: number): number; + get impliedNodeFormat(): ResolutionMode; + update(newText: string, textChangeRange: TextChangeRange): SourceFile; + getLineAndCharacterOfPosition(position: number): LineAndCharacter; getLineStarts(): readonly number[]; getPositionOfLineAndCharacter(line: number, character: number): number; - update(newText: string, textChangeRange: TextChangeRange): SourceFile; + getLineEndOfPosition(pos: number): number; } - interface Bundle extends Node { - readonly kind: SyntaxKind.Bundle; - readonly sourceFiles: readonly SourceFile[]; + /** + * Represents an immutable snapshot of a script at a specified time.Once acquired, the + * snapshot is observably immutable. i.e. the same calls with the same parameters will return + * the same values. + */ + export interface IScriptSnapshot { + /** Gets a portion of the script snapshot specified by [start, end). */ + getText(start: number, end: number): string; + /** Gets the length of this script snapshot. */ + getLength(): number; + /** + * Gets the TextChangeRange that describe how the text changed between this text and + * an older version. This information is used by the incremental parser to determine + * what sections of the script need to be re-parsed. 'undefined' can be returned if the + * change range cannot be determined. However, in that case, incremental parsing will + * not happen and the entire document will be re - parsed. + */ + getChangeRange(oldSnapshot: IScriptSnapshot): TextChangeRange | undefined; + /** Releases all resources held by this script snapshot */ + dispose?(): void; } - interface JsonSourceFile extends SourceFile { + export interface ReadonlyPragmaContext { + readonly languageVersion: ScriptTarget; + readonly referencedFiles: readonly FileReference[]; + readonly typeReferenceDirectives: readonly FileReference[]; + readonly libReferenceDirectives: readonly FileReference[]; + readonly amdDependencies: readonly AmdDependency[]; + readonly hasNoDefaultLib?: boolean | undefined; + } + export class Bundle extends Node { + readonly ast: AstBundle; + get sourceFiles(): readonly SourceFile[]; + } + export interface JsonSourceFile extends SourceFile { + readonly ast: AstJsonSourceFile; + readonly data: AstJsonSourceFileData; readonly statements: NodeArray; } - interface TsConfigSourceFile extends JsonSourceFile { - extendedSourceFiles?: string[]; + export interface TsConfigSourceFile extends JsonSourceFile { + extendedSourceFiles: string[] | undefined; } - interface JsonMinusNumericLiteral extends PrefixUnaryExpression { + export interface JsonMinusNumericLiteral extends PrefixUnaryExpression { + readonly ast: AstJsonMinusNumericLiteral; + readonly data: AstJsonMinusNumericLiteralData; readonly operator: SyntaxKind.MinusToken; readonly operand: NumericLiteral; } - type JsonObjectExpression = ObjectLiteralExpression | ArrayLiteralExpression | JsonMinusNumericLiteral | NumericLiteral | StringLiteral | BooleanLiteral | NullLiteral; - interface JsonObjectExpressionStatement extends ExpressionStatement { + export type JsonObjectExpression = ObjectLiteralExpression | ArrayLiteralExpression | JsonMinusNumericLiteral | NumericLiteral | StringLiteral | BooleanLiteral | NullLiteral; + export interface JsonObjectExpressionStatement extends ExpressionStatement { + readonly ast: AstJsonObjectExpressionStatement; + readonly data: AstJsonObjectExpressionStatementData; readonly expression: JsonObjectExpression; } - interface ScriptReferenceHost { + export interface ScriptReferenceHost { getCompilerOptions(): CompilerOptions; getSourceFile(fileName: string): SourceFile | undefined; getSourceFileByPath(path: Path): SourceFile | undefined; getCurrentDirectory(): string; } - interface ParseConfigHost extends ModuleResolutionHost { + export interface ParseConfigHost extends ModuleResolutionHost { useCaseSensitiveFileNames: boolean; readDirectory(rootDir: string, extensions: readonly string[], excludes: readonly string[] | undefined, includes: readonly string[], depth?: number): readonly string[]; /** @@ -5937,20 +6777,20 @@ declare namespace ts { * specified like "./blah" to an absolute path to an actual * tsconfig file, e.g. "/root/blah/tsconfig.json" */ - type ResolvedConfigFileName = string & { + export type ResolvedConfigFileName = string & { _isResolvedConfigFileName: never; }; - interface WriteFileCallbackData { + export interface WriteFileCallbackData { } - type WriteFileCallback = (fileName: string, text: string, writeByteOrderMark: boolean, onError?: (message: string) => void, sourceFiles?: readonly SourceFile[], data?: WriteFileCallbackData) => void; - class OperationCanceledException { + export type WriteFileCallback = (fileName: string, text: string, writeByteOrderMark: boolean, onError?: (message: string) => void, sourceFiles?: readonly SourceFile[], data?: WriteFileCallbackData) => void; + export class OperationCanceledException { } - interface CancellationToken { + export interface CancellationToken { isCancellationRequested(): boolean; /** @throws OperationCanceledException if isCancellationRequested is true */ throwIfCancellationRequested(): void; } - interface Program extends ScriptReferenceHost { + export interface Program extends ScriptReferenceHost { getCurrentDirectory(): string; /** * Get a list of root file names that were passed to a 'createProgram' @@ -6062,17 +6902,17 @@ declare namespace ts { getProjectReferences(): readonly ProjectReference[] | undefined; getResolvedProjectReferences(): readonly (ResolvedProjectReference | undefined)[] | undefined; } - interface ResolvedProjectReference { + export interface ResolvedProjectReference { commandLine: ParsedCommandLine; sourceFile: SourceFile; references?: readonly (ResolvedProjectReference | undefined)[]; } - type CustomTransformerFactory = (context: TransformationContext) => CustomTransformer; - interface CustomTransformer { + export type CustomTransformerFactory = (context: TransformationContext) => CustomTransformer; + export interface CustomTransformer { transformSourceFile(node: SourceFile): SourceFile; transformBundle(node: Bundle): Bundle; } - interface CustomTransformers { + export interface CustomTransformers { /** Custom transformers to evaluate before built-in .js transformations. */ before?: (TransformerFactory | CustomTransformerFactory)[]; /** Custom transformers to evaluate after built-in .js transformations. */ @@ -6080,7 +6920,7 @@ declare namespace ts { /** Custom transformers to evaluate after built-in .d.ts transformations. */ afterDeclarations?: (TransformerFactory | CustomTransformerFactory)[]; } - interface SourceMapSpan { + export interface SourceMapSpan { /** Line number in the .js file. */ emittedLine: number; /** Column number in the .js file. */ @@ -6095,20 +6935,20 @@ declare namespace ts { sourceIndex: number; } /** Return code used by getEmitOutput function to indicate status of the function */ - enum ExitStatus { + export enum ExitStatus { Success = 0, DiagnosticsPresent_OutputsSkipped = 1, DiagnosticsPresent_OutputsGenerated = 2, InvalidProject_OutputsSkipped = 3, ProjectReferenceCycle_OutputsSkipped = 4, } - interface EmitResult { + export interface EmitResult { emitSkipped: boolean; /** Contains declaration emit diagnostics */ diagnostics: readonly Diagnostic[]; emittedFiles?: string[]; } - interface TypeChecker { + export interface TypeChecker { getTypeOfSymbolAtLocation(symbol: Symbol, node: Node): Type; getTypeOfSymbol(symbol: Symbol): Type; getDeclaredTypeOfSymbol(symbol: Symbol): Type; @@ -6298,7 +7138,7 @@ declare namespace ts { */ runWithCancellationToken(token: CancellationToken, cb: (checker: TypeChecker) => T): T; } - enum NodeBuilderFlags { + export enum NodeBuilderFlags { None = 0, NoTruncation = 1, WriteArrayAsGenericType = 2, @@ -6331,7 +7171,7 @@ declare namespace ts { InTypeAlias = 8388608, InInitialEntityName = 16777216, } - enum TypeFormatFlags { + export enum TypeFormatFlags { None = 0, NoTruncation = 1, WriteArrayAsGenericType = 2, @@ -6357,49 +7197,49 @@ declare namespace ts { InTypeAlias = 8388608, NodeBuilderFlagsMask = 848330095, } - enum SymbolFormatFlags { + export enum SymbolFormatFlags { None = 0, WriteTypeParametersOrArguments = 1, UseOnlyExternalAliasing = 2, AllowAnyNodeKind = 4, UseAliasDefinedOutsideCurrentScope = 8, } - enum TypePredicateKind { + export enum TypePredicateKind { This = 0, Identifier = 1, AssertsThis = 2, AssertsIdentifier = 3, } - interface TypePredicateBase { + export interface TypePredicateBase { kind: TypePredicateKind; type: Type | undefined; } - interface ThisTypePredicate extends TypePredicateBase { + export interface ThisTypePredicate extends TypePredicateBase { kind: TypePredicateKind.This; parameterName: undefined; parameterIndex: undefined; type: Type; } - interface IdentifierTypePredicate extends TypePredicateBase { + export interface IdentifierTypePredicate extends TypePredicateBase { kind: TypePredicateKind.Identifier; parameterName: string; parameterIndex: number; type: Type; } - interface AssertsThisTypePredicate extends TypePredicateBase { + export interface AssertsThisTypePredicate extends TypePredicateBase { kind: TypePredicateKind.AssertsThis; parameterName: undefined; parameterIndex: undefined; type: Type | undefined; } - interface AssertsIdentifierTypePredicate extends TypePredicateBase { + export interface AssertsIdentifierTypePredicate extends TypePredicateBase { kind: TypePredicateKind.AssertsIdentifier; parameterName: string; parameterIndex: number; type: Type | undefined; } - type TypePredicate = ThisTypePredicate | IdentifierTypePredicate | AssertsThisTypePredicate | AssertsIdentifierTypePredicate; - enum SymbolFlags { + export type TypePredicate = ThisTypePredicate | IdentifierTypePredicate | AssertsThisTypePredicate | AssertsIdentifierTypePredicate; + export enum SymbolFlags { None = 0, FunctionScopedVariable = 1, BlockScopedVariable = 2, @@ -6462,7 +7302,7 @@ declare namespace ts { PropertyOrAccessor = 98308, ClassMember = 106500, } - interface Symbol { + export interface Symbol { flags: SymbolFlags; escapedName: __String; declarations?: Declaration[]; @@ -6471,7 +7311,7 @@ declare namespace ts { exports?: SymbolTable; globalExports?: SymbolTable; } - interface Symbol { + export interface Symbol { readonly name: string; getFlags(): SymbolFlags; getEscapedName(): __String; @@ -6480,7 +7320,7 @@ declare namespace ts { getDocumentationComment(typeChecker: TypeChecker | undefined): SymbolDisplayPart[]; getJsDocTags(checker?: TypeChecker): JSDocTagInfo[]; } - enum InternalSymbolName { + export enum InternalSymbolName { Call = "__call", Constructor = "__constructor", New = "__new", @@ -6509,7 +7349,7 @@ declare namespace ts { * with a normal string (which is good, it cannot be misused on assignment or on usage), * while still being comparable with a normal string via === (also good) and castable from a string. */ - type __String = + export type __String = | (string & { __escapedIdentifier: void; }) @@ -6518,12 +7358,12 @@ declare namespace ts { }) | InternalSymbolName; /** @deprecated Use ReadonlyMap<__String, T> instead. */ - type ReadonlyUnderscoreEscapedMap = ReadonlyMap<__String, T>; + export type ReadonlyUnderscoreEscapedMap = ReadonlyMap<__String, T>; /** @deprecated Use Map<__String, T> instead. */ - type UnderscoreEscapedMap = Map<__String, T>; + export type UnderscoreEscapedMap = Map<__String, T>; /** SymbolTable based on ES6 Map interface. */ - type SymbolTable = Map<__String, Symbol>; - enum TypeFlags { + export type SymbolTable = Map<__String, Symbol>; + export enum TypeFlags { Any = 1, Unknown = 2, String = 4, @@ -6574,15 +7414,15 @@ declare namespace ts { StructuredOrInstantiable = 469499904, Narrowable = 536624127, } - type DestructuringPattern = BindingPattern | ObjectLiteralExpression | ArrayLiteralExpression; - interface Type { + export type DestructuringPattern = BindingPattern | ObjectLiteralExpression | ArrayLiteralExpression; + export interface Type { flags: TypeFlags; symbol: Symbol; pattern?: DestructuringPattern; aliasSymbol?: Symbol; aliasTypeArguments?: readonly Type[]; } - interface Type { + export interface Type { getFlags(): TypeFlags; getSymbol(): Symbol | undefined; getProperties(): Symbol[]; @@ -6607,29 +7447,29 @@ declare namespace ts { isClass(): this is InterfaceType; isIndexType(): this is IndexType; } - interface FreshableType extends Type { + export interface FreshableType extends Type { freshType: FreshableType; regularType: FreshableType; } - interface LiteralType extends FreshableType { + export interface LiteralType extends FreshableType { value: string | number | PseudoBigInt; } - interface UniqueESSymbolType extends Type { + export interface UniqueESSymbolType extends Type { symbol: Symbol; escapedName: __String; } - interface StringLiteralType extends LiteralType { + export interface StringLiteralType extends LiteralType { value: string; } - interface NumberLiteralType extends LiteralType { + export interface NumberLiteralType extends LiteralType { value: number; } - interface BigIntLiteralType extends LiteralType { + export interface BigIntLiteralType extends LiteralType { value: PseudoBigInt; } - interface EnumType extends FreshableType { + export interface EnumType extends FreshableType { } - enum ObjectFlags { + export enum ObjectFlags { None = 0, Class = 1, Interface = 2, @@ -6652,18 +7492,18 @@ declare namespace ts { InstantiationExpressionType = 8388608, SingleSignatureType = 134217728, } - interface ObjectType extends Type { + export interface ObjectType extends Type { objectFlags: ObjectFlags; } /** Class and interface types (ObjectFlags.Class and ObjectFlags.Interface). */ - interface InterfaceType extends ObjectType { + export interface InterfaceType extends ObjectType { typeParameters: TypeParameter[] | undefined; outerTypeParameters: TypeParameter[] | undefined; localTypeParameters: TypeParameter[] | undefined; thisType: TypeParameter | undefined; } - type BaseType = ObjectType | IntersectionType | TypeVariable; - interface InterfaceTypeWithDeclaredMembers extends InterfaceType { + export type BaseType = ObjectType | IntersectionType | TypeVariable; + export interface InterfaceTypeWithDeclaredMembers extends InterfaceType { declaredProperties: Symbol[]; declaredCallSignatures: Signature[]; declaredConstructSignatures: Signature[]; @@ -6679,18 +7519,18 @@ declare namespace ts { * if the class or interface has no type parameters and the reference isn't specifying an * explicit "this" argument. */ - interface TypeReference extends ObjectType { + export interface TypeReference extends ObjectType { target: GenericType; node?: TypeReferenceNode | ArrayTypeNode | TupleTypeNode; } - interface TypeReference { + export interface TypeReference { typeArguments?: readonly Type[]; } - interface DeferredTypeReference extends TypeReference { + export interface DeferredTypeReference extends TypeReference { } - interface GenericType extends InterfaceType, TypeReference { + export interface GenericType extends InterfaceType, TypeReference { } - enum ElementFlags { + export enum ElementFlags { Required = 1, Optional = 2, Rest = 4, @@ -6700,7 +7540,7 @@ declare namespace ts { NonRequired = 14, NonRest = 11, } - interface TupleType extends GenericType { + export interface TupleType extends GenericType { elementFlags: readonly ElementFlags[]; /** Number of required or variadic elements */ minLength: number; @@ -6716,37 +7556,37 @@ declare namespace ts { readonly: boolean; labeledElementDeclarations?: readonly (NamedTupleMember | ParameterDeclaration | undefined)[]; } - interface TupleTypeReference extends TypeReference { + export interface TupleTypeReference extends TypeReference { target: TupleType; } - interface UnionOrIntersectionType extends Type { + export interface UnionOrIntersectionType extends Type { types: Type[]; } - interface UnionType extends UnionOrIntersectionType { + export interface UnionType extends UnionOrIntersectionType { } - interface IntersectionType extends UnionOrIntersectionType { + export interface IntersectionType extends UnionOrIntersectionType { } - type StructuredType = ObjectType | UnionType | IntersectionType; - interface EvolvingArrayType extends ObjectType { + export type StructuredType = ObjectType | UnionType | IntersectionType; + export interface EvolvingArrayType extends ObjectType { elementType: Type; finalArrayType?: Type; } - interface InstantiableType extends Type { + export interface InstantiableType extends Type { } - interface TypeParameter extends InstantiableType { + export interface TypeParameter extends InstantiableType { } - interface IndexedAccessType extends InstantiableType { + export interface IndexedAccessType extends InstantiableType { objectType: Type; indexType: Type; constraint?: Type; simplifiedForReading?: Type; simplifiedForWriting?: Type; } - type TypeVariable = TypeParameter | IndexedAccessType; - interface IndexType extends InstantiableType { + export type TypeVariable = TypeParameter | IndexedAccessType; + export interface IndexType extends InstantiableType { type: InstantiableType | UnionOrIntersectionType; } - interface ConditionalRoot { + export interface ConditionalRoot { node: ConditionalTypeNode; checkType: Type; extendsType: Type; @@ -6757,37 +7597,37 @@ declare namespace ts { aliasSymbol?: Symbol; aliasTypeArguments?: Type[]; } - interface ConditionalType extends InstantiableType { + export interface ConditionalType extends InstantiableType { root: ConditionalRoot; checkType: Type; extendsType: Type; resolvedTrueType?: Type; resolvedFalseType?: Type; } - interface TemplateLiteralType extends InstantiableType { + export interface TemplateLiteralType extends InstantiableType { texts: readonly string[]; types: readonly Type[]; } - interface StringMappingType extends InstantiableType { + export interface StringMappingType extends InstantiableType { symbol: Symbol; type: Type; } - interface SubstitutionType extends InstantiableType { + export interface SubstitutionType extends InstantiableType { objectFlags: ObjectFlags; baseType: Type; constraint: Type; } - enum SignatureKind { + export enum SignatureKind { Call = 0, Construct = 1, } - interface Signature { + export interface Signature { declaration?: SignatureDeclaration | JSDocSignature; typeParameters?: readonly TypeParameter[]; parameters: readonly Symbol[]; thisParameter?: Symbol; } - interface Signature { + export interface Signature { getDeclaration(): SignatureDeclaration; getTypeParameters(): TypeParameter[] | undefined; getParameters(): Symbol[]; @@ -6796,17 +7636,17 @@ declare namespace ts { getDocumentationComment(typeChecker: TypeChecker | undefined): SymbolDisplayPart[]; getJsDocTags(): JSDocTagInfo[]; } - enum IndexKind { + export enum IndexKind { String = 0, Number = 1, } - interface IndexInfo { + export interface IndexInfo { keyType: Type; type: Type; isReadonly: boolean; declaration?: IndexSignatureDeclaration; } - enum InferencePriority { + export enum InferencePriority { None = 0, NakedTypeVariable = 1, SpeculativeTuple = 2, @@ -6823,12 +7663,12 @@ declare namespace ts { PriorityImpliesCombination = 416, Circularity = -1, } - interface FileExtensionInfo { + export interface FileExtensionInfo { extension: string; isMixedContent: boolean; scriptKind?: ScriptKind; } - interface DiagnosticMessage { + export interface DiagnosticMessage { key: string; category: DiagnosticCategory; code: number; @@ -6842,20 +7682,20 @@ declare namespace ts { * While it seems that DiagnosticMessageChain is structurally similar to DiagnosticMessage, * the difference is that messages are all preformatted in DMC. */ - interface DiagnosticMessageChain { + export interface DiagnosticMessageChain { messageText: string; category: DiagnosticCategory; code: number; next?: DiagnosticMessageChain[]; } - interface Diagnostic extends DiagnosticRelatedInformation { + export interface Diagnostic extends DiagnosticRelatedInformation { /** May store more in future. For now, this will simply be `true` to indicate when a diagnostic is an unused-identifier diagnostic. */ reportsUnnecessary?: {}; reportsDeprecated?: {}; source?: string; relatedInformation?: DiagnosticRelatedInformation[]; } - interface DiagnosticRelatedInformation { + export interface DiagnosticRelatedInformation { category: DiagnosticCategory; code: number; file: SourceFile | undefined; @@ -6863,18 +7703,18 @@ declare namespace ts { length: number | undefined; messageText: string | DiagnosticMessageChain; } - interface DiagnosticWithLocation extends Diagnostic { + export interface DiagnosticWithLocation extends Diagnostic { file: SourceFile; start: number; length: number; } - enum DiagnosticCategory { + export enum DiagnosticCategory { Warning = 0, Error = 1, Suggestion = 2, Message = 3, } - enum ModuleResolutionKind { + export enum ModuleResolutionKind { Classic = 1, /** * @deprecated @@ -6887,7 +7727,7 @@ declare namespace ts { NodeNext = 99, Bundler = 100, } - enum ModuleDetectionKind { + export enum ModuleDetectionKind { /** * Files with imports, exports and/or import.meta are considered modules */ @@ -6901,10 +7741,10 @@ declare namespace ts { */ Force = 3, } - interface PluginImport { + export interface PluginImport { name: string; } - interface ProjectReference { + export interface ProjectReference { /** A normalized path on disk */ path: string; /** The path as the user originally wrote it */ @@ -6914,7 +7754,7 @@ declare namespace ts { /** True if it is intended that this reference form a circularity */ circular?: boolean; } - enum WatchFileKind { + export enum WatchFileKind { FixedPollingInterval = 0, PriorityPollingInterval = 1, DynamicPriorityPolling = 2, @@ -6922,20 +7762,20 @@ declare namespace ts { UseFsEvents = 4, UseFsEventsOnParentDirectory = 5, } - enum WatchDirectoryKind { + export enum WatchDirectoryKind { UseFsEvents = 0, FixedPollingInterval = 1, DynamicPriorityPolling = 2, FixedChunkSizePolling = 3, } - enum PollingWatchKind { + export enum PollingWatchKind { FixedInterval = 0, PriorityInterval = 1, DynamicPriority = 2, FixedChunkSize = 3, } - type CompilerOptionsValue = string | number | boolean | (string | number)[] | string[] | MapLike | PluginImport[] | ProjectReference[] | null | undefined; - interface CompilerOptions { + export type CompilerOptionsValue = string | number | boolean | (string | number)[] | string[] | MapLike | PluginImport[] | ProjectReference[] | null | undefined; + export interface CompilerOptions { allowImportingTsExtensions?: boolean; allowJs?: boolean; allowArbitraryExtensions?: boolean; @@ -7053,7 +7893,7 @@ declare namespace ts { useDefineForClassFields?: boolean; [option: string]: CompilerOptionsValue | TsConfigSourceFile | undefined; } - interface WatchOptions { + export interface WatchOptions { watchFile?: WatchFileKind; watchDirectory?: WatchDirectoryKind; fallbackPolling?: PollingWatchKind; @@ -7062,14 +7902,14 @@ declare namespace ts { excludeFiles?: string[]; [option: string]: CompilerOptionsValue | undefined; } - interface TypeAcquisition { + export interface TypeAcquisition { enable?: boolean; include?: string[]; exclude?: string[]; disableFilenameBasedTypeAcquisition?: boolean; [option: string]: CompilerOptionsValue | undefined; } - enum ModuleKind { + export enum ModuleKind { None = 0, CommonJS = 1, AMD = 2, @@ -7083,7 +7923,7 @@ declare namespace ts { NodeNext = 199, Preserve = 200, } - enum JsxEmit { + export enum JsxEmit { None = 0, Preserve = 1, React = 2, @@ -7092,21 +7932,21 @@ declare namespace ts { ReactJSXDev = 5, } /** @deprecated */ - enum ImportsNotUsedAsValues { + export enum ImportsNotUsedAsValues { Remove = 0, Preserve = 1, Error = 2, } - enum NewLineKind { + export enum NewLineKind { CarriageReturnLineFeed = 0, LineFeed = 1, } - interface LineAndCharacter { + export interface LineAndCharacter { /** 0-based. */ line: number; character: number; } - enum ScriptKind { + export enum ScriptKind { Unknown = 0, JS = 1, JSX = 2, @@ -7120,7 +7960,7 @@ declare namespace ts { */ Deferred = 7, } - enum ScriptTarget { + export enum ScriptTarget { /** @deprecated */ ES3 = 0, ES5 = 1, @@ -7137,12 +7977,12 @@ declare namespace ts { JSON = 100, Latest = 99, } - enum LanguageVariant { + export enum LanguageVariant { Standard = 0, JSX = 1, } /** Either a parsed command line or a parsed tsconfig.json */ - interface ParsedCommandLine { + export interface ParsedCommandLine { options: CompilerOptions; typeAcquisition?: TypeAcquisition; fileNames: string[]; @@ -7153,11 +7993,11 @@ declare namespace ts { wildcardDirectories?: MapLike; compileOnSave?: boolean; } - enum WatchDirectoryFlags { + export enum WatchDirectoryFlags { None = 0, Recursive = 1, } - interface CreateProgramOptions { + export interface CreateProgramOptions { rootNames: readonly string[]; options: CompilerOptions; projectReferences?: readonly ProjectReference[]; @@ -7165,7 +8005,7 @@ declare namespace ts { oldProgram?: Program; configFileParsingDiagnostics?: readonly Diagnostic[]; } - interface ModuleResolutionHost { + export interface ModuleResolutionHost { fileExists(fileName: string): boolean; readFile(fileName: string): string | undefined; trace?(s: string): void; @@ -7182,7 +8022,7 @@ declare namespace ts { /** * Used by services to specify the minimum host area required to set up source files under any compilation settings */ - interface MinimalResolutionCacheHost extends ModuleResolutionHost { + export interface MinimalResolutionCacheHost extends ModuleResolutionHost { getCompilationSettings(): CompilerOptions; getCompilerHost?(): CompilerHost | undefined; } @@ -7193,7 +8033,7 @@ declare namespace ts { * * Prefer to return a `ResolvedModuleFull` so that the file type does not have to be inferred. */ - interface ResolvedModule { + export interface ResolvedModule { /** Path of the file the module was resolved to. */ resolvedFileName: string; /** True if `resolvedFileName` comes from `node_modules`. */ @@ -7209,7 +8049,7 @@ declare namespace ts { * Prefer this over `ResolvedModule`. * If changing this, remember to change `moduleResolutionIsEqualTo`. */ - interface ResolvedModuleFull extends ResolvedModule { + export interface ResolvedModuleFull extends ResolvedModule { /** * Extension of resolvedFileName. This must match what's at the end of resolvedFileName. * This is optional for backwards-compatibility, but will be added if not provided. @@ -7221,7 +8061,7 @@ declare namespace ts { * Unique identifier with a package name and version. * If changing this, remember to change `packageIdIsEqual`. */ - interface PackageId { + export interface PackageId { /** * Name of the package. * Should not include `@types`. @@ -7236,7 +8076,7 @@ declare namespace ts { /** Version of the package, e.g. "1.2.3" */ version: string; } - enum Extension { + export enum Extension { Ts = ".ts", Tsx = ".tsx", Dts = ".d.ts", @@ -7251,20 +8091,20 @@ declare namespace ts { Cts = ".cts", Dcts = ".d.cts", } - interface ResolvedModuleWithFailedLookupLocations { + export interface ResolvedModuleWithFailedLookupLocations { readonly resolvedModule: ResolvedModuleFull | undefined; } - interface ResolvedTypeReferenceDirective { + export interface ResolvedTypeReferenceDirective { primary: boolean; resolvedFileName: string | undefined; packageId?: PackageId; /** True if `resolvedFileName` comes from `node_modules`. */ isExternalLibraryImport?: boolean; } - interface ResolvedTypeReferenceDirectiveWithFailedLookupLocations { + export interface ResolvedTypeReferenceDirectiveWithFailedLookupLocations { readonly resolvedTypeReferenceDirective: ResolvedTypeReferenceDirective | undefined; } - interface CompilerHost extends ModuleResolutionHost { + export interface CompilerHost extends ModuleResolutionHost { getSourceFile(fileName: string, languageVersionOrOptions: ScriptTarget | CreateSourceFileOptions, onError?: (message: string) => void, shouldCreateNewSourceFile?: boolean): SourceFile | undefined; getSourceFileByPath?(fileName: string, path: Path, languageVersionOrOptions: ScriptTarget | CreateSourceFileOptions, onError?: (message: string) => void, shouldCreateNewSourceFile?: boolean): SourceFile | undefined; getCancellationToken?(): CancellationToken; @@ -7297,18 +8137,18 @@ declare namespace ts { getParsedCommandLine?(fileName: string): ParsedCommandLine | undefined; jsDocParsingMode?: JSDocParsingMode; } - interface SourceMapRange extends TextRange { + export interface SourceMapRange extends TextRange { source?: SourceMapSource; } - interface SourceMapSource { + export interface SourceMapSource { fileName: string; text: string; skipTrivia?: (pos: number) => number; } - interface SourceMapSource { + export interface SourceMapSource { getLineAndCharacterOfPosition(pos: number): LineAndCharacter; } - enum EmitFlags { + export enum EmitFlags { None = 0, SingleLine = 1, MultiLine = 2, @@ -7339,23 +8179,23 @@ declare namespace ts { Iterator = 8388608, NoAsciiEscaping = 16777216, } - interface EmitHelperBase { + export interface EmitHelperBase { readonly name: string; readonly scoped: boolean; readonly text: string | ((node: EmitHelperUniqueNameCallback) => string); readonly priority?: number; readonly dependencies?: EmitHelper[]; } - interface ScopedEmitHelper extends EmitHelperBase { + export interface ScopedEmitHelper extends EmitHelperBase { readonly scoped: true; } - interface UnscopedEmitHelper extends EmitHelperBase { + export interface UnscopedEmitHelper extends EmitHelperBase { readonly scoped: false; readonly text: string; } - type EmitHelper = ScopedEmitHelper | UnscopedEmitHelper; - type EmitHelperUniqueNameCallback = (name: string) => string; - enum EmitHint { + export type EmitHelper = ScopedEmitHelper | UnscopedEmitHelper; + export type EmitHelperUniqueNameCallback = (name: string) => string; + export enum EmitHint { SourceFile = 0, Expression = 1, IdentifierName = 2, @@ -7365,7 +8205,7 @@ declare namespace ts { JsxAttributeValue = 6, ImportTypeNodeAttributes = 7, } - enum OuterExpressionKinds { + export enum OuterExpressionKinds { Parentheses = 1, TypeAssertions = 2, NonNullAssertions = 4, @@ -7375,15 +8215,15 @@ declare namespace ts { All = 31, ExcludeJSDocTypeAssertion = -2147483648, } - type ImmediatelyInvokedFunctionExpression = CallExpression & { + export type ImmediatelyInvokedFunctionExpression = CallExpression & { readonly expression: FunctionExpression; }; - type ImmediatelyInvokedArrowFunction = CallExpression & { + export type ImmediatelyInvokedArrowFunction = CallExpression & { readonly expression: ParenthesizedExpression & { readonly expression: ArrowFunction; }; }; - interface NodeFactory { + export interface NodeFactory { createNodeArray(elements?: readonly T[], hasTrailingComma?: boolean): NodeArray; createNumericLiteral(value: string | number, numericLiteralFlags?: TokenFlags): NumericLiteral; createBigIntLiteral(value: string | PseudoBigInt): BigIntLiteral; @@ -7539,8 +8379,8 @@ declare namespace ts { updateNewExpression(node: NewExpression, expression: Expression, typeArguments: readonly TypeNode[] | undefined, argumentsArray: readonly Expression[] | undefined): NewExpression; createTaggedTemplateExpression(tag: Expression, typeArguments: readonly TypeNode[] | undefined, template: TemplateLiteral): TaggedTemplateExpression; updateTaggedTemplateExpression(node: TaggedTemplateExpression, tag: Expression, typeArguments: readonly TypeNode[] | undefined, template: TemplateLiteral): TaggedTemplateExpression; - createTypeAssertion(type: TypeNode, expression: Expression): TypeAssertion; - updateTypeAssertion(node: TypeAssertion, type: TypeNode, expression: Expression): TypeAssertion; + createTypeAssertion(type: TypeNode, expression: Expression): TypeAssertionExpression; + updateTypeAssertion(node: TypeAssertionExpression, type: TypeNode, expression: Expression): TypeAssertionExpression; createParenthesizedExpression(expression: Expression): ParenthesizedExpression; updateParenthesizedExpression(node: ParenthesizedExpression, expression: Expression): ParenthesizedExpression; createFunctionExpression(modifiers: readonly Modifier[] | undefined, asteriskToken: AsteriskToken | undefined, name: string | Identifier | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[] | undefined, type: TypeNode | undefined, body: Block): FunctionExpression; @@ -7877,7 +8717,7 @@ declare namespace ts { */ replacePropertyName(node: T, name: T["name"]): T; } - interface CoreTransformationContext { + export interface CoreTransformationContext { readonly factory: NodeFactory; /** Gets the compiler options supplied to the transformer. */ getCompilerOptions(): CompilerOptions; @@ -7894,7 +8734,7 @@ declare namespace ts { /** Hoists a variable declaration to the containing scope. */ hoistVariableDeclaration(node: Identifier): void; } - interface TransformationContext extends CoreTransformationContext { + export interface TransformationContext extends CoreTransformationContext { /** Records a request for a non-scoped emit helper in the current context. */ requestEmitHelper(helper: EmitHelper): void; /** Gets and resets the requested non-scoped emit helpers. */ @@ -7930,7 +8770,7 @@ declare namespace ts { */ onEmitNode: (hint: EmitHint, node: Node, emitCallback: (hint: EmitHint, node: Node) => void) => void; } - interface TransformationResult { + export interface TransformationResult { /** Gets the transformed source files. */ transformed: T[]; /** Gets diagnostics for the transformation. */ @@ -7965,15 +8805,15 @@ declare namespace ts { * A function that is used to initialize and return a `Transformer` callback, which in turn * will be used to transform one or more nodes. */ - type TransformerFactory = (context: TransformationContext) => Transformer; + export type TransformerFactory = (context: TransformationContext) => Transformer; /** * A function that transforms a node. */ - type Transformer = (node: T) => T; + export type Transformer = (node: T) => T; /** * A function that accepts and possibly transforms a node. */ - type Visitor = (node: TIn) => VisitResult; + export type Visitor = (node: TIn) => VisitResult; /** * A function that walks a node using the given visitor, lifting node arrays into single nodes, * returning an node which satisfies the test. @@ -7986,7 +8826,7 @@ declare namespace ts { * * For the canonical implementation of this type, @see {visitNode}. */ - interface NodeVisitor { + export interface NodeVisitor { (node: TIn, visitor: Visitor, TVisited>, test: (node: Node) => node is TOut, lift?: (node: readonly Node[]) => Node): TOut | (TIn & undefined) | (TVisited & undefined); (node: TIn, visitor: Visitor, TVisited>, test?: (node: Node) => boolean, lift?: (node: readonly Node[]) => Node): Node | (TIn & undefined) | (TVisited & undefined); } @@ -8001,12 +8841,12 @@ declare namespace ts { * * For the canonical implementation of this type, @see {visitNodes}. */ - interface NodesVisitor { + export interface NodesVisitor { | undefined, TOut extends Node>(nodes: TInArray, visitor: Visitor, test: (node: Node) => node is TOut, start?: number, count?: number): NodeArray | (TInArray & undefined); | undefined>(nodes: TInArray, visitor: Visitor, test?: (node: Node) => boolean, start?: number, count?: number): NodeArray | (TInArray & undefined); } - type VisitResult = T | readonly Node[]; - interface Printer { + export type VisitResult = T | readonly Node[]; + export interface Printer { /** * Print a node and its subtree as-is, without any emit transformations. * @param hint A value indicating the purpose of a node. This is primarily used to @@ -8034,7 +8874,7 @@ declare namespace ts { */ printBundle(bundle: Bundle): string; } - interface PrintHandlers { + export interface PrintHandlers { /** * A hook used by the Printer when generating unique names to avoid collisions with * globally defined names that exist outside of the current source file. @@ -8082,27 +8922,26 @@ declare namespace ts { */ substituteNode?(hint: EmitHint, node: Node): Node; } - interface PrinterOptions { + export interface PrinterOptions { removeComments?: boolean; newLine?: NewLineKind; omitTrailingSemicolon?: boolean; noEmitHelpers?: boolean; } - interface GetEffectiveTypeRootsHost { + export interface GetEffectiveTypeRootsHost { getCurrentDirectory?(): string; } - interface TextSpan { + export interface TextSpan { start: number; length: number; } - interface TextChangeRange { + export interface TextChangeRange { span: TextSpan; newLength: number; } - interface SyntaxList extends Node { - kind: SyntaxKind.SyntaxList; + export class SyntaxList extends Node { } - enum ListFormat { + export enum ListFormat { None = 0, SingleLine = 0, MultiLine = 1, @@ -8173,7 +9012,7 @@ declare namespace ts { IndexSignatureParameters = 8848, JSDocComment = 33, } - enum JSDocParsingMode { + export enum JSDocParsingMode { /** * Always parse JSDoc comments and include them in the AST. * @@ -8200,7 +9039,7 @@ declare namespace ts { */ ParseForTypeInfo = 3, } - interface UserPreferences { + export interface UserPreferences { readonly disableSuggestions?: boolean; readonly quotePreference?: "auto" | "double" | "single"; /** @@ -8338,21 +9177,1564 @@ declare namespace ts { readonly generateReturnInDocTemplate?: boolean; readonly disableLineTextInReferences?: boolean; } - type OrganizeImportsTypeOrder = "last" | "inline" | "first"; + export type OrganizeImportsTypeOrder = "last" | "inline" | "first"; /** Represents a bigint literal value without requiring bigint support */ - interface PseudoBigInt { + export interface PseudoBigInt { negative: boolean; base10Value: string; } - enum FileWatcherEventKind { + export class AstNodeArray { + readonly items: readonly N[]; + pos: number; + end: number; + private _extra; + constructor(items: readonly N[], hasTrailingComma?: boolean); + private get extra(); + get nodes(): NodeArray; + get hasTrailingComma(): boolean; + set hasTrailingComma(value: boolean); + } + export class AstNode = Node> { + private _node; + private _nodeConstructor; + private _extra; + readonly kind: N["kind"]; + readonly data: N["data"]; + parent: AstNode> | undefined; + flags: NodeFlags; + pos: number; + end: number; + constructor(kind: N["kind"], data: N["data"], nodeConstructor: NodeConstructor, flags?: NodeFlags); + get node(): N; + static Token(kind: K): AstToken; + private static _tokenFactoryMap; + static EndOfFileToken(): AstEndOfFileToken; + static ThisExpression(): AstThisExpression; + static SuperExpression(): AstSuperExpression; + static ImportExpression(): AstImportExpression; + static NullLiteral(): AstNullLiteral; + static TrueLiteral(): AstTrueLiteral; + static FalseLiteral(): AstFalseLiteral; + static Identifier(): AstIdentifier; + static PrivateIdentifier(): AstPrivateIdentifier; + static QualifiedName(): AstQualifiedName; + static ComputedPropertyName(): AstComputedPropertyName; + static TypeParameterDeclaration(): AstTypeParameterDeclaration; + static ParameterDeclaration(): AstParameterDeclaration; + static Decorator(): AstDecorator; + static PropertySignature(): AstPropertySignature; + static CallSignatureDeclaration(): AstCallSignatureDeclaration; + static ConstructSignatureDeclaration(): AstConstructSignatureDeclaration; + static VariableDeclaration(): AstVariableDeclaration; + static VariableDeclarationList(): AstVariableDeclarationList; + static BindingElement(): AstBindingElement; + static PropertyDeclaration(): AstPropertyDeclaration; + static PropertyAssignment(): AstPropertyAssignment; + static ShorthandPropertyAssignment(): AstShorthandPropertyAssignment; + static SpreadAssignment(): AstSpreadAssignment; + static ObjectBindingPattern(): AstObjectBindingPattern; + static ArrayBindingPattern(): AstArrayBindingPattern; + static FunctionDeclaration(): AstFunctionDeclaration; + static MethodSignature(): AstMethodSignature; + static MethodDeclaration(): AstMethodDeclaration; + static ConstructorDeclaration(): AstConstructorDeclaration; + static SemicolonClassElement(): AstSemicolonClassElement; + static GetAccessorDeclaration(): AstGetAccessorDeclaration; + static SetAccessorDeclaration(): AstSetAccessorDeclaration; + static IndexSignatureDeclaration(): AstIndexSignatureDeclaration; + static ClassStaticBlockDeclaration(): AstClassStaticBlockDeclaration; + /** @deprecated */ + static ImportTypeAssertionContainer(): AstImportTypeAssertionContainer; + static ImportTypeNode(): AstImportTypeNode; + static ThisTypeNode(): AstThisTypeNode; + static FunctionTypeNode(): AstFunctionTypeNode; + static ConstructorTypeNode(): AstConstructorTypeNode; + static TypeReferenceNode(): AstTypeReferenceNode; + static TypePredicateNode(): AstTypePredicateNode; + static TypeQueryNode(): AstTypeQueryNode; + static TypeLiteralNode(): AstTypeLiteralNode; + static ArrayTypeNode(): AstArrayTypeNode; + static TupleTypeNode(): AstTupleTypeNode; + static NamedTupleMember(): AstNamedTupleMember; + static OptionalTypeNode(): AstOptionalTypeNode; + static RestTypeNode(): AstRestTypeNode; + static UnionTypeNode(): AstUnionTypeNode; + static IntersectionTypeNode(): AstIntersectionTypeNode; + static ConditionalTypeNode(): AstConditionalTypeNode; + static InferTypeNode(): AstInferTypeNode; + static ParenthesizedTypeNode(): AstParenthesizedTypeNode; + static TypeOperatorNode(): AstTypeOperatorNode; + static IndexedAccessTypeNode(): AstIndexedAccessTypeNode; + static MappedTypeNode(): AstMappedTypeNode; + static LiteralTypeNode(): AstLiteralTypeNode; + static StringLiteral(): AstStringLiteral; + static TemplateLiteralTypeNode(): AstTemplateLiteralTypeNode; + static TemplateLiteralTypeSpan(): AstTemplateLiteralTypeSpan; + static OmittedExpression(): AstOmittedExpression; + static PrefixUnaryExpression(): AstPrefixUnaryExpression; + static PostfixUnaryExpression(): AstPostfixUnaryExpression; + static DeleteExpression(): AstDeleteExpression; + static TypeOfExpression(): AstTypeOfExpression; + static VoidExpression(): AstVoidExpression; + static AwaitExpression(): AstAwaitExpression; + static YieldExpression(): AstYieldExpression; + static BinaryExpression(): AstBinaryExpression; + static ConditionalExpression(): AstConditionalExpression; + static FunctionExpression(): AstFunctionExpression; + static ArrowFunction(): AstArrowFunction; + static RegularExpressionLiteral(): AstRegularExpressionLiteral; + static NoSubstitutionTemplateLiteral(): AstNoSubstitutionTemplateLiteral; + static NumericLiteral(): AstNumericLiteral; + static BigIntLiteral(): AstBigIntLiteral; + static TemplateHead(): AstTemplateHead; + static TemplateMiddle(): AstTemplateMiddle; + static TemplateTail(): AstTemplateTail; + static TemplateExpression(): AstTemplateExpression; + static TemplateSpan(): AstTemplateSpan; + static ParenthesizedExpression(): AstParenthesizedExpression; + static ArrayLiteralExpression(): AstArrayLiteralExpression; + static SpreadElement(): AstSpreadElement; + static ObjectLiteralExpression(): AstObjectLiteralExpression; + static PropertyAccessExpression(): AstPropertyAccessExpression; + static PropertyAccessChain(): AstPropertyAccessChain; + static ElementAccessExpression(): AstElementAccessExpression; + static ElementAccessChain(): AstElementAccessChain; + static CallExpression(): AstCallExpression; + static CallChain(): AstCallChain; + static ExpressionWithTypeArguments(): AstExpressionWithTypeArguments; + static NewExpression(): AstNewExpression; + static TaggedTemplateExpression(): AstTaggedTemplateExpression; + static AsExpression(): AstAsExpression; + static TypeAssertion(): AstTypeAssertion; + static SatisfiesExpression(): AstSatisfiesExpression; + static NonNullExpression(): AstNonNullExpression; + static NonNullChain(): AstNonNullChain; + static MetaProperty(): AstMetaProperty; + static JsxElement(): AstJsxElement; + static JsxAttributes(): AstJsxAttributes; + static JsxNamespacedName(): AstJsxNamespacedName; + static JsxOpeningElement(): AstJsxOpeningElement; + static JsxSelfClosingElement(): AstJsxSelfClosingElement; + static JsxFragment(): AstJsxFragment; + static JsxOpeningFragment(): AstJsxOpeningFragment; + static JsxClosingFragment(): AstJsxClosingFragment; + static JsxAttribute(): AstJsxAttribute; + static JsxSpreadAttribute(): AstJsxSpreadAttribute; + static JsxClosingElement(): AstJsxClosingElement; + static JsxExpression(): AstJsxExpression; + static JsxText(): AstJsxText; + static EmptyStatement(): AstEmptyStatement; + static DebuggerStatement(): AstDebuggerStatement; + static MissingDeclaration(): AstMissingDeclaration; + static Block(): AstBlock; + static VariableStatement(): AstVariableStatement; + static ExpressionStatement(): AstExpressionStatement; + static IfStatement(): AstIfStatement; + static DoStatement(): AstDoStatement; + static WhileStatement(): AstWhileStatement; + static ForStatement(): AstForStatement; + static ForInStatement(): AstForInStatement; + static ForOfStatement(): AstForOfStatement; + static BreakStatement(): AstBreakStatement; + static ContinueStatement(): AstContinueStatement; + static ReturnStatement(): AstReturnStatement; + static WithStatement(): AstWithStatement; + static SwitchStatement(): AstSwitchStatement; + static CaseBlock(): AstCaseBlock; + static CaseClause(): AstCaseClause; + static DefaultClause(): AstDefaultClause; + static LabeledStatement(): AstLabeledStatement; + static ThrowStatement(): AstThrowStatement; + static TryStatement(): AstTryStatement; + static CatchClause(): AstCatchClause; + static ClassDeclaration(): AstClassDeclaration; + static ClassExpression(): AstClassExpression; + static InterfaceDeclaration(): AstInterfaceDeclaration; + static HeritageClause(): AstHeritageClause; + static TypeAliasDeclaration(): AstTypeAliasDeclaration; + static EnumMember(): AstEnumMember; + static EnumDeclaration(): AstEnumDeclaration; + static ModuleDeclaration(): AstModuleDeclaration; + static ModuleBlock(): AstModuleBlock; + static ImportEqualsDeclaration(): AstImportEqualsDeclaration; + static ExternalModuleReference(): AstExternalModuleReference; + static ImportDeclaration(): AstImportDeclaration; + static ImportClause(): AstImportClause; + static ImportAttribute(): AstImportAttribute; + static ImportAttributes(): AstImportAttributes; + static NamespaceImport(): AstNamespaceImport; + static NamespaceExport(): AstNamespaceExport; + static NamespaceExportDeclaration(): AstNamespaceExportDeclaration; + static ExportDeclaration(): AstExportDeclaration; + static NamedImports(): AstNamedImports; + static NamedExports(): AstNamedExports; + static ImportSpecifier(): AstImportSpecifier; + static ExportSpecifier(): AstExportSpecifier; + static ExportAssignment(): AstExportAssignment; + static JSDocTypeExpression(): AstJSDocTypeExpression; + static JSDocNameReference(): AstJSDocNameReference; + static JSDocMemberName(): AstJSDocMemberName; + static JSDocAllType(): AstJSDocAllType; + static JSDocUnknownType(): AstJSDocUnknownType; + static JSDocNonNullableType(): AstJSDocNonNullableType; + static JSDocNullableType(): AstJSDocNullableType; + static JSDocOptionalType(): AstJSDocOptionalType; + static JSDocFunctionType(): AstJSDocFunctionType; + static JSDocVariadicType(): AstJSDocVariadicType; + static JSDocNamepathType(): AstJSDocNamepathType; + static JSDocNode(): AstJSDoc; + static JSDocLink(): AstJSDocLink; + static JSDocLinkCode(): AstJSDocLinkCode; + static JSDocLinkPlain(): AstJSDocLinkPlain; + static JSDocText(): AstJSDocText; + static JSDocUnknownTag(): AstJSDocUnknownTag; + static JSDocAugmentsTag(): AstJSDocAugmentsTag; + static JSDocImplementsTag(): AstJSDocImplementsTag; + static JSDocAuthorTag(): AstJSDocAuthorTag; + static JSDocDeprecatedTag(): AstJSDocDeprecatedTag; + static JSDocClassTag(): AstJSDocClassTag; + static JSDocPublicTag(): AstJSDocPublicTag; + static JSDocPrivateTag(): AstJSDocPrivateTag; + static JSDocProtectedTag(): AstJSDocProtectedTag; + static JSDocReadonlyTag(): AstJSDocReadonlyTag; + static JSDocOverrideTag(): AstJSDocOverrideTag; + static JSDocEnumTag(): AstJSDocEnumTag; + static JSDocThisTag(): AstJSDocThisTag; + static JSDocTemplateTag(): AstJSDocTemplateTag; + static JSDocSeeTag(): AstJSDocSeeTag; + static JSDocReturnTag(): AstJSDocReturnTag; + static JSDocTypeTag(): AstJSDocTypeTag; + static JSDocTypedefTag(): AstJSDocTypedefTag; + static JSDocCallbackTag(): AstJSDocCallbackTag; + static JSDocOverloadTag(): AstJSDocOverloadTag; + static JSDocThrowsTag(): AstJSDocThrowsTag; + static JSDocSignature(): AstJSDocSignature; + static JSDocPropertyTag(): AstJSDocPropertyTag; + static JSDocParameterTag(): AstJSDocParameterTag; + static JSDocTypeLiteral(): AstJSDocTypeLiteral; + static JSDocSatisfiesTag(): AstJSDocSatisfiesTag; + static JSDocImportTag(): AstJSDocImportTag; + static SourceFile(): AstSourceFile; + static SyntheticExpression(): AstSyntheticExpression; + static Bundle(): AstBundle; + static SyntaxList(): AstSyntaxList; + static NotEmittedStatement(): AstNotEmittedStatement; + static NotEmittedTypeElement(): AstNotEmittedTypeElement; + static PartiallyEmittedExpression(): AstPartiallyEmittedExpression; + static CommaListExpression(): AstCommaListExpression; + } + export type AstNodeOneOf = N extends unknown ? AstNode : never; + export class AstData { + } + export class AstTypeScriptNodeData extends AstData { + } + export type AstHasDecorators = AstNodeOneOf; + export type AstHasModifiers = AstNodeOneOf; + export type AstDeclaration = AstNode; + export type AstTypeNode = AstNode>; + export type AstStatement = AstNode; + export type AstExpression = AstNode; + export type AstUnaryExpression = AstNode; + export type AstUpdateExpression = AstNode; + export type AstLeftHandSideExpression = AstNode; + export type AstMemberExpression = AstNode; + export type AstPrimaryExpression = AstNode; + export type AstKeywordExpression = AstNode>; + export type AstLiteralLikeNode = AstNode; + export interface AstLiteralLikeNodeData extends AstData { + text: string; + } + export type AstStringLiteralLikeNode = AstNode; + export interface AstStringLiteralLikeNodeData extends AstLiteralLikeNodeData { + isUnterminated: boolean | undefined; + hasExtendedUnicodeEscape: boolean | undefined; + } + export interface AstTemplateLiteralLikeNodeData extends AstStringLiteralLikeNodeData { + rawText: string | undefined; + } + export type AstTemplateLiteralLikeNode = AstNode; + export type AstLiteralExpression = AstNode; + export interface AstLiteralExpressionData extends AstLiteralLikeNodeData { + } + export class AstTokenData extends AstData { + } + export class AstEndOfFileTokenData extends AstTokenData { + } + export class AstThisExpressionData extends AstTokenData { + } + export class AstSuperExpressionData extends AstTokenData { + } + export type AstBooleanLiteral = AstNodeOneOf; + export type AstPunctuationToken = AstNode>; + export type AstDotToken = AstNode; + export type AstDotDotDotToken = AstNode; + export type AstQuestionToken = AstNode; + export type AstExclamationToken = AstNode; + export type AstColonToken = AstNode; + export type AstEqualsToken = AstNode; + export type AstAmpersandAmpersandEqualsToken = AstNode; + export type AstBarBarEqualsToken = AstNode; + export type AstQuestionQuestionEqualsToken = AstNode; + export type AstAsteriskToken = AstNode; + export type AstEqualsGreaterThanToken = AstNode; + export type AstPlusToken = AstNode; + export type AstMinusToken = AstNode; + export type AstQuestionDotToken = AstNode; + export type AstKeywordToken = AstNode>; + export type AstAssertsKeyword = AstNode; + export type AstAssertKeyword = AstNode; + export type AstAwaitKeyword = AstNode; + export type AstCaseKeyword = AstNode; + export type AstModifierToken = AstNode>; + export type AstAbstractKeyword = AstNode; + export type AstAccessorKeyword = AstNode; + export type AstAsyncKeyword = AstNode; + export type AstConstKeyword = AstNode; + export type AstDeclareKeyword = AstNode; + export type AstDefaultKeyword = AstNode; + export type AstExportKeyword = AstNode; + export type AstInKeyword = AstNode; + export type AstPrivateKeyword = AstNode; + export type AstProtectedKeyword = AstNode; + export type AstPublicKeyword = AstNode; + export type AstReadonlyKeyword = AstNode; + export type AstOutKeyword = AstNode; + export type AstOverrideKeyword = AstNode; + export type AstStaticKeyword = AstNode; + export type AstModifier = AstNodeOneOf; + export type AstModifierLike = AstNodeOneOf; + export class AstIdentifierData extends AstTokenData { + escapedText: __String; + } + export class AstQualifiedNameData extends AstData { + left: AstEntityName; + right: AstIdentifier; + } + export type AstEntityName = AstNodeOneOf; + export type AstBindingName = AstNodeOneOf; + export type AstPropertyName = AstNodeOneOf; + export type AstMemberName = AstNodeOneOf; + export type AstDeclarationName = AstNodeOneOf; + export class AstComputedPropertyNameData extends AstData { + expression: AstExpression; + } + export class AstPrivateIdentifierData extends AstTokenData { + escapedText: __String; + } + export class AstTypeParameterDeclarationData extends AstTypeScriptNodeData { + modifiers: AstNodeArray | undefined; + name: AstIdentifier; + constraint: AstTypeNode | undefined; + default: AstTypeNode | undefined; + expression: AstExpression | undefined; + } + export class AstParameterDeclarationData extends AstData { + modifiers: AstNodeArray | undefined; + dotDotDotToken: AstDotDotDotToken | undefined; + name: AstBindingName; + questionToken: AstQuestionToken | undefined; + type: AstTypeNode | undefined; + initializer: AstExpression | undefined; + } + export class AstDecoratorData extends AstData { + expression: AstLeftHandSideExpression; + } + export class AstPropertySignatureData extends AstTypeScriptNodeData { + modifiers: AstNodeArray | undefined; + name: AstPropertyName; + questionToken: AstQuestionToken | undefined; + type: AstTypeNode | undefined; + } + export type AstSignatureDeclaration = AstNodeOneOf; + export class AstCallSignatureDeclarationData extends AstTypeScriptNodeData { + typeParameters: AstNodeArray | undefined; + parameters: AstNodeArray; + type: AstTypeNode | undefined; + } + export class AstConstructSignatureDeclarationData extends AstTypeScriptNodeData { + typeParameters: AstNodeArray | undefined; + parameters: AstNodeArray; + type: AstTypeNode | undefined; + } + export class AstVariableDeclarationData extends AstData { + name: AstBindingName; + exclamationToken: AstExclamationToken | undefined; + type: AstTypeNode | undefined; + initializer: AstExpression | undefined; + } + export class AstVariableDeclarationListData extends AstData { + declarations: AstNodeArray; + } + export class AstBindingElementData extends AstData { + propertyName: AstPropertyName | undefined; + dotDotDotToken: AstDotDotDotToken | undefined; + name: AstBindingName; + initializer: AstExpression | undefined; + } + export class AstPropertyDeclarationData extends AstData { + modifiers: AstNodeArray | undefined; + name: AstPropertyName; + questionToken: AstQuestionToken | undefined; + exclamationToken: AstExclamationToken | undefined; + type: AstTypeNode | undefined; + initializer: AstExpression | undefined; + } + export class AstPropertyAssignmentData extends AstData { + modifiers: AstNodeArray | undefined; + name: AstPropertyName; + questionToken: AstQuestionToken | undefined; + exclamationToken: AstExclamationToken | undefined; + initializer: AstExpression; + } + export class AstShorthandPropertyAssignmentData extends AstData { + name: AstIdentifier; + equalsToken: AstEqualsToken | undefined; + objectAssignmentInitializer: AstExpression | undefined; + modifiers: AstNodeArray | undefined; + questionToken: AstQuestionToken | undefined; + exclamationToken: AstExclamationToken | undefined; + } + export class AstSpreadAssignmentData extends AstData { + expression: AstExpression; + } + export type AstBindingPattern = AstNodeOneOf; + export type AstArrayBindingElement = AstNodeOneOf; + export class AstObjectBindingPatternData extends AstData { + elements: AstNodeArray; + } + export class AstArrayBindingPatternData extends AstData { + elements: AstNodeArray; + } + export class AstFunctionDeclarationData extends AstData { + modifiers: AstNodeArray | undefined; + asteriskToken: AstAsteriskToken | undefined; + name: AstIdentifier | undefined; + typeParameters: AstNodeArray | undefined; + parameters: AstNodeArray; + type: AstTypeNode | undefined; + body: AstFunctionBody | undefined; + } + export class AstMethodSignatureData extends AstTypeScriptNodeData { + modifiers: AstNodeArray | undefined; + name: AstPropertyName; + questionToken: AstQuestionToken | undefined; + typeParameters: AstNodeArray | undefined; + parameters: AstNodeArray; + type: AstTypeNode | undefined; + } + export class AstMethodDeclarationData extends AstData { + modifiers: AstNodeArray | undefined; + asteriskToken: AstAsteriskToken | undefined; + name: AstPropertyName; + questionToken: AstQuestionToken | undefined; + exclamationToken: AstExclamationToken | undefined; + typeParameters: AstNodeArray | undefined; + parameters: AstNodeArray; + type: AstTypeNode | undefined; + body: AstFunctionBody | undefined; + } + export class AstConstructorDeclarationData extends AstData { + modifiers: AstNodeArray | undefined; + body: AstFunctionBody | undefined; + typeParameters: AstNodeArray | undefined; + parameters: AstNodeArray; + type: AstTypeNode | undefined; + } + export class AstSemicolonClassElementData extends AstData { + } + export class AstGetAccessorDeclarationData extends AstData { + modifiers: AstNodeArray | undefined; + name: AstPropertyName; + body: AstFunctionBody | undefined; + typeParameters: AstNodeArray | undefined; + parameters: AstNodeArray; + type: AstTypeNode | undefined; + } + export class AstSetAccessorDeclarationData extends AstData { + modifiers: AstNodeArray | undefined; + name: AstPropertyName; + body: AstFunctionBody | undefined; + typeParameters: AstNodeArray | undefined; + parameters: AstNodeArray; + type: AstTypeNode | undefined; + } + export type AstAccessorDeclaration = AstNodeOneOf; + export class AstIndexSignatureDeclarationData extends AstTypeScriptNodeData { + modifiers: AstNodeArray | undefined; + typeParameters: AstNodeArray | undefined; + parameters: AstNodeArray; + type: AstTypeNode | undefined; + } + export class AstClassStaticBlockDeclarationData extends AstData { + body: AstBlock; + modifiers: AstNodeArray | undefined; + } + /** + * @deprecated + */ + export type AstImportTypeAssertionContainer = AstNode; + /** + * @deprecated + */ + export class AstImportTypeAssertionContainerData extends AstTypeScriptNodeData { + assertClause: AstImportAttributes; + multiLine: boolean; + } + export class AstImportTypeNodeData extends AstTypeScriptNodeData { + isTypeOf: boolean; + argument: AstTypeNode; + assertions: AstImportTypeAssertionContainer | undefined; + attributes: AstImportAttributes | undefined; + qualifier: AstEntityName | undefined; + typeArguments: AstNodeArray | undefined; + } + export type AstKeywordTypeNode = AstNode>; + export class AstThisTypeNodeData extends AstTypeScriptNodeData { + } + export type AstFunctionOrConstructorTypeNode = AstNodeOneOf; + export class AstFunctionTypeNodeData extends AstTypeScriptNodeData { + modifiers: AstNodeArray | undefined; + typeParameters: AstNodeArray | undefined; + parameters: AstNodeArray; + type: AstTypeNode; + } + export class AstConstructorTypeNodeData extends AstTypeScriptNodeData { + modifiers: AstNodeArray | undefined; + typeParameters: AstNodeArray | undefined; + parameters: AstNodeArray; + type: AstTypeNode; + } + export class AstTypeReferenceNodeData extends AstTypeScriptNodeData { + typeName: AstEntityName; + typeArguments: AstNodeArray | undefined; + } + export class AstTypePredicateNodeData extends AstTypeScriptNodeData { + assertsModifier: AstAssertsKeyword | undefined; + parameterName: AstIdentifier | AstThisTypeNode; + type: AstTypeNode | undefined; + } + export class AstTypeQueryNodeData extends AstTypeScriptNodeData { + exprName: AstEntityName; + typeArguments: AstNodeArray | undefined; + } + export class AstTypeLiteralNodeData extends AstTypeScriptNodeData { + members: AstNodeArray; + } + export class AstArrayTypeNodeData extends AstTypeScriptNodeData { + elementType: AstTypeNode; + } + export class AstTupleTypeNodeData extends AstTypeScriptNodeData { + elements: AstNodeArray; + } + export class AstNamedTupleMemberData extends AstTypeScriptNodeData { + dotDotDotToken: AstDotDotDotToken | undefined; + name: AstIdentifier; + questionToken: AstQuestionToken | undefined; + type: AstTypeNode; + } + export class AstOptionalTypeNodeData extends AstTypeScriptNodeData { + type: AstTypeNode; + } + export class AstRestTypeNodeData extends AstTypeScriptNodeData { + type: AstTypeNode; + } + export type AstUnionOrIntersectionTypeNode = AstNodeOneOf; + export class AstUnionTypeNodeData extends AstTypeScriptNodeData { + types: AstNodeArray; + } + export class AstIntersectionTypeNodeData extends AstTypeScriptNodeData { + types: AstNodeArray; + } + export class AstConditionalTypeNodeData extends AstTypeScriptNodeData { + checkType: AstTypeNode; + extendsType: AstTypeNode; + trueType: AstTypeNode; + falseType: AstTypeNode; + } + export class AstInferTypeNodeData extends AstTypeScriptNodeData { + typeParameter: AstTypeParameterDeclaration; + } + export class AstParenthesizedTypeNodeData extends AstTypeScriptNodeData { + type: AstTypeNode; + } + export class AstTypeOperatorNodeData extends AstTypeScriptNodeData { + operator: SyntaxKind.KeyOfKeyword | SyntaxKind.UniqueKeyword | SyntaxKind.ReadonlyKeyword; + type: AstTypeNode; + } + export class AstIndexedAccessTypeNodeData extends AstTypeScriptNodeData { + objectType: AstTypeNode; + indexType: AstTypeNode; + } + export class AstMappedTypeNodeData extends AstTypeScriptNodeData { + readonlyToken: AstReadonlyKeyword | AstPlusToken | AstMinusToken | undefined; + typeParameter: AstTypeParameterDeclaration; + nameType: AstTypeNode | undefined; + questionToken: AstQuestionToken | AstPlusToken | AstMinusToken | undefined; + type: AstTypeNode | undefined; + members: AstNodeArray | undefined; + } + export class AstLiteralTypeNodeData extends AstTypeScriptNodeData { + literal: AstNullLiteral | AstBooleanLiteral | AstLiteralExpression | AstPrefixUnaryExpression; + } + export type AstPropertyNameLiteral = AstNodeOneOf; + export class AstTemplateLiteralTypeNodeData extends AstTypeScriptNodeData { + head: AstTemplateHead; + templateSpans: AstNodeArray; + } + export class AstTemplateLiteralTypeSpanData extends AstTypeScriptNodeData { + type: AstTypeNode; + literal: AstTemplateMiddle | AstTemplateTail; + } + export class AstOmittedExpressionData extends AstData { + } + export class AstPrefixUnaryExpressionData extends AstData { + operator: PrefixUnaryOperator; + operand: AstUnaryExpression; + } + export class AstPostfixUnaryExpressionData extends AstData { + operand: AstLeftHandSideExpression; + operator: PostfixUnaryOperator; + } + export class AstDeleteExpressionData extends AstData { + expression: AstUnaryExpression; + } + export class AstTypeOfExpressionData extends AstData { + expression: AstUnaryExpression; + } + export class AstVoidExpressionData extends AstData { + expression: AstUnaryExpression; + } + export class AstAwaitExpressionData extends AstData { + expression: AstUnaryExpression; + } + export class AstYieldExpressionData extends AstData { + asteriskToken: AstAsteriskToken | undefined; + expression: AstExpression | undefined; + } + export type AstBinaryOperatorToken = AstNode; + export class AstBinaryExpressionData extends AstData { + left: AstExpression; + operatorToken: AstBinaryOperatorToken; + right: AstExpression; + } + export type AstDestructuringAssignment = AstNodeOneOf; + export class AstConditionalExpressionData extends AstData { + condition: AstExpression; + questionToken: AstQuestionToken; + whenTrue: AstExpression; + colonToken: AstColonToken; + whenFalse: AstExpression; + } + export type AstFunctionBody = AstNodeOneOf; + export type AstConciseBody = AstNodeOneOf; + export class AstFunctionExpressionData extends AstData { + modifiers: AstNodeArray | undefined; + asteriskToken: AstAsteriskToken | undefined; + name: AstIdentifier | undefined; + typeParameters: AstNodeArray | undefined; + parameters: AstNodeArray; + type: AstTypeNode | undefined; + body: AstFunctionBody; + } + export class AstArrowFunctionData extends AstData { + modifiers: AstNodeArray | undefined; + equalsGreaterThanToken: AstEqualsGreaterThanToken; + typeParameters: AstNodeArray | undefined; + parameters: AstNodeArray; + type: AstTypeNode | undefined; + body: AstConciseBody; + typeArguments: AstNodeArray | undefined; + } + export class AstRegularExpressionLiteralData extends AstTokenData { + text: string; + isUnterminated: boolean | undefined; + hasExtendedUnicodeEscape: boolean | undefined; + } + export class AstStringLiteralData extends AstTokenData { + text: string; + singleQuote: boolean | undefined; + isUnterminated: boolean; + hasExtendedUnicodeEscape: boolean; + } + export class AstNoSubstitutionTemplateLiteralData extends AstTokenData { + text: string; + rawText: string | undefined; + isUnterminated: boolean | undefined; + hasExtendedUnicodeEscape: boolean | undefined; + } + export type AstPseudoLiteralToken = AstNodeOneOf; + export type AstTemplateLiteralToken = AstNodeOneOf; + export type AstStringLiteralLike = AstNodeOneOf; + export class AstNumericLiteralData extends AstTokenData { + text: string; + } + export class AstBigIntLiteralData extends AstTokenData { + text: string; + } + export type AstLiteralToken = AstNodeOneOf; + export class AstTemplateHeadData extends AstTokenData { + text: string; + isUnterminated: boolean | undefined; + hasExtendedUnicodeEscape: boolean | undefined; + rawText: string | undefined; + } + export class AstTemplateMiddleData extends AstTokenData { + text: string; + isUnterminated: boolean | undefined; + hasExtendedUnicodeEscape: boolean | undefined; + rawText: string | undefined; + } + export class AstTemplateTailData extends AstTokenData { + text: string; + isUnterminated: boolean | undefined; + hasExtendedUnicodeEscape: boolean | undefined; + rawText: string | undefined; + } + export class AstTemplateExpressionData extends AstData { + head: AstTemplateHead; + templateSpans: AstNodeArray; + } + export class AstTemplateSpanData extends AstData { + expression: AstExpression; + literal: AstTemplateMiddle | AstTemplateTail; + } + export class AstParenthesizedExpressionData extends AstData { + expression: AstExpression; + } + export class AstArrayLiteralExpressionData extends AstData { + elements: AstNodeArray; + } + export class AstSpreadElementData extends AstData { + expression: AstExpression; + } + export type AstObjectLiteralElement = AstNode; + export type AstObjectLiteralElementLike = AstNodeOneOf; + export class AstObjectLiteralExpressionData extends AstData { + properties: AstNodeArray; + } + export class AstPropertyAccessExpressionData extends AstData { + expression: AstLeftHandSideExpression; + questionDotToken: AstQuestionDotToken | undefined; + name: AstMemberName; + } + export type AstPropertyAccessEntityNameExpression = AstNode; + export interface AstPropertyAccessEntityNameExpressionData extends AstPropertyAccessExpressionData { + expression: AstEntityNameExpression; + name: AstIdentifier; + } + export type AstEntityNameExpression = AstNodeOneOf; + export type AstPropertyAccessChain = AstNode; + export class AstElementAccessExpressionData extends AstData { + expression: AstLeftHandSideExpression; + questionDotToken: AstQuestionDotToken | undefined; + argumentExpression: AstExpression; + } + export type AstElementAccessChain = AstNode; + export class AstCallExpressionData extends AstData { + expression: AstLeftHandSideExpression; + questionDotToken: AstQuestionDotToken | undefined; + typeArguments: AstNodeArray | undefined; + arguments: AstNodeArray; + } + export type AstCallChain = AstNode; + export class AstExpressionWithTypeArgumentsData extends AstData { + expression: AstLeftHandSideExpression; + typeArguments: AstNodeArray | undefined; + } + export class AstNewExpressionData extends AstData { + expression: AstLeftHandSideExpression; + typeArguments: AstNodeArray | undefined; + arguments: AstNodeArray | undefined; + } + export type AstTemplateLiteral = AstNodeOneOf; + export class AstTaggedTemplateExpressionData extends AstData { + tag: AstLeftHandSideExpression; + typeArguments: AstNodeArray | undefined; + template: AstTemplateLiteral; + questionDotToken: AstQuestionDotToken | undefined; + } + export class AstAsExpressionData extends AstData { + expression: AstExpression; + type: AstTypeNode; + } + export class AstTypeAssertionData extends AstData { + type: AstTypeNode; + expression: AstUnaryExpression; + } + export class AstSatisfiesExpressionData extends AstData { + expression: AstExpression; + type: AstTypeNode; + } + export class AstNonNullExpressionData extends AstData { + expression: AstExpression; + } + export type AstNonNullChain = AstNode; + export class AstMetaPropertyData extends AstData { + keywordToken: SyntaxKind.NewKeyword | SyntaxKind.ImportKeyword; + name: AstIdentifier; + } + export class AstJsxElementData extends AstData { + openingElement: AstJsxOpeningElement; + children: AstNodeArray; + closingElement: AstJsxClosingElement; + } + export type AstJsxOpeningLikeElement = AstNodeOneOf; + export type AstJsxAttributeLike = AstNodeOneOf; + export type AstJsxAttributeName = AstNodeOneOf; + export type AstJsxTagNameExpression = AstNodeOneOf; + export type AstJsxTagNamePropertyAccess = AstNode; + export interface AstJsxTagNamePropertyAccessData extends AstPropertyAccessExpressionData { + expression: AstIdentifier | AstThisExpression | AstJsxTagNamePropertyAccess; + } + export class AstJsxAttributesData extends AstData { + properties: AstNodeArray; + } + export class AstJsxNamespacedNameData extends AstData { + name: AstIdentifier; + namespace: AstIdentifier; + } + export class AstJsxOpeningElementData extends AstData { + tagName: AstJsxTagNameExpression; + typeArguments: AstNodeArray | undefined; + attributes: AstJsxAttributes; + } + export class AstJsxClosingElementData extends AstData { + tagName: AstJsxTagNameExpression; + } + export class AstJsxSelfClosingElementData extends AstData { + tagName: AstJsxTagNameExpression; + typeArguments: AstNodeArray | undefined; + attributes: AstJsxAttributes; + } + export class AstJsxFragmentData extends AstData { + openingFragment: AstJsxOpeningFragment; + children: AstNodeArray; + closingFragment: AstJsxClosingFragment; + } + export class AstJsxOpeningFragmentData extends AstData { + } + export class AstJsxClosingFragmentData extends AstData { + } + export class AstJsxAttributeData extends AstData { + name: AstJsxAttributeName; + initializer: AstJsxAttributeValue | undefined; + } + export type AstJsxAttributeValue = AstNodeOneOf; + export class AstJsxSpreadAttributeData extends AstData { + expression: AstExpression; + } + export class AstJsxExpressionData extends AstData { + dotDotDotToken: AstDotDotDotToken | undefined; + expression: AstExpression | undefined; + } + export class AstJsxTextData extends AstData { + text: string; + isUnterminated: boolean | undefined; + hasExtendedUnicodeEscape: boolean | undefined; + containsOnlyTriviaWhiteSpaces: boolean; + } + export type AstJsxChild = AstNodeOneOf; + export type AstIterationStatement = AstNodeOneOf; + export class AstEmptyStatementData extends AstData { + } + export class AstDebuggerStatementData extends AstData { + } + export class AstMissingDeclarationData extends AstData { + name: AstIdentifier | undefined; + modifiers: AstNodeArray | undefined; + } + export class AstBlockData extends AstData { + statements: AstNodeArray; + } + export class AstVariableStatementData extends AstData { + modifiers: AstNodeArray | undefined; + declarationList: AstVariableDeclarationList; + } + export class AstExpressionStatementData extends AstData { + expression: AstExpression; + } + export class AstIfStatementData extends AstData { + expression: AstExpression; + thenStatement: AstStatement; + elseStatement: AstStatement | undefined; + } + export class AstDoStatementData extends AstData { + statement: AstStatement; + expression: AstExpression; + } + export class AstWhileStatementData extends AstData { + expression: AstExpression; + statement: AstStatement; + } + export type AstForInitializer = AstNodeOneOf; + export class AstForStatementData extends AstData { + initializer: AstForInitializer | undefined; + condition: AstExpression | undefined; + incrementor: AstExpression | undefined; + statement: AstStatement; + } + export type AstForInOrOfStatement = AstNodeOneOf; + export class AstForInStatementData extends AstData { + initializer: AstForInitializer; + expression: AstExpression; + statement: AstStatement; + } + export class AstForOfStatementData extends AstData { + awaitModifier: AstAwaitKeyword | undefined; + initializer: AstForInitializer; + expression: AstExpression; + statement: AstStatement; + } + export class AstBreakStatementData extends AstData { + label: AstIdentifier | undefined; + } + export type AstBreakOrContinueStatement = AstNodeOneOf; + export class AstContinueStatementData extends AstData { + label: AstIdentifier | undefined; + } + export class AstReturnStatementData extends AstData { + expression: AstExpression | undefined; + } + export class AstWithStatementData extends AstData { + expression: AstExpression; + statement: AstStatement; + } + export class AstSwitchStatementData extends AstData { + expression: AstExpression; + caseBlock: AstCaseBlock; + possiblyExhaustive: boolean | undefined; + } + export class AstCaseBlockData extends AstData { + clauses: AstNodeArray; + } + export class AstCaseClauseData extends AstData { + expression: AstExpression; + statements: AstNodeArray; + } + export class AstDefaultClauseData extends AstData { + statements: AstNodeArray; + } + export type AstCaseOrDefaultClause = AstNodeOneOf; + export class AstLabeledStatementData extends AstData { + label: AstIdentifier; + statement: AstStatement; + } + export class AstThrowStatementData extends AstData { + expression: AstExpression; + } + export class AstTryStatementData extends AstData { + tryBlock: AstBlock; + catchClause: AstCatchClause | undefined; + finallyBlock: AstBlock | undefined; + } + export class AstCatchClauseData extends AstData { + variableDeclaration: AstVariableDeclaration | undefined; + block: AstBlock; + } + export type AstObjectTypeDeclaration = AstNodeOneOf; + export type AstDeclarationWithTypeParameterChildren = AstNodeOneOf; + export type AstClassElement = AstNodeOneOf; + export type AstClassLikeDeclaration = AstNodeOneOf; + export class AstClassDeclarationData extends AstData { + modifiers: AstNodeArray | undefined; + /** May be undefined in `export default class { ... }`. */ + name: AstIdentifier | undefined; + typeParameters: AstNodeArray | undefined; + heritageClauses: AstNodeArray | undefined; + members: AstNodeArray; + } + export class AstClassExpressionData extends AstData { + modifiers: AstNodeArray | undefined; + name: AstIdentifier | undefined; + typeParameters: AstNodeArray | undefined; + heritageClauses: AstNodeArray | undefined; + members: AstNodeArray; + } + export type AstTypeElement = AstNode; + export class AstInterfaceDeclarationData extends AstTypeScriptNodeData { + modifiers: AstNodeArray | undefined; + name: AstIdentifier; + typeParameters: AstNodeArray | undefined; + heritageClauses: AstNodeArray | undefined; + members: AstNodeArray; + } + export class AstHeritageClauseData extends AstData { + token: SyntaxKind.ExtendsKeyword | SyntaxKind.ImplementsKeyword; + types: AstNodeArray; + } + export class AstTypeAliasDeclarationData extends AstTypeScriptNodeData { + modifiers: AstNodeArray | undefined; + name: AstIdentifier; + typeParameters: AstNodeArray | undefined; + type: AstTypeNode; + } + export class AstEnumDeclarationData extends AstData { + modifiers: AstNodeArray | undefined; + name: AstIdentifier; + members: AstNodeArray; + } + export class AstEnumMemberData extends AstData { + name: AstPropertyName; + initializer: AstExpression | undefined; + } + export type AstModuleName = AstNodeOneOf; + export type AstModuleBody = AstNodeOneOf; + export class AstModuleDeclarationData extends AstData { + modifiers: AstNodeArray | undefined; + name: AstModuleName; + body: AstModuleBody | AstJSDocNamespaceDeclaration | undefined; + } + export type AstNamespaceBody = AstNodeOneOf; + export type AstNamespaceDeclaration = AstNode; + export interface AstNamespaceDeclarationData extends AstModuleDeclarationData { + name: AstIdentifier; + body: AstNamespaceBody; + } + export type AstJSDocNamespaceBody = AstNodeOneOf; + export type AstJSDocNamespaceDeclaration = AstNode; + export interface AstJSDocNamespaceDeclarationData extends AstModuleDeclarationData { + name: AstIdentifier; + body: AstJSDocNamespaceBody | undefined; + } + export class AstModuleBlockData extends AstData { + statements: AstNodeArray; + } + export type AstModuleReference = AstNodeOneOf; + export class AstImportEqualsDeclarationData extends AstData { + modifiers: AstNodeArray | undefined; + name: AstIdentifier; + isTypeOnly: boolean; + moduleReference: AstModuleReference; + } + export class AstExternalModuleReferenceData extends AstData { + expression: AstExpression; + } + export class AstImportDeclarationData extends AstData { + modifiers: AstNodeArray | undefined; + importClause: AstImportClause | undefined; + /** If this is not a StringLiteral it will be a grammar error. */ + moduleSpecifier: AstExpression; + attributes: AstImportAttributes | undefined; + } + export type AstNamedImportBindings = AstNodeOneOf; + export type AstNamedExportBindings = AstNodeOneOf; + export class AstImportClauseData extends AstData { + isTypeOnly: boolean; + name: AstIdentifier | undefined; + namedBindings: AstNamedImportBindings | undefined; + } + export type AstAssertionKey = AstNodeOneOf; + /** @deprecated */ + export type AstAssertEntry = AstImportAttribute; + export type AstImportAttributeName = AstNodeOneOf; + export class AstImportAttributeData extends AstData { + name: AstImportAttributeName; + value: AstExpression; + } + /** @deprecated */ + export type AstAssertClause = AstNode; + export class AstImportAttributesData extends AstData { + token: SyntaxKind.WithKeyword | SyntaxKind.AssertKeyword; + elements: AstNodeArray; + multiLine: boolean | undefined; + } + export class AstNamespaceImportData extends AstData { + name: AstIdentifier; + } + export class AstNamespaceExportData extends AstData { + name: AstModuleExportName; + } + export class AstNamespaceExportDeclarationData extends AstData { + modifiers: AstNodeArray | undefined; + name: AstIdentifier; + } + export class AstExportDeclarationData extends AstData { + modifiers: AstNodeArray | undefined; + isTypeOnly: boolean; + exportClause: AstNamedExportBindings | undefined; + moduleSpecifier: AstExpression | undefined; + attributes: AstImportAttributes | undefined; + } + export class AstNamedImportsData extends AstData { + elements: AstNodeArray; + } + export class AstNamedExportsData extends AstData { + elements: AstNodeArray; + } + export class AstImportSpecifierData extends AstData { + propertyName: AstModuleExportName | undefined; + name: AstIdentifier; + isTypeOnly: boolean; + } + export class AstExportSpecifierData extends AstData { + isTypeOnly: boolean; + propertyName: AstModuleExportName | undefined; + name: AstModuleExportName; + } + export type AstModuleExportName = AstNodeOneOf; + export class AstExportAssignmentData extends AstData { + modifiers: AstNodeArray | undefined; + isExportEquals: boolean | undefined; + expression: AstExpression; + } + export class AstJSDocTypeExpressionData extends AstData { + type: AstTypeNode; + } + export class AstJSDocNameReferenceData extends AstData { + name: AstEntityName | AstJSDocMemberName; + } + export class AstJSDocMemberNameData extends AstData { + left: AstEntityName | AstJSDocMemberName; + right: AstIdentifier; + } + export type AstJSDocType = AstNodeOneOf; + export class AstJSDocAllTypeData extends AstData { + } + export class AstJSDocUnknownTypeData extends AstData { + } + export class AstJSDocNonNullableTypeData extends AstData { + type: AstTypeNode; + postfix: boolean; + } + export class AstJSDocNullableTypeData extends AstData { + type: AstTypeNode; + postfix: boolean; + } + export class AstJSDocOptionalTypeData extends AstData { + type: AstTypeNode; + } + export class AstJSDocFunctionTypeData extends AstData { + typeParameters: AstNodeArray | undefined; + parameters: AstNodeArray; + type: AstTypeNode | undefined; + } + export class AstJSDocVariadicTypeData extends AstData { + type: AstTypeNode; + } + export class AstJSDocNamepathTypeData extends AstData { + type: AstTypeNode; + } + export class AstJSDocData extends AstData { + comment: string | AstNodeArray | undefined; + tags: AstNodeArray | undefined; + } + export type AstHasJSDoc = AstNodeOneOf; + export type AstJSDocTag = AstNodeOneOf; + export class AstJSDocLinkData extends AstData { + name: AstEntityName | AstJSDocMemberName | undefined; + text: string; + } + export class AstJSDocLinkCodeData extends AstData { + name: AstEntityName | AstJSDocMemberName | undefined; + text: string; + } + export class AstJSDocLinkPlainData extends AstData { + name: AstEntityName | AstJSDocMemberName | undefined; + text: string; + } + export type AstJSDocComment = AstNodeOneOf; + export class AstJSDocTextData extends AstData { + text: string; + } + export type AstBaseJSDocTag = AstNode>; + export class AstJSDocTagData extends AstData { + tagName: AstIdentifier; + comment: string | AstNodeArray | undefined; + } + export class AstJSDocUnknownTagData extends AstJSDocTagData { + } + export type AstJSDocClassReference = AstNode; + export interface AstJSDocClassReferenceData extends AstExpressionWithTypeArgumentsData { + expression: AstIdentifier | AstPropertyAccessEntityNameExpression; + } + export class AstJSDocAugmentsTagData extends AstJSDocTagData { + class: AstJSDocClassReference; + } + export class AstJSDocImplementsTagData extends AstJSDocTagData { + class: AstJSDocClassReference; + } + export class AstJSDocAuthorTagData extends AstJSDocTagData { + } + export class AstJSDocDeprecatedTagData extends AstJSDocTagData { + } + export class AstJSDocClassTagData extends AstJSDocTagData { + } + export class AstJSDocPublicTagData extends AstJSDocTagData { + } + export class AstJSDocPrivateTagData extends AstJSDocTagData { + } + export class AstJSDocProtectedTagData extends AstJSDocTagData { + } + export class AstJSDocReadonlyTagData extends AstJSDocTagData { + } + export class AstJSDocOverrideTagData extends AstJSDocTagData { + } + export class AstJSDocEnumTagData extends AstJSDocTagData { + typeExpression: AstJSDocTypeExpression; + } + export class AstJSDocThisTagData extends AstJSDocTagData { + typeExpression: AstJSDocTypeExpression; + } + export class AstJSDocTemplateTagData extends AstJSDocTagData { + constraint: AstJSDocTypeExpression | undefined; + typeParameters: AstNodeArray; + } + export class AstJSDocSeeTagData extends AstJSDocTagData { + name: AstJSDocNameReference | undefined; + } + export class AstJSDocReturnTagData extends AstJSDocTagData { + typeExpression: AstJSDocTypeExpression | undefined; + } + export class AstJSDocTypeTagData extends AstJSDocTagData { + typeExpression: AstJSDocTypeExpression; + } + export class AstJSDocTypedefTagData extends AstJSDocTagData { + typeExpression: AstJSDocTypeExpression | AstJSDocTypeLiteral | undefined; + fullName: AstJSDocNamespaceDeclaration | AstIdentifier | undefined; + name: AstIdentifier | undefined; + } + export class AstJSDocCallbackTagData extends AstJSDocTagData { + fullName: AstJSDocNamespaceDeclaration | AstIdentifier | undefined; + name: AstIdentifier | undefined; + typeExpression: AstJSDocSignature; + } + export class AstJSDocOverloadTagData extends AstJSDocTagData { + typeExpression: AstJSDocSignature; + } + export class AstJSDocThrowsTagData extends AstJSDocTagData { + typeExpression: AstJSDocTypeExpression | undefined; + } + export class AstJSDocSignatureData extends AstData { + typeParameters: AstNodeArray | undefined; + parameters: AstNodeArray; + type: AstJSDocReturnTag | undefined; + } + export class AstJSDocPropertyTagData extends AstJSDocTagData { + typeExpression: AstJSDocTypeExpression | undefined; + name: AstEntityName; + /** Whether the property name came before the type -- non-standard for JSDoc, but Typescript-like */ + isNameFirst: boolean; + isBracketed: boolean; + } + export class AstJSDocParameterTagData extends AstJSDocTagData { + typeExpression: AstJSDocTypeExpression | undefined; + name: AstEntityName; + /** Whether the property name came before the type -- non-standard for JSDoc, but Typescript-like */ + isNameFirst: boolean; + isBracketed: boolean; + } + export type AstJSDocPropertyLikeTag = AstNodeOneOf; + export class AstJSDocTypeLiteralData extends AstData { + jsDocPropertyTags: AstNodeArray | undefined; + /** If true, then this type literal represents an *array* of its type. */ + isArrayType: boolean; + } + export class AstJSDocSatisfiesTagData extends AstJSDocTagData { + typeExpression: AstJSDocTypeExpression; + } + export class AstJSDocImportTagData extends AstJSDocTagData { + importClause: AstImportClause | undefined; + moduleSpecifier: AstExpression; + attributes: AstImportAttributes | undefined; + } + export class AstSyntheticExpressionData extends AstData { + isSpread: boolean; + type: Type; + tupleNameSource: AstParameterDeclaration | AstNamedTupleMember | undefined; + } + export class AstBundleData extends AstData { + sourceFiles: readonly SourceFile[]; + } + export class AstSyntaxListData extends AstData { + } + export class AstNotEmittedStatementData extends AstData { + } + export class AstNotEmittedTypeElementData extends AstData { + } + export class AstPartiallyEmittedExpressionData extends AstData { + expression: AstExpression; + } + export class AstCommaListExpressionData extends AstData { + elements: AstNodeArray; + } + export class AstDeclarationData { + } + export class AstSourceFileData extends AstData { + declaration: AstDeclarationData; + statements: AstNodeArray; + endOfFileToken: AstEndOfFileToken; + text: string; + fileName: string; + languageVersion: ScriptTarget; + languageVariant: LanguageVariant; + isDeclarationFile: boolean; + /** + * lib.d.ts should have a reference comment like + * + * /// + * + * If any other file has this comment, it signals not to include lib.d.ts + * because this containing file is intended to act as a default library. + */ + hasNoDefaultLib: boolean; + referencedFiles: readonly FileReference[]; + typeReferenceDirectives: readonly FileReference[]; + libReferenceDirectives: readonly FileReference[]; + amdDependencies: AmdDependency[]; + /** + * When `module` is `Node16` or `NodeNext`, this field controls whether the + * source file in question is an ESNext-output-format file, or a CommonJS-output-format + * module. This is derived by the module resolver as it looks up the file, since + * it is derived from either the file extension of the module, or the containing + * `package.json` context, and affects both checking and emit. + * + * It is _public_ so that (pre)transformers can set this field, + * since it switches the builtin `node` module transform. Generally speaking, if unset, + * the field is treated as though it is `ModuleKind.CommonJS`. + * + * Note that this field is only set by the module resolution process when + * `moduleResolution` is `Node16` or `NodeNext`, which is implied by the `module` setting + * of `Node16` or `NodeNext`, respectively, but may be overriden (eg, by a `moduleResolution` + * of `node`). If so, this field will be unset and source files will be considered to be + * CommonJS-output-format by the node module transformer and type checker, regardless of extension or context. + */ + impliedNodeFormat: ResolutionMode | undefined; + moduleName: string | undefined; + namedDeclarations: Map | undefined; + cloneNode(node: AstNode): AstNode; + } + export type AstToken = AstNode>; + export type AstEndOfFileToken = AstNode; + export type AstThisExpression = AstNode; + export type AstSuperExpression = AstNode; + export type AstImportExpression = AstNode; + export type AstNullLiteral = AstNode; + export type AstTrueLiteral = AstNode; + export type AstFalseLiteral = AstNode; + export type AstIdentifier = AstNode; + export type AstQualifiedName = AstNode; + export type AstComputedPropertyName = AstNode; + export type AstPrivateIdentifier = AstNode; + export type AstTypeParameterDeclaration = AstNode; + export type AstParameterDeclaration = AstNode; + export type AstDecorator = AstNode; + export type AstPropertySignature = AstNode; + export type AstCallSignatureDeclaration = AstNode; + export type AstConstructSignatureDeclaration = AstNode; + export type AstVariableDeclaration = AstNode; + export type AstVariableDeclarationList = AstNode; + export type AstBindingElement = AstNode; + export type AstPropertyDeclaration = AstNode; + export type AstPropertyAssignment = AstNode; + export type AstShorthandPropertyAssignment = AstNode; + export type AstSpreadAssignment = AstNode; + export type AstObjectBindingPattern = AstNode; + export type AstArrayBindingPattern = AstNode; + export type AstFunctionDeclaration = AstNode; + export type AstMethodSignature = AstNode; + export type AstMethodDeclaration = AstNode; + export type AstConstructorDeclaration = AstNode; + export type AstSemicolonClassElement = AstNode; + export type AstGetAccessorDeclaration = AstNode; + export type AstSetAccessorDeclaration = AstNode; + export type AstIndexSignatureDeclaration = AstNode; + export type AstClassStaticBlockDeclaration = AstNode; + export type AstImportTypeNode = AstNode; + export type AstThisTypeNode = AstNode; + export type AstFunctionTypeNode = AstNode; + export type AstConstructorTypeNode = AstNode; + export type AstTypeReferenceNode = AstNode; + export type AstTypePredicateNode = AstNode; + export type AstTypeQueryNode = AstNode; + export type AstTypeLiteralNode = AstNode; + export type AstArrayTypeNode = AstNode; + export type AstTupleTypeNode = AstNode; + export type AstNamedTupleMember = AstNode; + export type AstOptionalTypeNode = AstNode; + export type AstRestTypeNode = AstNode; + export type AstUnionTypeNode = AstNode; + export type AstIntersectionTypeNode = AstNode; + export type AstConditionalTypeNode = AstNode; + export type AstInferTypeNode = AstNode; + export type AstParenthesizedTypeNode = AstNode; + export type AstTypeOperatorNode = AstNode; + export type AstIndexedAccessTypeNode = AstNode; + export type AstMappedTypeNode = AstNode; + export type AstLiteralTypeNode = AstNode; + export type AstStringLiteral = AstNode; + export type AstTemplateLiteralTypeNode = AstNode; + export type AstTemplateLiteralTypeSpan = AstNode; + export type AstOmittedExpression = AstNode; + export type AstPrefixUnaryExpression = AstNode; + export type AstPostfixUnaryExpression = AstNode; + export type AstDeleteExpression = AstNode; + export type AstTypeOfExpression = AstNode; + export type AstVoidExpression = AstNode; + export type AstAwaitExpression = AstNode; + export type AstYieldExpression = AstNode; + export type AstBinaryExpression = AstNode; + export type AstConditionalExpression = AstNode; + export type AstFunctionExpression = AstNode; + export type AstArrowFunction = AstNode; + export type AstRegularExpressionLiteral = AstNode; + export type AstNoSubstitutionTemplateLiteral = AstNode; + export type AstNumericLiteral = AstNode; + export type AstBigIntLiteral = AstNode; + export type AstTemplateHead = AstNode; + export type AstTemplateMiddle = AstNode; + export type AstTemplateTail = AstNode; + export type AstTemplateExpression = AstNode; + export type AstTemplateSpan = AstNode; + export type AstParenthesizedExpression = AstNode; + export type AstArrayLiteralExpression = AstNode; + export type AstSpreadElement = AstNode; + export type AstObjectLiteralExpression = AstNode; + export type AstPropertyAccessExpression = AstNode; + export type AstElementAccessExpression = AstNode; + export type AstCallExpression = AstNode; + export type AstExpressionWithTypeArguments = AstNode; + export type AstNewExpression = AstNode; + export type AstTaggedTemplateExpression = AstNode; + export type AstAsExpression = AstNode; + export type AstTypeAssertion = AstNode; + export type AstSatisfiesExpression = AstNode; + export type AstNonNullExpression = AstNode; + export type AstMetaProperty = AstNode; + export type AstJsxElement = AstNode; + export type AstJsxAttributes = AstNode; + export type AstJsxNamespacedName = AstNode; + export type AstJsxOpeningElement = AstNode; + export type AstJsxSelfClosingElement = AstNode; + export type AstJsxFragment = AstNode; + export type AstJsxOpeningFragment = AstNode; + export type AstJsxClosingFragment = AstNode; + export type AstJsxAttribute = AstNode; + export type AstJsxSpreadAttribute = AstNode; + export type AstJsxClosingElement = AstNode; + export type AstJsxExpression = AstNode; + export type AstJsxText = AstNode; + export type AstEmptyStatement = AstNode; + export type AstDebuggerStatement = AstNode; + export type AstMissingDeclaration = AstNode; + export type AstBlock = AstNode; + export type AstVariableStatement = AstNode; + export type AstExpressionStatement = AstNode; + export type AstIfStatement = AstNode; + export type AstDoStatement = AstNode; + export type AstWhileStatement = AstNode; + export type AstForStatement = AstNode; + export type AstForInStatement = AstNode; + export type AstForOfStatement = AstNode; + export type AstBreakStatement = AstNode; + export type AstContinueStatement = AstNode; + export type AstReturnStatement = AstNode; + export type AstWithStatement = AstNode; + export type AstSwitchStatement = AstNode; + export type AstCaseBlock = AstNode; + export type AstCaseClause = AstNode; + export type AstDefaultClause = AstNode; + export type AstLabeledStatement = AstNode; + export type AstThrowStatement = AstNode; + export type AstTryStatement = AstNode; + export type AstCatchClause = AstNode; + export type AstClassDeclaration = AstNode; + export type AstClassExpression = AstNode; + export type AstInterfaceDeclaration = AstNode; + export type AstHeritageClause = AstNode; + export type AstTypeAliasDeclaration = AstNode; + export type AstEnumMember = AstNode; + export type AstEnumDeclaration = AstNode; + export type AstModuleDeclaration = AstNode; + export type AstModuleBlock = AstNode; + export type AstImportEqualsDeclaration = AstNode; + export type AstExternalModuleReference = AstNode; + export type AstImportDeclaration = AstNode; + export type AstImportClause = AstNode; + export type AstImportAttribute = AstNode; + export type AstImportAttributes = AstNode; + export type AstNamespaceImport = AstNode; + export type AstNamespaceExport = AstNode; + export type AstNamespaceExportDeclaration = AstNode; + export type AstExportDeclaration = AstNode; + export type AstNamedImports = AstNode; + export type AstNamedExports = AstNode; + export type AstImportSpecifier = AstNode; + export type AstExportSpecifier = AstNode; + export type AstExportAssignment = AstNode; + export type AstJSDocTypeExpression = AstNode; + export type AstJSDocNameReference = AstNode; + export type AstJSDocMemberName = AstNode; + export type AstJSDocAllType = AstNode; + export type AstJSDocUnknownType = AstNode; + export type AstJSDocNonNullableType = AstNode; + export type AstJSDocNullableType = AstNode; + export type AstJSDocOptionalType = AstNode; + export type AstJSDocFunctionType = AstNode; + export type AstJSDocVariadicType = AstNode; + export type AstJSDocNamepathType = AstNode; + export type AstJSDoc = AstNode; + export type AstJSDocLink = AstNode; + export type AstJSDocLinkCode = AstNode; + export type AstJSDocLinkPlain = AstNode; + export type AstJSDocText = AstNode; + export type AstJSDocUnknownTag = AstNode; + export type AstJSDocAugmentsTag = AstNode; + export type AstJSDocImplementsTag = AstNode; + export type AstJSDocAuthorTag = AstNode; + export type AstJSDocDeprecatedTag = AstNode; + export type AstJSDocClassTag = AstNode; + export type AstJSDocPublicTag = AstNode; + export type AstJSDocPrivateTag = AstNode; + export type AstJSDocProtectedTag = AstNode; + export type AstJSDocReadonlyTag = AstNode; + export type AstJSDocOverrideTag = AstNode; + export type AstJSDocEnumTag = AstNode; + export type AstJSDocThisTag = AstNode; + export type AstJSDocTemplateTag = AstNode; + export type AstJSDocSeeTag = AstNode; + export type AstJSDocReturnTag = AstNode; + export type AstJSDocTypeTag = AstNode; + export type AstJSDocTypedefTag = AstNode; + export type AstJSDocCallbackTag = AstNode; + export type AstJSDocOverloadTag = AstNode; + export type AstJSDocThrowsTag = AstNode; + export type AstJSDocSignature = AstNode; + export type AstJSDocPropertyTag = AstNode; + export type AstJSDocParameterTag = AstNode; + export type AstJSDocTypeLiteral = AstNode; + export type AstJSDocSatisfiesTag = AstNode; + export type AstJSDocImportTag = AstNode; + export type AstSourceFile = AstNode; + export type AstSyntheticExpression = AstNode; + export type AstBundle = AstNode; + export type AstSyntaxList = AstNode; + export type AstNotEmittedStatement = AstNode; + export type AstNotEmittedTypeElement = AstNode; + export type AstPartiallyEmittedExpression = AstNode; + export type AstCommaListExpression = AstNode; + export interface AstJsonMinusNumericLiteralData extends AstPrefixUnaryExpressionData { + operator: SyntaxKind.MinusToken; + operand: AstNumericLiteral; + } + export type AstJsonMinusNumericLiteral = AstNode; + export type AstJsonObjectExpression = AstNodeOneOf; + export type AstJsonObjectExpressionStatement = AstNode; + export interface AstJsonObjectExpressionStatementData extends AstExpressionStatementData { + expression: AstJsonObjectExpression; + } + export type AstJsonSourceFile = AstNode; + export interface AstJsonSourceFileData extends AstSourceFileData { + statements: AstNodeArray; + } + export enum FileWatcherEventKind { Created = 0, Changed = 1, Deleted = 2, } - type FileWatcherCallback = (fileName: string, eventKind: FileWatcherEventKind, modifiedTime?: Date) => void; - type DirectoryWatcherCallback = (fileName: string) => void; - type BufferEncoding = "ascii" | "utf8" | "utf-8" | "utf16le" | "ucs2" | "ucs-2" | "base64" | "latin1" | "binary" | "hex"; - interface System { + export type FileWatcherCallback = (fileName: string, eventKind: FileWatcherEventKind, modifiedTime?: Date) => void; + export type DirectoryWatcherCallback = (fileName: string) => void; + export type BufferEncoding = "ascii" | "utf8" | "utf-8" | "utf16le" | "ucs2" | "ucs-2" | "base64" | "latin1" | "binary" | "hex"; + export interface System { args: string[]; newLine: string; useCaseSensitiveFileNames: boolean; @@ -8394,33 +10776,33 @@ declare namespace ts { base64decode?(input: string): string; base64encode?(input: string): string; } - interface FileWatcher { + export interface FileWatcher { close(): void; } - let sys: System; - function tokenToString(t: SyntaxKind): string | undefined; - function getPositionOfLineAndCharacter(sourceFile: SourceFileLike, line: number, character: number): number; - function getLineAndCharacterOfPosition(sourceFile: SourceFileLike, position: number): LineAndCharacter; - function isWhiteSpaceLike(ch: number): boolean; + export let sys: System; + export function tokenToString(t: SyntaxKind): string | undefined; + export function getPositionOfLineAndCharacter(sourceFile: SourceFileLike, line: number, character: number): number; + export function getLineAndCharacterOfPosition(sourceFile: SourceFileLike, position: number): LineAndCharacter; + export function isWhiteSpaceLike(ch: number): boolean; /** Does not include line breaks. For that, see isWhiteSpaceLike. */ - function isWhiteSpaceSingleLine(ch: number): boolean; - function isLineBreak(ch: number): boolean; - function couldStartTrivia(text: string, pos: number): boolean; - function forEachLeadingCommentRange(text: string, pos: number, cb: (pos: number, end: number, kind: CommentKind, hasTrailingNewLine: boolean) => U): U | undefined; - function forEachLeadingCommentRange(text: string, pos: number, cb: (pos: number, end: number, kind: CommentKind, hasTrailingNewLine: boolean, state: T) => U, state: T): U | undefined; - function forEachTrailingCommentRange(text: string, pos: number, cb: (pos: number, end: number, kind: CommentKind, hasTrailingNewLine: boolean) => U): U | undefined; - function forEachTrailingCommentRange(text: string, pos: number, cb: (pos: number, end: number, kind: CommentKind, hasTrailingNewLine: boolean, state: T) => U, state: T): U | undefined; - function reduceEachLeadingCommentRange(text: string, pos: number, cb: (pos: number, end: number, kind: CommentKind, hasTrailingNewLine: boolean, state: T) => U, state: T, initial: U): U | undefined; - function reduceEachTrailingCommentRange(text: string, pos: number, cb: (pos: number, end: number, kind: CommentKind, hasTrailingNewLine: boolean, state: T) => U, state: T, initial: U): U | undefined; - function getLeadingCommentRanges(text: string, pos: number): CommentRange[] | undefined; - function getTrailingCommentRanges(text: string, pos: number): CommentRange[] | undefined; + export function isWhiteSpaceSingleLine(ch: number): boolean; + export function isLineBreak(ch: number): boolean; + export function couldStartTrivia(text: string, pos: number): boolean; + export function forEachLeadingCommentRange(text: string, pos: number, cb: (pos: number, end: number, kind: CommentKind, hasTrailingNewLine: boolean) => U): U | undefined; + export function forEachLeadingCommentRange(text: string, pos: number, cb: (pos: number, end: number, kind: CommentKind, hasTrailingNewLine: boolean, state: T) => U, state: T): U | undefined; + export function forEachTrailingCommentRange(text: string, pos: number, cb: (pos: number, end: number, kind: CommentKind, hasTrailingNewLine: boolean) => U): U | undefined; + export function forEachTrailingCommentRange(text: string, pos: number, cb: (pos: number, end: number, kind: CommentKind, hasTrailingNewLine: boolean, state: T) => U, state: T): U | undefined; + export function reduceEachLeadingCommentRange(text: string, pos: number, cb: (pos: number, end: number, kind: CommentKind, hasTrailingNewLine: boolean, state: T) => U, state: T, initial: U): U | undefined; + export function reduceEachTrailingCommentRange(text: string, pos: number, cb: (pos: number, end: number, kind: CommentKind, hasTrailingNewLine: boolean, state: T) => U, state: T, initial: U): U | undefined; + export function getLeadingCommentRanges(text: string, pos: number): CommentRange[] | undefined; + export function getTrailingCommentRanges(text: string, pos: number): CommentRange[] | undefined; /** Optionally, get the shebang */ - function getShebang(text: string): string | undefined; - function isIdentifierStart(ch: number, languageVersion: ScriptTarget | undefined): boolean; - function isIdentifierPart(ch: number, languageVersion: ScriptTarget | undefined, identifierVariant?: LanguageVariant): boolean; - function createScanner(languageVersion: ScriptTarget, skipTrivia: boolean, languageVariant?: LanguageVariant, textInitial?: string, onError?: ErrorCallback, start?: number, length?: number): Scanner; - type ErrorCallback = (message: DiagnosticMessage, length: number, arg0?: any) => void; - interface Scanner { + export function getShebang(text: string): string | undefined; + export function isIdentifierStart(ch: number, languageVersion: ScriptTarget | undefined): boolean; + export function isIdentifierPart(ch: number, languageVersion: ScriptTarget | undefined, identifierVariant?: LanguageVariant): boolean; + export function createScanner(languageVersion: ScriptTarget, skipTrivia: boolean, languageVariant?: LanguageVariant, textInitial?: string, onError?: ErrorCallback, start?: number, length?: number): Scanner; + export type ErrorCallback = (message: DiagnosticMessage, length: number, arg0?: any) => void; + export interface Scanner { /** @deprecated use {@link getTokenFullStart} */ getStartPos(): number; getToken(): SyntaxKind; @@ -8470,25 +10852,25 @@ declare namespace ts { scanRange(start: number, length: number, callback: () => T): T; tryScan(callback: () => T): T; } - function isExternalModuleNameRelative(moduleName: string): boolean; - function sortAndDeduplicateDiagnostics(diagnostics: readonly T[]): SortedReadonlyArray; - function getDefaultLibFileName(options: CompilerOptions): string; - function textSpanEnd(span: TextSpan): number; - function textSpanIsEmpty(span: TextSpan): boolean; - function textSpanContainsPosition(span: TextSpan, position: number): boolean; - function textSpanContainsTextSpan(span: TextSpan, other: TextSpan): boolean; - function textSpanOverlapsWith(span: TextSpan, other: TextSpan): boolean; - function textSpanOverlap(span1: TextSpan, span2: TextSpan): TextSpan | undefined; - function textSpanIntersectsWithTextSpan(span: TextSpan, other: TextSpan): boolean; - function textSpanIntersectsWith(span: TextSpan, start: number, length: number): boolean; - function decodedTextSpanIntersectsWith(start1: number, length1: number, start2: number, length2: number): boolean; - function textSpanIntersectsWithPosition(span: TextSpan, position: number): boolean; - function textSpanIntersection(span1: TextSpan, span2: TextSpan): TextSpan | undefined; - function createTextSpan(start: number, length: number): TextSpan; - function createTextSpanFromBounds(start: number, end: number): TextSpan; - function textChangeRangeNewSpan(range: TextChangeRange): TextSpan; - function textChangeRangeIsUnchanged(range: TextChangeRange): boolean; - function createTextChangeRange(span: TextSpan, newLength: number): TextChangeRange; + export function isExternalModuleNameRelative(moduleName: string): boolean; + export function sortAndDeduplicateDiagnostics(diagnostics: readonly T[]): SortedReadonlyArray; + export function getDefaultLibFileName(options: CompilerOptions): string; + export function textSpanEnd(span: TextSpan): number; + export function textSpanIsEmpty(span: TextSpan): boolean; + export function textSpanContainsPosition(span: TextSpan, position: number): boolean; + export function textSpanContainsTextSpan(span: TextSpan, other: TextSpan): boolean; + export function textSpanOverlapsWith(span: TextSpan, other: TextSpan): boolean; + export function textSpanOverlap(span1: TextSpan, span2: TextSpan): TextSpan | undefined; + export function textSpanIntersectsWithTextSpan(span: TextSpan, other: TextSpan): boolean; + export function textSpanIntersectsWith(span: TextSpan, start: number, length: number): boolean; + export function decodedTextSpanIntersectsWith(start1: number, length1: number, start2: number, length2: number): boolean; + export function textSpanIntersectsWithPosition(span: TextSpan, position: number): boolean; + export function textSpanIntersection(span1: TextSpan, span2: TextSpan): TextSpan | undefined; + export function createTextSpan(start: number, length: number): TextSpan; + export function createTextSpanFromBounds(start: number, end: number): TextSpan; + export function textChangeRangeNewSpan(range: TextChangeRange): TextSpan; + export function textChangeRangeIsUnchanged(range: TextChangeRange): boolean; + export function createTextChangeRange(span: TextSpan, newLength: number): TextChangeRange; /** * Called to merge all the changes that occurred across several versions of a script snapshot * into a single change. i.e. if a user keeps making successive edits to a script we will @@ -8497,49 +10879,49 @@ declare namespace ts { * This function will then merge those changes into a single change range valid between V1 and * Vn. */ - function collapseTextChangeRangesAcrossMultipleVersions(changes: readonly TextChangeRange[]): TextChangeRange; - function getTypeParameterOwner(d: Declaration): Declaration | undefined; - function isParameterPropertyDeclaration(node: Node, parent: Node): node is ParameterPropertyDeclaration; - function isEmptyBindingPattern(node: BindingName): node is BindingPattern; - function isEmptyBindingElement(node: BindingElement | ArrayBindingElement): boolean; - function walkUpBindingElementsAndPatterns(binding: BindingElement): VariableDeclaration | ParameterDeclaration; - function getCombinedModifierFlags(node: Declaration): ModifierFlags; - function getCombinedNodeFlags(node: Node): NodeFlags; + export function collapseTextChangeRangesAcrossMultipleVersions(changes: readonly TextChangeRange[]): TextChangeRange; + export function getTypeParameterOwner(d: Declaration): Declaration | undefined; + export function isParameterPropertyDeclaration(node: Node, parent: Node): node is ParameterPropertyDeclaration; + export function isEmptyBindingPattern(node: BindingName): node is BindingPattern; + export function isEmptyBindingElement(node: BindingElement | ArrayBindingElement): boolean; + export function walkUpBindingElementsAndPatterns(binding: BindingElement): VariableDeclaration | ParameterDeclaration; + export function getCombinedModifierFlags(node: Declaration): ModifierFlags; + export function getCombinedNodeFlags(node: Node): NodeFlags; /** * Checks to see if the locale is in the appropriate format, * and if it is, attempts to set the appropriate language. */ - function validateLocaleAndSetLanguage(locale: string, sys: { + export function validateLocaleAndSetLanguage(locale: string, sys: { getExecutingFilePath(): string; resolvePath(path: string): string; fileExists(fileName: string): boolean; readFile(fileName: string): string | undefined; }, errors?: Diagnostic[]): void; - function getOriginalNode(node: Node): Node; - function getOriginalNode(node: Node, nodeTest: (node: Node) => node is T): T; - function getOriginalNode(node: Node | undefined): Node | undefined; - function getOriginalNode(node: Node | undefined, nodeTest: (node: Node) => node is T): T | undefined; + export function getOriginalNode(node: Node): Node; + export function getOriginalNode(node: Node, nodeTest: (node: Node) => node is T): T; + export function getOriginalNode(node: Node | undefined): Node | undefined; + export function getOriginalNode(node: Node | undefined, nodeTest: (node: Node) => node is T): T | undefined; /** * Iterates through the parent chain of a node and performs the callback on each parent until the callback * returns a truthy value, then returns that value. * If no such value is found, it applies the callback until the parent pointer is undefined or the callback returns "quit" * At that point findAncestor returns undefined. */ - function findAncestor(node: Node | undefined, callback: (element: Node) => element is T): T | undefined; - function findAncestor(node: Node | undefined, callback: (element: Node) => boolean | "quit"): Node | undefined; + export function findAncestor(node: Node | undefined, callback: (element: Node) => element is T): T | undefined; + export function findAncestor(node: Node | undefined, callback: (element: Node) => boolean | "quit"): Node | undefined; /** * Gets a value indicating whether a node originated in the parse tree. * * @param node The node to test. */ - function isParseTreeNode(node: Node): boolean; + export function isParseTreeNode(node: Node): boolean; /** * Gets the original parse tree node for a node. * * @param node The original node. * @returns The original parse tree node if found; otherwise, undefined. */ - function getParseTreeNode(node: Node | undefined): Node | undefined; + export function getParseTreeNode(node: Node | undefined): Node | undefined; /** * Gets the original parse tree node for a node. * @@ -8547,27 +10929,27 @@ declare namespace ts { * @param nodeTest A callback used to ensure the correct type of parse tree node is returned. * @returns The original parse tree node if found; otherwise, undefined. */ - function getParseTreeNode(node: T | undefined, nodeTest?: (node: Node) => node is T): T | undefined; + export function getParseTreeNode(node: T | undefined, nodeTest?: (node: Node) => node is T): T | undefined; /** Add an extra underscore to identifiers that start with two underscores to avoid issues with magic names like '__proto__' */ - function escapeLeadingUnderscores(identifier: string): __String; + export function escapeLeadingUnderscores(identifier: string): __String; /** * Remove extra underscore from escaped identifier text content. * * @param identifier The escaped identifier text. * @returns The unescaped identifier text. */ - function unescapeLeadingUnderscores(identifier: __String): string; - function idText(identifierOrPrivateName: Identifier | PrivateIdentifier): string; + export function unescapeLeadingUnderscores(identifier: __String): string; + export function idText(identifierOrPrivateName: Identifier | PrivateIdentifier): string; /** * If the text of an Identifier matches a keyword (including contextual and TypeScript-specific keywords), returns the * SyntaxKind for the matching keyword. */ - function identifierToKeywordKind(node: Identifier): KeywordSyntaxKind | undefined; - function symbolName(symbol: Symbol): string; - function getNameOfJSDocTypedef(declaration: JSDocTypedefTag): Identifier | PrivateIdentifier | undefined; - function getNameOfDeclaration(declaration: Declaration | Expression | undefined): DeclarationName | undefined; - function getDecorators(node: HasDecorators): readonly Decorator[] | undefined; - function getModifiers(node: HasModifiers): readonly Modifier[] | undefined; + export function identifierToKeywordKind(node: Identifier): KeywordSyntaxKind | undefined; + export function symbolName(symbol: Symbol): string; + export function getNameOfJSDocTypedef(declaration: JSDocTypedefTag): Identifier | PrivateIdentifier | undefined; + export function getNameOfDeclaration(declaration: Declaration | Expression | undefined): DeclarationName | undefined; + export function getDecorators(node: HasDecorators): readonly Decorator[] | undefined; + export function getModifiers(node: HasModifiers): readonly Modifier[] | undefined; /** * Gets the JSDoc parameter tags for the node if present. * @@ -8580,7 +10962,7 @@ declare namespace ts { * * For binding patterns, parameter tags are matched by position. */ - function getJSDocParameterTags(param: ParameterDeclaration): readonly JSDocParameterTag[]; + export function getJSDocParameterTags(param: ParameterDeclaration): readonly JSDocParameterTag[]; /** * Gets the JSDoc type parameter tags for the node if present. * @@ -8591,42 +10973,42 @@ declare namespace ts { * node are returned first, so in the previous example, the template * tag on the containing function expression would be first. */ - function getJSDocTypeParameterTags(param: TypeParameterDeclaration): readonly JSDocTemplateTag[]; + export function getJSDocTypeParameterTags(param: TypeParameterDeclaration): readonly JSDocTemplateTag[]; /** * Return true if the node has JSDoc parameter tags. * * @remarks Includes parameter tags that are not directly on the node, * for example on a variable declaration whose initializer is a function expression. */ - function hasJSDocParameterTags(node: FunctionLikeDeclaration | SignatureDeclaration): boolean; + export function hasJSDocParameterTags(node: FunctionLikeDeclaration | SignatureDeclaration): boolean; /** Gets the JSDoc augments tag for the node if present */ - function getJSDocAugmentsTag(node: Node): JSDocAugmentsTag | undefined; + export function getJSDocAugmentsTag(node: Node): JSDocAugmentsTag | undefined; /** Gets the JSDoc implements tags for the node if present */ - function getJSDocImplementsTags(node: Node): readonly JSDocImplementsTag[]; + export function getJSDocImplementsTags(node: Node): readonly JSDocImplementsTag[]; /** Gets the JSDoc class tag for the node if present */ - function getJSDocClassTag(node: Node): JSDocClassTag | undefined; + export function getJSDocClassTag(node: Node): JSDocClassTag | undefined; /** Gets the JSDoc public tag for the node if present */ - function getJSDocPublicTag(node: Node): JSDocPublicTag | undefined; + export function getJSDocPublicTag(node: Node): JSDocPublicTag | undefined; /** Gets the JSDoc private tag for the node if present */ - function getJSDocPrivateTag(node: Node): JSDocPrivateTag | undefined; + export function getJSDocPrivateTag(node: Node): JSDocPrivateTag | undefined; /** Gets the JSDoc protected tag for the node if present */ - function getJSDocProtectedTag(node: Node): JSDocProtectedTag | undefined; + export function getJSDocProtectedTag(node: Node): JSDocProtectedTag | undefined; /** Gets the JSDoc protected tag for the node if present */ - function getJSDocReadonlyTag(node: Node): JSDocReadonlyTag | undefined; - function getJSDocOverrideTagNoCache(node: Node): JSDocOverrideTag | undefined; + export function getJSDocReadonlyTag(node: Node): JSDocReadonlyTag | undefined; + export function getJSDocOverrideTagNoCache(node: Node): JSDocOverrideTag | undefined; /** Gets the JSDoc deprecated tag for the node if present */ - function getJSDocDeprecatedTag(node: Node): JSDocDeprecatedTag | undefined; + export function getJSDocDeprecatedTag(node: Node): JSDocDeprecatedTag | undefined; /** Gets the JSDoc enum tag for the node if present */ - function getJSDocEnumTag(node: Node): JSDocEnumTag | undefined; + export function getJSDocEnumTag(node: Node): JSDocEnumTag | undefined; /** Gets the JSDoc this tag for the node if present */ - function getJSDocThisTag(node: Node): JSDocThisTag | undefined; + export function getJSDocThisTag(node: Node): JSDocThisTag | undefined; /** Gets the JSDoc return tag for the node if present */ - function getJSDocReturnTag(node: Node): JSDocReturnTag | undefined; + export function getJSDocReturnTag(node: Node): JSDocReturnTag | undefined; /** Gets the JSDoc template tag for the node if present */ - function getJSDocTemplateTag(node: Node): JSDocTemplateTag | undefined; - function getJSDocSatisfiesTag(node: Node): JSDocSatisfiesTag | undefined; + export function getJSDocTemplateTag(node: Node): JSDocTemplateTag | undefined; + export function getJSDocSatisfiesTag(node: Node): JSDocSatisfiesTag | undefined; /** Gets the JSDoc type tag for the node if present and valid */ - function getJSDocTypeTag(node: Node): JSDocTypeTag | undefined; + export function getJSDocTypeTag(node: Node): JSDocTypeTag | undefined; /** * Gets the type node for the node if provided via JSDoc. * @@ -8638,22 +11020,22 @@ declare namespace ts { * node are examined first, so in the previous example, the type * tag directly on the node would be returned. */ - function getJSDocType(node: Node): TypeNode | undefined; + export function getJSDocType(node: Node): TypeNode | undefined; /** * Gets the return type node for the node if provided via JSDoc return tag or type tag. * * @remarks `getJSDocReturnTag` just gets the whole JSDoc tag. This function * gets the type from inside the braces, after the fat arrow, etc. */ - function getJSDocReturnType(node: Node): TypeNode | undefined; + export function getJSDocReturnType(node: Node): TypeNode | undefined; /** Get all JSDoc tags related to a node, including those on parent nodes. */ - function getJSDocTags(node: Node): readonly JSDocTag[]; + export function getJSDocTags(node: Node): readonly JSDocTag[]; /** Gets all JSDoc tags that match a specified predicate */ - function getAllJSDocTags(node: Node, predicate: (tag: JSDocTag) => tag is T): readonly T[]; + export function getAllJSDocTags(node: Node, predicate: (tag: JSDocTag) => tag is T): readonly T[]; /** Gets all JSDoc tags of a specified kind */ - function getAllJSDocTagsOfKind(node: Node, kind: SyntaxKind): readonly JSDocTag[]; + export function getAllJSDocTagsOfKind(node: Node, kind: SyntaxKind): readonly JSDocTag[]; /** Gets the text of a jsdoc comment, flattening links to their text. */ - function getTextOfJSDocComment(comment?: string | NodeArray): string | undefined; + export function getTextOfJSDocComment(comment?: string | NodeArray): string | undefined; /** * Gets the effective type parameters. If the node was parsed in a * JavaScript file, gets the type parameters from the `@template` tag from JSDoc. @@ -8664,107 +11046,107 @@ declare namespace ts { * /** @type {Id} / * function id(x) { return x } */ - function getEffectiveTypeParameterDeclarations(node: DeclarationWithTypeParameters): readonly TypeParameterDeclaration[]; - function getEffectiveConstraintOfTypeParameter(node: TypeParameterDeclaration): TypeNode | undefined; - function isMemberName(node: Node): node is MemberName; - function isPropertyAccessChain(node: Node): node is PropertyAccessChain; - function isElementAccessChain(node: Node): node is ElementAccessChain; - function isCallChain(node: Node): node is CallChain; - function isOptionalChain(node: Node): node is PropertyAccessChain | ElementAccessChain | CallChain | NonNullChain; - function isNullishCoalesce(node: Node): boolean; - function isConstTypeReference(node: Node): boolean; - function skipPartiallyEmittedExpressions(node: Expression): Expression; - function skipPartiallyEmittedExpressions(node: Node): Node; - function isNonNullChain(node: Node): node is NonNullChain; - function isBreakOrContinueStatement(node: Node): node is BreakOrContinueStatement; - function isNamedExportBindings(node: Node): node is NamedExportBindings; - function isJSDocPropertyLikeTag(node: Node): node is JSDocPropertyLikeTag; + export function getEffectiveTypeParameterDeclarations(node: DeclarationWithTypeParameters): readonly TypeParameterDeclaration[]; + export function getEffectiveConstraintOfTypeParameter(node: TypeParameterDeclaration): TypeNode | undefined; + export function isMemberName(node: Node): node is MemberName; + export function isPropertyAccessChain(node: Node): node is PropertyAccessChain; + export function isElementAccessChain(node: Node): node is ElementAccessChain; + export function isCallChain(node: Node): node is CallChain; + export function isOptionalChain(node: Node): node is PropertyAccessChain | ElementAccessChain | CallChain | NonNullChain; + export function isNullishCoalesce(node: Node): boolean; + export function isConstTypeReference(node: Node): boolean; + export function skipPartiallyEmittedExpressions(node: Expression): Expression; + export function skipPartiallyEmittedExpressions(node: Node): Node; + export function isNonNullChain(node: Node): node is NonNullChain; + export function isBreakOrContinueStatement(node: Node): node is BreakOrContinueStatement; + export function isNamedExportBindings(node: Node): node is NamedExportBindings; + export function isJSDocPropertyLikeTag(node: Node): node is JSDocPropertyLikeTag; /** * True if kind is of some token syntax kind. * For example, this is true for an IfKeyword but not for an IfStatement. * Literals are considered tokens, except TemplateLiteral, but does include TemplateHead/Middle/Tail. */ - function isTokenKind(kind: SyntaxKind): boolean; + export function isTokenKind(kind: SyntaxKind): boolean; /** * True if node is of some token syntax kind. * For example, this is true for an IfKeyword but not for an IfStatement. * Literals are considered tokens, except TemplateLiteral, but does include TemplateHead/Middle/Tail. */ - function isToken(n: Node): boolean; - function isLiteralExpression(node: Node): node is LiteralExpression; - function isTemplateLiteralToken(node: Node): node is TemplateLiteralToken; - function isTemplateMiddleOrTemplateTail(node: Node): node is TemplateMiddle | TemplateTail; - function isImportOrExportSpecifier(node: Node): node is ImportSpecifier | ExportSpecifier; - function isTypeOnlyImportDeclaration(node: Node): node is TypeOnlyImportDeclaration; - function isTypeOnlyExportDeclaration(node: Node): node is TypeOnlyExportDeclaration; - function isTypeOnlyImportOrExportDeclaration(node: Node): node is TypeOnlyAliasDeclaration; - function isStringTextContainingNode(node: Node): node is StringLiteral | TemplateLiteralToken; - function isImportAttributeName(node: Node): node is ImportAttributeName; - function isModifier(node: Node): node is Modifier; - function isEntityName(node: Node): node is EntityName; - function isPropertyName(node: Node): node is PropertyName; - function isBindingName(node: Node): node is BindingName; - function isFunctionLike(node: Node | undefined): node is SignatureDeclaration; - function isClassElement(node: Node): node is ClassElement; - function isClassLike(node: Node): node is ClassLikeDeclaration; - function isAccessor(node: Node): node is AccessorDeclaration; - function isAutoAccessorPropertyDeclaration(node: Node): node is AutoAccessorPropertyDeclaration; - function isModifierLike(node: Node): node is ModifierLike; - function isTypeElement(node: Node): node is TypeElement; - function isClassOrTypeElement(node: Node): node is ClassElement | TypeElement; - function isObjectLiteralElementLike(node: Node): node is ObjectLiteralElementLike; + export function isToken(n: Node): boolean; + export function isLiteralExpression(node: Node): node is LiteralExpression; + export function isTemplateLiteralToken(node: Node): node is TemplateLiteralToken; + export function isTemplateMiddleOrTemplateTail(node: Node): node is TemplateMiddle | TemplateTail; + export function isImportOrExportSpecifier(node: Node): node is ImportSpecifier | ExportSpecifier; + export function isTypeOnlyImportDeclaration(node: Node): node is TypeOnlyImportDeclaration; + export function isTypeOnlyExportDeclaration(node: Node): node is TypeOnlyExportDeclaration; + export function isTypeOnlyImportOrExportDeclaration(node: Node): node is TypeOnlyAliasDeclaration; + export function isStringTextContainingNode(node: Node): node is StringLiteral | TemplateLiteralToken; + export function isImportAttributeName(node: Node): node is ImportAttributeName; + export function isModifier(node: Node): node is Modifier; + export function isEntityName(node: Node): node is EntityName; + export function isPropertyName(node: Node): node is PropertyName; + export function isBindingName(node: Node): node is BindingName; + export function isFunctionLike(node: Node | undefined): node is SignatureDeclaration; + export function isClassElement(node: Node): node is ClassElement; + export function isClassLike(node: Node): node is ClassLikeDeclaration; + export function isAccessor(node: Node): node is AccessorDeclaration; + export function isAutoAccessorPropertyDeclaration(node: Node): node is AutoAccessorPropertyDeclaration; + export function isModifierLike(node: Node): node is ModifierLike; + export function isTypeElement(node: Node): node is TypeElement; + export function isClassOrTypeElement(node: Node): node is ClassElement | TypeElement; + export function isObjectLiteralElementLike(node: Node): node is ObjectLiteralElementLike; /** * Node test that determines whether a node is a valid type node. * This differs from the `isPartOfTypeNode` function which determines whether a node is *part* * of a TypeNode. */ - function isTypeNode(node: Node): node is TypeNode; - function isFunctionOrConstructorTypeNode(node: Node): node is FunctionTypeNode | ConstructorTypeNode; - function isArrayBindingElement(node: Node): node is ArrayBindingElement; - function isPropertyAccessOrQualifiedName(node: Node): node is PropertyAccessExpression | QualifiedName; - function isCallLikeExpression(node: Node): node is CallLikeExpression; - function isCallOrNewExpression(node: Node): node is CallExpression | NewExpression; - function isTemplateLiteral(node: Node): node is TemplateLiteral; - function isLeftHandSideExpression(node: Node): node is LeftHandSideExpression; - function isLiteralTypeLiteral(node: Node): node is NullLiteral | BooleanLiteral | LiteralExpression | PrefixUnaryExpression; + export function isTypeNode(node: Node): node is TypeNode; + export function isFunctionOrConstructorTypeNode(node: Node): node is FunctionTypeNode | ConstructorTypeNode; + export function isArrayBindingElement(node: Node): node is ArrayBindingElement; + export function isPropertyAccessOrQualifiedName(node: Node): node is PropertyAccessExpression | QualifiedName; + export function isCallLikeExpression(node: Node): node is CallLikeExpression; + export function isCallOrNewExpression(node: Node): node is CallExpression | NewExpression; + export function isTemplateLiteral(node: Node): node is TemplateLiteral; + export function isLeftHandSideExpression(node: Node): node is LeftHandSideExpression; + export function isLiteralTypeLiteral(node: Node): node is NullLiteral | BooleanLiteral | LiteralExpression | PrefixUnaryExpression; /** * Determines whether a node is an expression based only on its kind. */ - function isExpression(node: Node): node is Expression; - function isAssertionExpression(node: Node): node is AssertionExpression; - function isIterationStatement(node: Node, lookInLabeledStatements: false): node is IterationStatement; - function isIterationStatement(node: Node, lookInLabeledStatements: boolean): node is IterationStatement | LabeledStatement; - function isConciseBody(node: Node): node is ConciseBody; - function isForInitializer(node: Node): node is ForInitializer; - function isModuleBody(node: Node): node is ModuleBody; - function isNamedImportBindings(node: Node): node is NamedImportBindings; - function isDeclarationStatement(node: Node): node is DeclarationStatement; - function isStatement(node: Node): node is Statement; - function isModuleReference(node: Node): node is ModuleReference; - function isJsxTagNameExpression(node: Node): node is JsxTagNameExpression; - function isJsxChild(node: Node): node is JsxChild; - function isJsxAttributeLike(node: Node): node is JsxAttributeLike; - function isStringLiteralOrJsxExpression(node: Node): node is StringLiteral | JsxExpression; - function isJsxOpeningLikeElement(node: Node): node is JsxOpeningLikeElement; - function isCaseOrDefaultClause(node: Node): node is CaseOrDefaultClause; + export function isExpression(node: Node): node is Expression; + export function isAssertionExpression(node: Node): node is AssertionExpression; + export function isIterationStatement(node: Node, lookInLabeledStatements: false): node is IterationStatement; + export function isIterationStatement(node: Node, lookInLabeledStatements: boolean): node is IterationStatement | LabeledStatement; + export function isConciseBody(node: Node): node is ConciseBody; + export function isForInitializer(node: Node): node is ForInitializer; + export function isModuleBody(node: Node): node is ModuleBody; + export function isNamedImportBindings(node: Node): node is NamedImportBindings; + export function isDeclarationStatement(node: Node): node is DeclarationStatement; + export function isStatement(node: Node): node is Statement; + export function isModuleReference(node: Node): node is ModuleReference; + export function isJsxTagNameExpression(node: Node): node is JsxTagNameExpression; + export function isJsxChild(node: Node): node is JsxChild; + export function isJsxAttributeLike(node: Node): node is JsxAttributeLike; + export function isStringLiteralOrJsxExpression(node: Node): node is StringLiteral | JsxExpression; + export function isJsxOpeningLikeElement(node: Node): node is JsxOpeningLikeElement; + export function isCaseOrDefaultClause(node: Node): node is CaseOrDefaultClause; /** True if node is of a kind that may contain comment text. */ - function isJSDocCommentContainingNode(node: Node): boolean; - function isSetAccessor(node: Node): node is SetAccessorDeclaration; - function isGetAccessor(node: Node): node is GetAccessorDeclaration; + export function isJSDocCommentContainingNode(node: Node): boolean; + export function isSetAccessor(node: Node): node is SetAccessorDeclaration; + export function isGetAccessor(node: Node): node is GetAccessorDeclaration; /** True if has initializer node attached to it. */ - function hasOnlyExpressionInitializer(node: Node): node is HasExpressionInitializer; - function isObjectLiteralElement(node: Node): node is ObjectLiteralElement; - function isStringLiteralLike(node: Node | FileReference): node is StringLiteralLike; - function isJSDocLinkLike(node: Node): node is JSDocLink | JSDocLinkCode | JSDocLinkPlain; - function hasRestParameter(s: SignatureDeclaration | JSDocSignature): boolean; - function isRestParameter(node: ParameterDeclaration | JSDocParameterTag): boolean; - function isInternalDeclaration(node: Node, sourceFile?: SourceFile): boolean; - const unchangedTextChangeRange: TextChangeRange; - type ParameterPropertyDeclaration = ParameterDeclaration & { + export function hasOnlyExpressionInitializer(node: Node): node is HasExpressionInitializer; + export function isObjectLiteralElement(node: Node): node is ObjectLiteralElement; + export function isStringLiteralLike(node: Node | FileReference): node is StringLiteralLike; + export function isJSDocLinkLike(node: Node): node is JSDocLink | JSDocLinkCode | JSDocLinkPlain; + export function hasRestParameter(s: SignatureDeclaration | JSDocSignature): boolean; + export function isRestParameter(node: ParameterDeclaration | JSDocParameterTag): boolean; + export function isInternalDeclaration(node: Node, sourceFile?: SourceFile): boolean; + export const unchangedTextChangeRange: TextChangeRange; + export type ParameterPropertyDeclaration = ParameterDeclaration & { parent: ConstructorDeclaration; name: Identifier; }; - function isPartOfTypeNode(node: Node): boolean; + export function isPartOfTypeNode(node: Node): boolean; /** * This function checks multiple locations for JSDoc comments that apply to a host node. * At each location, the whole comment may apply to the node, or only a specific tag in @@ -8784,330 +11166,316 @@ declare namespace ts { * function b(/** JSDoc will be returned for `c` *\/ c) {} * ``` */ - function getJSDocCommentsAndTags(hostNode: Node): readonly (JSDoc | JSDocTag)[]; + export function getJSDocCommentsAndTags(hostNode: Node): readonly (JSDoc | JSDocTag)[]; /** * Create an external source map source file reference */ - function createSourceMapSource(fileName: string, text: string, skipTrivia?: (pos: number) => number): SourceMapSource; - function setOriginalNode(node: T, original: Node | undefined): T; - const factory: NodeFactory; + export function createSourceMapSource(fileName: string, text: string, skipTrivia?: (pos: number) => number): SourceMapSource; + export function setOriginalNode(node: T, original: Node | undefined): T; + export const factory: NodeFactory; /** * Clears any `EmitNode` entries from parse-tree nodes. * @param sourceFile A source file. */ - function disposeEmitNodes(sourceFile: SourceFile | undefined): void; + export function disposeEmitNodes(sourceFile: SourceFile | undefined): void; /** * Sets flags that control emit behavior of a node. */ - function setEmitFlags(node: T, emitFlags: EmitFlags): T; + export function setEmitFlags(node: T, emitFlags: EmitFlags): T; /** * Gets a custom text range to use when emitting source maps. */ - function getSourceMapRange(node: Node): SourceMapRange; + export function getSourceMapRange(node: Node): SourceMapRange; /** * Sets a custom text range to use when emitting source maps. */ - function setSourceMapRange(node: T, range: SourceMapRange | undefined): T; + export function setSourceMapRange(node: T, range: SourceMapRange | undefined): T; /** * Gets the TextRange to use for source maps for a token of a node. */ - function getTokenSourceMapRange(node: Node, token: SyntaxKind): SourceMapRange | undefined; + export function getTokenSourceMapRange(node: Node, token: SyntaxKind): SourceMapRange | undefined; /** * Sets the TextRange to use for source maps for a token of a node. */ - function setTokenSourceMapRange(node: T, token: SyntaxKind, range: SourceMapRange | undefined): T; + export function setTokenSourceMapRange(node: T, token: SyntaxKind, range: SourceMapRange | undefined): T; /** * Gets a custom text range to use when emitting comments. */ - function getCommentRange(node: Node): TextRange; + export function getCommentRange(node: Node): TextRange; /** * Sets a custom text range to use when emitting comments. */ - function setCommentRange(node: T, range: TextRange): T; - function getSyntheticLeadingComments(node: Node): SynthesizedComment[] | undefined; - function setSyntheticLeadingComments(node: T, comments: SynthesizedComment[] | undefined): T; - function addSyntheticLeadingComment(node: T, kind: SyntaxKind.SingleLineCommentTrivia | SyntaxKind.MultiLineCommentTrivia, text: string, hasTrailingNewLine?: boolean): T; - function getSyntheticTrailingComments(node: Node): SynthesizedComment[] | undefined; - function setSyntheticTrailingComments(node: T, comments: SynthesizedComment[] | undefined): T; - function addSyntheticTrailingComment(node: T, kind: SyntaxKind.SingleLineCommentTrivia | SyntaxKind.MultiLineCommentTrivia, text: string, hasTrailingNewLine?: boolean): T; - function moveSyntheticComments(node: T, original: Node): T; + export function setCommentRange(node: T, range: TextRange): T; + export function getSyntheticLeadingComments(node: Node): SynthesizedComment[] | undefined; + export function setSyntheticLeadingComments(node: T, comments: SynthesizedComment[] | undefined): T; + export function addSyntheticLeadingComment(node: T, kind: SyntaxKind.SingleLineCommentTrivia | SyntaxKind.MultiLineCommentTrivia, text: string, hasTrailingNewLine?: boolean): T; + export function getSyntheticTrailingComments(node: Node): SynthesizedComment[] | undefined; + export function setSyntheticTrailingComments(node: T, comments: SynthesizedComment[] | undefined): T; + export function addSyntheticTrailingComment(node: T, kind: SyntaxKind.SingleLineCommentTrivia | SyntaxKind.MultiLineCommentTrivia, text: string, hasTrailingNewLine?: boolean): T; + export function moveSyntheticComments(node: T, original: Node): T; /** * Gets the constant value to emit for an expression representing an enum. */ - function getConstantValue(node: AccessExpression): string | number | undefined; + export function getConstantValue(node: AccessExpression): string | number | undefined; /** * Sets the constant value to emit for an expression. */ - function setConstantValue(node: AccessExpression, value: string | number): AccessExpression; + export function setConstantValue(node: AccessExpression, value: string | number): AccessExpression; /** * Adds an EmitHelper to a node. */ - function addEmitHelper(node: T, helper: EmitHelper): T; + export function addEmitHelper(node: T, helper: EmitHelper): T; /** * Add EmitHelpers to a node. */ - function addEmitHelpers(node: T, helpers: EmitHelper[] | undefined): T; + export function addEmitHelpers(node: T, helpers: EmitHelper[] | undefined): T; /** * Removes an EmitHelper from a node. */ - function removeEmitHelper(node: Node, helper: EmitHelper): boolean; + export function removeEmitHelper(node: Node, helper: EmitHelper): boolean; /** * Gets the EmitHelpers of a node. */ - function getEmitHelpers(node: Node): EmitHelper[] | undefined; + export function getEmitHelpers(node: Node): EmitHelper[] | undefined; /** * Moves matching emit helpers from a source node to a target node. */ - function moveEmitHelpers(source: Node, target: Node, predicate: (helper: EmitHelper) => boolean): void; - function isNumericLiteral(node: Node): node is NumericLiteral; - function isBigIntLiteral(node: Node): node is BigIntLiteral; - function isStringLiteral(node: Node): node is StringLiteral; - function isJsxText(node: Node): node is JsxText; - function isRegularExpressionLiteral(node: Node): node is RegularExpressionLiteral; - function isNoSubstitutionTemplateLiteral(node: Node): node is NoSubstitutionTemplateLiteral; - function isTemplateHead(node: Node): node is TemplateHead; - function isTemplateMiddle(node: Node): node is TemplateMiddle; - function isTemplateTail(node: Node): node is TemplateTail; - function isDotDotDotToken(node: Node): node is DotDotDotToken; - function isPlusToken(node: Node): node is PlusToken; - function isMinusToken(node: Node): node is MinusToken; - function isAsteriskToken(node: Node): node is AsteriskToken; - function isExclamationToken(node: Node): node is ExclamationToken; - function isQuestionToken(node: Node): node is QuestionToken; - function isColonToken(node: Node): node is ColonToken; - function isQuestionDotToken(node: Node): node is QuestionDotToken; - function isEqualsGreaterThanToken(node: Node): node is EqualsGreaterThanToken; - function isIdentifier(node: Node): node is Identifier; - function isPrivateIdentifier(node: Node): node is PrivateIdentifier; - function isAssertsKeyword(node: Node): node is AssertsKeyword; - function isAwaitKeyword(node: Node): node is AwaitKeyword; - function isQualifiedName(node: Node): node is QualifiedName; - function isComputedPropertyName(node: Node): node is ComputedPropertyName; - function isTypeParameterDeclaration(node: Node): node is TypeParameterDeclaration; - function isParameter(node: Node): node is ParameterDeclaration; - function isDecorator(node: Node): node is Decorator; - function isPropertySignature(node: Node): node is PropertySignature; - function isPropertyDeclaration(node: Node): node is PropertyDeclaration; - function isMethodSignature(node: Node): node is MethodSignature; - function isMethodDeclaration(node: Node): node is MethodDeclaration; - function isClassStaticBlockDeclaration(node: Node): node is ClassStaticBlockDeclaration; - function isConstructorDeclaration(node: Node): node is ConstructorDeclaration; - function isGetAccessorDeclaration(node: Node): node is GetAccessorDeclaration; - function isSetAccessorDeclaration(node: Node): node is SetAccessorDeclaration; - function isCallSignatureDeclaration(node: Node): node is CallSignatureDeclaration; - function isConstructSignatureDeclaration(node: Node): node is ConstructSignatureDeclaration; - function isIndexSignatureDeclaration(node: Node): node is IndexSignatureDeclaration; - function isTypePredicateNode(node: Node): node is TypePredicateNode; - function isTypeReferenceNode(node: Node): node is TypeReferenceNode; - function isFunctionTypeNode(node: Node): node is FunctionTypeNode; - function isConstructorTypeNode(node: Node): node is ConstructorTypeNode; - function isTypeQueryNode(node: Node): node is TypeQueryNode; - function isTypeLiteralNode(node: Node): node is TypeLiteralNode; - function isArrayTypeNode(node: Node): node is ArrayTypeNode; - function isTupleTypeNode(node: Node): node is TupleTypeNode; - function isNamedTupleMember(node: Node): node is NamedTupleMember; - function isOptionalTypeNode(node: Node): node is OptionalTypeNode; - function isRestTypeNode(node: Node): node is RestTypeNode; - function isUnionTypeNode(node: Node): node is UnionTypeNode; - function isIntersectionTypeNode(node: Node): node is IntersectionTypeNode; - function isConditionalTypeNode(node: Node): node is ConditionalTypeNode; - function isInferTypeNode(node: Node): node is InferTypeNode; - function isParenthesizedTypeNode(node: Node): node is ParenthesizedTypeNode; - function isThisTypeNode(node: Node): node is ThisTypeNode; - function isTypeOperatorNode(node: Node): node is TypeOperatorNode; - function isIndexedAccessTypeNode(node: Node): node is IndexedAccessTypeNode; - function isMappedTypeNode(node: Node): node is MappedTypeNode; - function isLiteralTypeNode(node: Node): node is LiteralTypeNode; - function isImportTypeNode(node: Node): node is ImportTypeNode; - function isTemplateLiteralTypeSpan(node: Node): node is TemplateLiteralTypeSpan; - function isTemplateLiteralTypeNode(node: Node): node is TemplateLiteralTypeNode; - function isObjectBindingPattern(node: Node): node is ObjectBindingPattern; - function isArrayBindingPattern(node: Node): node is ArrayBindingPattern; - function isBindingElement(node: Node): node is BindingElement; - function isArrayLiteralExpression(node: Node): node is ArrayLiteralExpression; - function isObjectLiteralExpression(node: Node): node is ObjectLiteralExpression; - function isPropertyAccessExpression(node: Node): node is PropertyAccessExpression; - function isElementAccessExpression(node: Node): node is ElementAccessExpression; - function isCallExpression(node: Node): node is CallExpression; - function isNewExpression(node: Node): node is NewExpression; - function isTaggedTemplateExpression(node: Node): node is TaggedTemplateExpression; - function isTypeAssertionExpression(node: Node): node is TypeAssertion; - function isParenthesizedExpression(node: Node): node is ParenthesizedExpression; - function isFunctionExpression(node: Node): node is FunctionExpression; - function isArrowFunction(node: Node): node is ArrowFunction; - function isDeleteExpression(node: Node): node is DeleteExpression; - function isTypeOfExpression(node: Node): node is TypeOfExpression; - function isVoidExpression(node: Node): node is VoidExpression; - function isAwaitExpression(node: Node): node is AwaitExpression; - function isPrefixUnaryExpression(node: Node): node is PrefixUnaryExpression; - function isPostfixUnaryExpression(node: Node): node is PostfixUnaryExpression; - function isBinaryExpression(node: Node): node is BinaryExpression; - function isConditionalExpression(node: Node): node is ConditionalExpression; - function isTemplateExpression(node: Node): node is TemplateExpression; - function isYieldExpression(node: Node): node is YieldExpression; - function isSpreadElement(node: Node): node is SpreadElement; - function isClassExpression(node: Node): node is ClassExpression; - function isOmittedExpression(node: Node): node is OmittedExpression; - function isExpressionWithTypeArguments(node: Node): node is ExpressionWithTypeArguments; - function isAsExpression(node: Node): node is AsExpression; - function isSatisfiesExpression(node: Node): node is SatisfiesExpression; - function isNonNullExpression(node: Node): node is NonNullExpression; - function isMetaProperty(node: Node): node is MetaProperty; - function isSyntheticExpression(node: Node): node is SyntheticExpression; - function isPartiallyEmittedExpression(node: Node): node is PartiallyEmittedExpression; - function isCommaListExpression(node: Node): node is CommaListExpression; - function isTemplateSpan(node: Node): node is TemplateSpan; - function isSemicolonClassElement(node: Node): node is SemicolonClassElement; - function isBlock(node: Node): node is Block; - function isVariableStatement(node: Node): node is VariableStatement; - function isEmptyStatement(node: Node): node is EmptyStatement; - function isExpressionStatement(node: Node): node is ExpressionStatement; - function isIfStatement(node: Node): node is IfStatement; - function isDoStatement(node: Node): node is DoStatement; - function isWhileStatement(node: Node): node is WhileStatement; - function isForStatement(node: Node): node is ForStatement; - function isForInStatement(node: Node): node is ForInStatement; - function isForOfStatement(node: Node): node is ForOfStatement; - function isContinueStatement(node: Node): node is ContinueStatement; - function isBreakStatement(node: Node): node is BreakStatement; - function isReturnStatement(node: Node): node is ReturnStatement; - function isWithStatement(node: Node): node is WithStatement; - function isSwitchStatement(node: Node): node is SwitchStatement; - function isLabeledStatement(node: Node): node is LabeledStatement; - function isThrowStatement(node: Node): node is ThrowStatement; - function isTryStatement(node: Node): node is TryStatement; - function isDebuggerStatement(node: Node): node is DebuggerStatement; - function isVariableDeclaration(node: Node): node is VariableDeclaration; - function isVariableDeclarationList(node: Node): node is VariableDeclarationList; - function isFunctionDeclaration(node: Node): node is FunctionDeclaration; - function isClassDeclaration(node: Node): node is ClassDeclaration; - function isInterfaceDeclaration(node: Node): node is InterfaceDeclaration; - function isTypeAliasDeclaration(node: Node): node is TypeAliasDeclaration; - function isEnumDeclaration(node: Node): node is EnumDeclaration; - function isModuleDeclaration(node: Node): node is ModuleDeclaration; - function isModuleBlock(node: Node): node is ModuleBlock; - function isCaseBlock(node: Node): node is CaseBlock; - function isNamespaceExportDeclaration(node: Node): node is NamespaceExportDeclaration; - function isImportEqualsDeclaration(node: Node): node is ImportEqualsDeclaration; - function isImportDeclaration(node: Node): node is ImportDeclaration; - function isImportClause(node: Node): node is ImportClause; - function isImportTypeAssertionContainer(node: Node): node is ImportTypeAssertionContainer; + export function moveEmitHelpers(source: Node, target: Node, predicate: (helper: EmitHelper) => boolean): void; + export function isNumericLiteral(node: Node): node is NumericLiteral; + export function isBigIntLiteral(node: Node): node is BigIntLiteral; + export function isStringLiteral(node: Node): node is StringLiteral; + export function isJsxText(node: Node): node is JsxText; + export function isRegularExpressionLiteral(node: Node): node is RegularExpressionLiteral; + export function isNoSubstitutionTemplateLiteral(node: Node): node is NoSubstitutionTemplateLiteral; + export function isTemplateHead(node: Node): node is TemplateHead; + export function isTemplateMiddle(node: Node): node is TemplateMiddle; + export function isTemplateTail(node: Node): node is TemplateTail; + export function isDotDotDotToken(node: Node): node is DotDotDotToken; + export function isPlusToken(node: Node): node is PlusToken; + export function isMinusToken(node: Node): node is MinusToken; + export function isAsteriskToken(node: Node): node is AsteriskToken; + export function isExclamationToken(node: Node): node is ExclamationToken; + export function isQuestionToken(node: Node): node is QuestionToken; + export function isColonToken(node: Node): node is ColonToken; + export function isQuestionDotToken(node: Node): node is QuestionDotToken; + export function isEqualsGreaterThanToken(node: Node): node is EqualsGreaterThanToken; + export function isIdentifier(node: Node): node is Identifier; + export function isPrivateIdentifier(node: Node): node is PrivateIdentifier; + export function isAssertsKeyword(node: Node): node is AssertsKeyword; + export function isAwaitKeyword(node: Node): node is AwaitKeyword; + export function isQualifiedName(node: Node): node is QualifiedName; + export function isComputedPropertyName(node: Node): node is ComputedPropertyName; + export function isTypeParameterDeclaration(node: Node): node is TypeParameterDeclaration; + export function isParameter(node: Node): node is ParameterDeclaration; + export function isDecorator(node: Node): node is Decorator; + export function isPropertySignature(node: Node): node is PropertySignature; + export function isPropertyDeclaration(node: Node): node is PropertyDeclaration; + export function isMethodSignature(node: Node): node is MethodSignature; + export function isMethodDeclaration(node: Node): node is MethodDeclaration; + export function isClassStaticBlockDeclaration(node: Node): node is ClassStaticBlockDeclaration; + export function isConstructorDeclaration(node: Node): node is ConstructorDeclaration; + export function isGetAccessorDeclaration(node: Node): node is GetAccessorDeclaration; + export function isSetAccessorDeclaration(node: Node): node is SetAccessorDeclaration; + export function isCallSignatureDeclaration(node: Node): node is CallSignatureDeclaration; + export function isConstructSignatureDeclaration(node: Node): node is ConstructSignatureDeclaration; + export function isIndexSignatureDeclaration(node: Node): node is IndexSignatureDeclaration; + export function isTypePredicateNode(node: Node): node is TypePredicateNode; + export function isTypeReferenceNode(node: Node): node is TypeReferenceNode; + export function isFunctionTypeNode(node: Node): node is FunctionTypeNode; + export function isConstructorTypeNode(node: Node): node is ConstructorTypeNode; + export function isTypeQueryNode(node: Node): node is TypeQueryNode; + export function isTypeLiteralNode(node: Node): node is TypeLiteralNode; + export function isArrayTypeNode(node: Node): node is ArrayTypeNode; + export function isTupleTypeNode(node: Node): node is TupleTypeNode; + export function isNamedTupleMember(node: Node): node is NamedTupleMember; + export function isOptionalTypeNode(node: Node): node is OptionalTypeNode; + export function isRestTypeNode(node: Node): node is RestTypeNode; + export function isUnionTypeNode(node: Node): node is UnionTypeNode; + export function isIntersectionTypeNode(node: Node): node is IntersectionTypeNode; + export function isConditionalTypeNode(node: Node): node is ConditionalTypeNode; + export function isInferTypeNode(node: Node): node is InferTypeNode; + export function isParenthesizedTypeNode(node: Node): node is ParenthesizedTypeNode; + export function isThisTypeNode(node: Node): node is ThisTypeNode; + export function isTypeOperatorNode(node: Node): node is TypeOperatorNode; + export function isIndexedAccessTypeNode(node: Node): node is IndexedAccessTypeNode; + export function isMappedTypeNode(node: Node): node is MappedTypeNode; + export function isLiteralTypeNode(node: Node): node is LiteralTypeNode; + export function isImportTypeNode(node: Node): node is ImportTypeNode; + export function isTemplateLiteralTypeSpan(node: Node): node is TemplateLiteralTypeSpan; + export function isTemplateLiteralTypeNode(node: Node): node is TemplateLiteralTypeNode; + export function isObjectBindingPattern(node: Node): node is ObjectBindingPattern; + export function isArrayBindingPattern(node: Node): node is ArrayBindingPattern; + export function isBindingElement(node: Node): node is BindingElement; + export function isArrayLiteralExpression(node: Node): node is ArrayLiteralExpression; + export function isObjectLiteralExpression(node: Node): node is ObjectLiteralExpression; + export function isPropertyAccessExpression(node: Node): node is PropertyAccessExpression; + export function isElementAccessExpression(node: Node): node is ElementAccessExpression; + export function isCallExpression(node: Node): node is CallExpression; + export function isNewExpression(node: Node): node is NewExpression; + export function isTaggedTemplateExpression(node: Node): node is TaggedTemplateExpression; + export function isTypeAssertionExpression(node: Node): node is TypeAssertionExpression; + export function isParenthesizedExpression(node: Node): node is ParenthesizedExpression; + export function isFunctionExpression(node: Node): node is FunctionExpression; + export function isArrowFunction(node: Node): node is ArrowFunction; + export function isDeleteExpression(node: Node): node is DeleteExpression; + export function isTypeOfExpression(node: Node): node is TypeOfExpression; + export function isVoidExpression(node: Node): node is VoidExpression; + export function isAwaitExpression(node: Node): node is AwaitExpression; + export function isPrefixUnaryExpression(node: Node): node is PrefixUnaryExpression; + export function isPostfixUnaryExpression(node: Node): node is PostfixUnaryExpression; + export function isBinaryExpression(node: Node): node is BinaryExpression; + export function isConditionalExpression(node: Node): node is ConditionalExpression; + export function isTemplateExpression(node: Node): node is TemplateExpression; + export function isYieldExpression(node: Node): node is YieldExpression; + export function isSpreadElement(node: Node): node is SpreadElement; + export function isClassExpression(node: Node): node is ClassExpression; + export function isOmittedExpression(node: Node): node is OmittedExpression; + export function isExpressionWithTypeArguments(node: Node): node is ExpressionWithTypeArguments; + export function isAsExpression(node: Node): node is AsExpression; + export function isSatisfiesExpression(node: Node): node is SatisfiesExpression; + export function isNonNullExpression(node: Node): node is NonNullExpression; + export function isMetaProperty(node: Node): node is MetaProperty; + export function isSyntheticExpression(node: Node): node is SyntheticExpression; + export function isPartiallyEmittedExpression(node: Node): node is PartiallyEmittedExpression; + export function isCommaListExpression(node: Node): node is CommaListExpression; + export function isTemplateSpan(node: Node): node is TemplateSpan; + export function isSemicolonClassElement(node: Node): node is SemicolonClassElement; + export function isBlock(node: Node): node is Block; + export function isVariableStatement(node: Node): node is VariableStatement; + export function isEmptyStatement(node: Node): node is EmptyStatement; + export function isExpressionStatement(node: Node): node is ExpressionStatement; + export function isIfStatement(node: Node): node is IfStatement; + export function isDoStatement(node: Node): node is DoStatement; + export function isWhileStatement(node: Node): node is WhileStatement; + export function isForStatement(node: Node): node is ForStatement; + export function isForInStatement(node: Node): node is ForInStatement; + export function isForOfStatement(node: Node): node is ForOfStatement; + export function isContinueStatement(node: Node): node is ContinueStatement; + export function isBreakStatement(node: Node): node is BreakStatement; + export function isReturnStatement(node: Node): node is ReturnStatement; + export function isWithStatement(node: Node): node is WithStatement; + export function isSwitchStatement(node: Node): node is SwitchStatement; + export function isLabeledStatement(node: Node): node is LabeledStatement; + export function isThrowStatement(node: Node): node is ThrowStatement; + export function isTryStatement(node: Node): node is TryStatement; + export function isDebuggerStatement(node: Node): node is DebuggerStatement; + export function isVariableDeclaration(node: Node): node is VariableDeclaration; + export function isVariableDeclarationList(node: Node): node is VariableDeclarationList; + export function isFunctionDeclaration(node: Node): node is FunctionDeclaration; + export function isClassDeclaration(node: Node): node is ClassDeclaration; + export function isInterfaceDeclaration(node: Node): node is InterfaceDeclaration; + export function isTypeAliasDeclaration(node: Node): node is TypeAliasDeclaration; + export function isEnumDeclaration(node: Node): node is EnumDeclaration; + export function isModuleDeclaration(node: Node): node is ModuleDeclaration; + export function isModuleBlock(node: Node): node is ModuleBlock; + export function isCaseBlock(node: Node): node is CaseBlock; + export function isNamespaceExportDeclaration(node: Node): node is NamespaceExportDeclaration; + export function isImportEqualsDeclaration(node: Node): node is ImportEqualsDeclaration; + export function isImportDeclaration(node: Node): node is ImportDeclaration; + export function isImportClause(node: Node): node is ImportClause; + export function isImportTypeAssertionContainer(node: Node): node is ImportTypeAssertionContainer; /** @deprecated */ - function isAssertClause(node: Node): node is AssertClause; + export function isAssertClause(node: Node): node is AssertClause; /** @deprecated */ - function isAssertEntry(node: Node): node is AssertEntry; - function isImportAttributes(node: Node): node is ImportAttributes; - function isImportAttribute(node: Node): node is ImportAttribute; - function isNamespaceImport(node: Node): node is NamespaceImport; - function isNamespaceExport(node: Node): node is NamespaceExport; - function isNamedImports(node: Node): node is NamedImports; - function isImportSpecifier(node: Node): node is ImportSpecifier; - function isExportAssignment(node: Node): node is ExportAssignment; - function isExportDeclaration(node: Node): node is ExportDeclaration; - function isNamedExports(node: Node): node is NamedExports; - function isExportSpecifier(node: Node): node is ExportSpecifier; - function isModuleExportName(node: Node): node is ModuleExportName; - function isMissingDeclaration(node: Node): node is MissingDeclaration; - function isNotEmittedStatement(node: Node): node is NotEmittedStatement; - function isExternalModuleReference(node: Node): node is ExternalModuleReference; - function isJsxElement(node: Node): node is JsxElement; - function isJsxSelfClosingElement(node: Node): node is JsxSelfClosingElement; - function isJsxOpeningElement(node: Node): node is JsxOpeningElement; - function isJsxClosingElement(node: Node): node is JsxClosingElement; - function isJsxFragment(node: Node): node is JsxFragment; - function isJsxOpeningFragment(node: Node): node is JsxOpeningFragment; - function isJsxClosingFragment(node: Node): node is JsxClosingFragment; - function isJsxAttribute(node: Node): node is JsxAttribute; - function isJsxAttributes(node: Node): node is JsxAttributes; - function isJsxSpreadAttribute(node: Node): node is JsxSpreadAttribute; - function isJsxExpression(node: Node): node is JsxExpression; - function isJsxNamespacedName(node: Node): node is JsxNamespacedName; - function isCaseClause(node: Node): node is CaseClause; - function isDefaultClause(node: Node): node is DefaultClause; - function isHeritageClause(node: Node): node is HeritageClause; - function isCatchClause(node: Node): node is CatchClause; - function isPropertyAssignment(node: Node): node is PropertyAssignment; - function isShorthandPropertyAssignment(node: Node): node is ShorthandPropertyAssignment; - function isSpreadAssignment(node: Node): node is SpreadAssignment; - function isEnumMember(node: Node): node is EnumMember; - function isSourceFile(node: Node): node is SourceFile; - function isBundle(node: Node): node is Bundle; - function isJSDocTypeExpression(node: Node): node is JSDocTypeExpression; - function isJSDocNameReference(node: Node): node is JSDocNameReference; - function isJSDocMemberName(node: Node): node is JSDocMemberName; - function isJSDocLink(node: Node): node is JSDocLink; - function isJSDocLinkCode(node: Node): node is JSDocLinkCode; - function isJSDocLinkPlain(node: Node): node is JSDocLinkPlain; - function isJSDocAllType(node: Node): node is JSDocAllType; - function isJSDocUnknownType(node: Node): node is JSDocUnknownType; - function isJSDocNullableType(node: Node): node is JSDocNullableType; - function isJSDocNonNullableType(node: Node): node is JSDocNonNullableType; - function isJSDocOptionalType(node: Node): node is JSDocOptionalType; - function isJSDocFunctionType(node: Node): node is JSDocFunctionType; - function isJSDocVariadicType(node: Node): node is JSDocVariadicType; - function isJSDocNamepathType(node: Node): node is JSDocNamepathType; - function isJSDoc(node: Node): node is JSDoc; - function isJSDocTypeLiteral(node: Node): node is JSDocTypeLiteral; - function isJSDocSignature(node: Node): node is JSDocSignature; - function isJSDocAugmentsTag(node: Node): node is JSDocAugmentsTag; - function isJSDocAuthorTag(node: Node): node is JSDocAuthorTag; - function isJSDocClassTag(node: Node): node is JSDocClassTag; - function isJSDocCallbackTag(node: Node): node is JSDocCallbackTag; - function isJSDocPublicTag(node: Node): node is JSDocPublicTag; - function isJSDocPrivateTag(node: Node): node is JSDocPrivateTag; - function isJSDocProtectedTag(node: Node): node is JSDocProtectedTag; - function isJSDocReadonlyTag(node: Node): node is JSDocReadonlyTag; - function isJSDocOverrideTag(node: Node): node is JSDocOverrideTag; - function isJSDocOverloadTag(node: Node): node is JSDocOverloadTag; - function isJSDocDeprecatedTag(node: Node): node is JSDocDeprecatedTag; - function isJSDocSeeTag(node: Node): node is JSDocSeeTag; - function isJSDocEnumTag(node: Node): node is JSDocEnumTag; - function isJSDocParameterTag(node: Node): node is JSDocParameterTag; - function isJSDocReturnTag(node: Node): node is JSDocReturnTag; - function isJSDocThisTag(node: Node): node is JSDocThisTag; - function isJSDocTypeTag(node: Node): node is JSDocTypeTag; - function isJSDocTemplateTag(node: Node): node is JSDocTemplateTag; - function isJSDocTypedefTag(node: Node): node is JSDocTypedefTag; - function isJSDocUnknownTag(node: Node): node is JSDocUnknownTag; - function isJSDocPropertyTag(node: Node): node is JSDocPropertyTag; - function isJSDocImplementsTag(node: Node): node is JSDocImplementsTag; - function isJSDocSatisfiesTag(node: Node): node is JSDocSatisfiesTag; - function isJSDocThrowsTag(node: Node): node is JSDocThrowsTag; - function isJSDocImportTag(node: Node): node is JSDocImportTag; - function isQuestionOrExclamationToken(node: Node): node is QuestionToken | ExclamationToken; - function isIdentifierOrThisTypeNode(node: Node): node is Identifier | ThisTypeNode; - function isReadonlyKeywordOrPlusOrMinusToken(node: Node): node is ReadonlyKeyword | PlusToken | MinusToken; - function isQuestionOrPlusOrMinusToken(node: Node): node is QuestionToken | PlusToken | MinusToken; - function isModuleName(node: Node): node is ModuleName; - function isBinaryOperatorToken(node: Node): node is BinaryOperatorToken; - function setTextRange(range: T, location: TextRange | undefined): T; - function canHaveModifiers(node: Node): node is HasModifiers; - function canHaveDecorators(node: Node): node is HasDecorators; - /** - * Invokes a callback for each child of the given node. The 'cbNode' callback is invoked for all child nodes - * stored in properties. If a 'cbNodes' callback is specified, it is invoked for embedded arrays; otherwise, - * embedded arrays are flattened and the 'cbNode' callback is invoked for each element. If a callback returns - * a truthy value, iteration stops and that value is returned. Otherwise, undefined is returned. - * - * @param node a given node to visit its children - * @param cbNode a callback to be invoked for all child nodes - * @param cbNodes a callback to be invoked for embedded array - * - * @remarks `forEachChild` must visit the children of a node in the order - * that they appear in the source code. The language service depends on this property to locate nodes by position. - */ - function forEachChild(node: Node, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined; - function createSourceFile(fileName: string, sourceText: string, languageVersionOrOptions: ScriptTarget | CreateSourceFileOptions, setParentNodes?: boolean, scriptKind?: ScriptKind): SourceFile; - function parseIsolatedEntityName(text: string, languageVersion: ScriptTarget): EntityName | undefined; + export function isAssertEntry(node: Node): node is AssertEntry; + export function isImportAttributes(node: Node): node is ImportAttributes; + export function isImportAttribute(node: Node): node is ImportAttribute; + export function isNamespaceImport(node: Node): node is NamespaceImport; + export function isNamespaceExport(node: Node): node is NamespaceExport; + export function isNamedImports(node: Node): node is NamedImports; + export function isImportSpecifier(node: Node): node is ImportSpecifier; + export function isExportAssignment(node: Node): node is ExportAssignment; + export function isExportDeclaration(node: Node): node is ExportDeclaration; + export function isNamedExports(node: Node): node is NamedExports; + export function isExportSpecifier(node: Node): node is ExportSpecifier; + export function isModuleExportName(node: Node): node is ModuleExportName; + export function isMissingDeclaration(node: Node): node is MissingDeclaration; + export function isNotEmittedStatement(node: Node): node is NotEmittedStatement; + export function isExternalModuleReference(node: Node): node is ExternalModuleReference; + export function isJsxElement(node: Node): node is JsxElement; + export function isJsxSelfClosingElement(node: Node): node is JsxSelfClosingElement; + export function isJsxOpeningElement(node: Node): node is JsxOpeningElement; + export function isJsxClosingElement(node: Node): node is JsxClosingElement; + export function isJsxFragment(node: Node): node is JsxFragment; + export function isJsxOpeningFragment(node: Node): node is JsxOpeningFragment; + export function isJsxClosingFragment(node: Node): node is JsxClosingFragment; + export function isJsxAttribute(node: Node): node is JsxAttribute; + export function isJsxAttributes(node: Node): node is JsxAttributes; + export function isJsxSpreadAttribute(node: Node): node is JsxSpreadAttribute; + export function isJsxExpression(node: Node): node is JsxExpression; + export function isJsxNamespacedName(node: Node): node is JsxNamespacedName; + export function isCaseClause(node: Node): node is CaseClause; + export function isDefaultClause(node: Node): node is DefaultClause; + export function isHeritageClause(node: Node): node is HeritageClause; + export function isCatchClause(node: Node): node is CatchClause; + export function isPropertyAssignment(node: Node): node is PropertyAssignment; + export function isShorthandPropertyAssignment(node: Node): node is ShorthandPropertyAssignment; + export function isSpreadAssignment(node: Node): node is SpreadAssignment; + export function isEnumMember(node: Node): node is EnumMember; + export function isSourceFile(node: Node): node is SourceFile; + export function isBundle(node: Node): node is Bundle; + export function isJSDocTypeExpression(node: Node): node is JSDocTypeExpression; + export function isJSDocNameReference(node: Node): node is JSDocNameReference; + export function isJSDocMemberName(node: Node): node is JSDocMemberName; + export function isJSDocLink(node: Node): node is JSDocLink; + export function isJSDocLinkCode(node: Node): node is JSDocLinkCode; + export function isJSDocLinkPlain(node: Node): node is JSDocLinkPlain; + export function isJSDocAllType(node: Node): node is JSDocAllType; + export function isJSDocUnknownType(node: Node): node is JSDocUnknownType; + export function isJSDocNullableType(node: Node): node is JSDocNullableType; + export function isJSDocNonNullableType(node: Node): node is JSDocNonNullableType; + export function isJSDocOptionalType(node: Node): node is JSDocOptionalType; + export function isJSDocFunctionType(node: Node): node is JSDocFunctionType; + export function isJSDocVariadicType(node: Node): node is JSDocVariadicType; + export function isJSDocNamepathType(node: Node): node is JSDocNamepathType; + export function isJSDoc(node: Node): node is JSDoc; + export function isJSDocTypeLiteral(node: Node): node is JSDocTypeLiteral; + export function isJSDocSignature(node: Node): node is JSDocSignature; + export function isJSDocAugmentsTag(node: Node): node is JSDocAugmentsTag; + export function isJSDocAuthorTag(node: Node): node is JSDocAuthorTag; + export function isJSDocClassTag(node: Node): node is JSDocClassTag; + export function isJSDocCallbackTag(node: Node): node is JSDocCallbackTag; + export function isJSDocPublicTag(node: Node): node is JSDocPublicTag; + export function isJSDocPrivateTag(node: Node): node is JSDocPrivateTag; + export function isJSDocProtectedTag(node: Node): node is JSDocProtectedTag; + export function isJSDocReadonlyTag(node: Node): node is JSDocReadonlyTag; + export function isJSDocOverrideTag(node: Node): node is JSDocOverrideTag; + export function isJSDocOverloadTag(node: Node): node is JSDocOverloadTag; + export function isJSDocDeprecatedTag(node: Node): node is JSDocDeprecatedTag; + export function isJSDocSeeTag(node: Node): node is JSDocSeeTag; + export function isJSDocEnumTag(node: Node): node is JSDocEnumTag; + export function isJSDocParameterTag(node: Node): node is JSDocParameterTag; + export function isJSDocReturnTag(node: Node): node is JSDocReturnTag; + export function isJSDocThisTag(node: Node): node is JSDocThisTag; + export function isJSDocTypeTag(node: Node): node is JSDocTypeTag; + export function isJSDocTemplateTag(node: Node): node is JSDocTemplateTag; + export function isJSDocTypedefTag(node: Node): node is JSDocTypedefTag; + export function isJSDocUnknownTag(node: Node): node is JSDocUnknownTag; + export function isJSDocPropertyTag(node: Node): node is JSDocPropertyTag; + export function isJSDocImplementsTag(node: Node): node is JSDocImplementsTag; + export function isJSDocSatisfiesTag(node: Node): node is JSDocSatisfiesTag; + export function isJSDocThrowsTag(node: Node): node is JSDocThrowsTag; + export function isJSDocImportTag(node: Node): node is JSDocImportTag; + export function isQuestionOrExclamationToken(node: Node): node is QuestionToken | ExclamationToken; + export function isIdentifierOrThisTypeNode(node: Node): node is Identifier | ThisTypeNode; + export function isReadonlyKeywordOrPlusOrMinusToken(node: Node): node is ReadonlyKeyword | PlusToken | MinusToken; + export function isQuestionOrPlusOrMinusToken(node: Node): node is QuestionToken | PlusToken | MinusToken; + export function isModuleName(node: Node): node is ModuleName; + export function isBinaryOperatorToken(node: Node): node is BinaryOperatorToken; + export function setTextRange(range: T, location: TextRange | undefined): T; + export function canHaveModifiers(node: Node): node is HasModifiers; + export function canHaveDecorators(node: Node): node is HasDecorators; + export function createSourceFile(fileName: string, sourceText: string, languageVersionOrOptions: ScriptTarget | CreateSourceFileOptions, setParentNodes?: boolean, scriptKind?: ScriptKind): SourceFile; + export function parseIsolatedEntityName(text: string, languageVersion: ScriptTarget): EntityName | undefined; /** * Parse json text into SyntaxTree and return node and parse errors if any * @param fileName * @param sourceText */ - function parseJsonText(fileName: string, sourceText: string): JsonSourceFile; - function isExternalModule(file: SourceFile): boolean; - function updateSourceFile(sourceFile: SourceFile, newText: string, textChangeRange: TextChangeRange, aggressiveChecks?: boolean): SourceFile; - interface CreateSourceFileOptions { + export function parseJsonText(fileName: string, sourceText: string): JsonSourceFile; + export function isExternalModule(file: SourceFile): boolean; + export function updateSourceFile(sourceFile: SourceFile, newText: string, textChangeRange: TextChangeRange, aggressiveChecks?: boolean): SourceFile; + export interface CreateSourceFileOptions { languageVersion: ScriptTarget; /** * Controls the format the file is detected as - this can be derived from only the path @@ -9123,17 +11491,45 @@ declare namespace ts { setExternalModuleIndicator?: (file: SourceFile) => void; jsDocParsingMode?: JSDocParsingMode; } - function parseCommandLine(commandLine: readonly string[], readFile?: (path: string) => string | undefined): ParsedCommandLine; - function parseBuildCommand(commandLine: readonly string[]): ParsedBuildCommand; + /** + * Invokes a callback for each child of the given node. The 'cbNode' callback is invoked for all child nodes + * stored in properties. If a 'cbNodes' callback is specified, it is invoked for embedded arrays; otherwise, + * embedded arrays are flattened and the 'cbNode' callback is invoked for each element. If a callback returns + * a truthy value, iteration stops and that value is returned. Otherwise, undefined is returned. + * + * @param node a given node to visit its children + * @param cbNode a callback to be invoked for all child nodes + * @param cbNodes a callback to be invoked for embedded array + * + * @remarks `forEachChild` must visit the children of a node in the order + * that they appear in the source code. The language service depends on this property to locate nodes by position. + */ + export function forEachChild(node: Node, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined; + /** + * Invokes a callback for each child of the given node. The 'cbNode' callback is invoked for all child nodes + * stored in properties. If a 'cbNodes' callback is specified, it is invoked for embedded arrays; otherwise, + * embedded arrays are flattened and the 'cbNode' callback is invoked for each element. If a callback returns + * a truthy value, iteration stops and that value is returned. Otherwise, undefined is returned. + * + * @param node a given node to visit its children + * @param cbNode a callback to be invoked for all child nodes + * @param cbNodes a callback to be invoked for embedded array + * + * @remarks `forEachChild` must visit the children of a node in the order + * that they appear in the source code. The language service depends on this property to locate nodes by position. + */ + export function astForEachChild(node: AstNode, cbNode: (node: AstNode) => T | undefined, cbNodes?: (nodes: AstNodeArray) => T | undefined): T | undefined; + export function parseCommandLine(commandLine: readonly string[], readFile?: (path: string) => string | undefined): ParsedCommandLine; + export function parseBuildCommand(commandLine: readonly string[]): ParsedBuildCommand; /** * Reads the config file, reports errors if any and exits if the config file cannot be found */ - function getParsedCommandLineOfConfigFile(configFileName: string, optionsToExtend: CompilerOptions | undefined, host: ParseConfigFileHost, extendedConfigCache?: Map, watchOptionsToExtend?: WatchOptions, extraFileExtensions?: readonly FileExtensionInfo[]): ParsedCommandLine | undefined; + export function getParsedCommandLineOfConfigFile(configFileName: string, optionsToExtend: CompilerOptions | undefined, host: ParseConfigFileHost, extendedConfigCache?: Map, watchOptionsToExtend?: WatchOptions, extraFileExtensions?: readonly FileExtensionInfo[]): ParsedCommandLine | undefined; /** * Read tsconfig.json file * @param fileName The path to the config file */ - function readConfigFile(fileName: string, readFile: (path: string) => string | undefined): { + export function readConfigFile(fileName: string, readFile: (path: string) => string | undefined): { config?: any; error?: Diagnostic; }; @@ -9142,7 +11538,7 @@ declare namespace ts { * @param fileName The path to the config file * @param jsonText The text of the config file */ - function parseConfigFileTextToJson(fileName: string, jsonText: string): { + export function parseConfigFileTextToJson(fileName: string, jsonText: string): { config?: any; error?: Diagnostic; }; @@ -9150,11 +11546,11 @@ declare namespace ts { * Read tsconfig.json file * @param fileName The path to the config file */ - function readJsonConfigFile(fileName: string, readFile: (path: string) => string | undefined): TsConfigSourceFile; + export function readJsonConfigFile(fileName: string, readFile: (path: string) => string | undefined): TsConfigSourceFile; /** * Convert the json syntax tree into the json value */ - function convertToObject(sourceFile: JsonSourceFile, errors: Diagnostic[]): any; + export function convertToObject(sourceFile: JsonSourceFile, errors: Diagnostic[]): any; /** * Parse the contents of a config file (tsconfig.json). * @param json The contents of the config file to parse @@ -9162,7 +11558,7 @@ declare namespace ts { * @param basePath A root directory to resolve relative path entries in the config * file to. e.g. outDir */ - function parseJsonConfigFileContent(json: any, host: ParseConfigHost, basePath: string, existingOptions?: CompilerOptions, configFileName?: string, resolutionStack?: Path[], extraFileExtensions?: readonly FileExtensionInfo[], extendedConfigCache?: Map, existingWatchOptions?: WatchOptions): ParsedCommandLine; + export function parseJsonConfigFileContent(json: any, host: ParseConfigHost, basePath: string, existingOptions?: CompilerOptions, configFileName?: string, resolutionStack?: Path[], extraFileExtensions?: readonly FileExtensionInfo[], extendedConfigCache?: Map, existingWatchOptions?: WatchOptions): ParsedCommandLine; /** * Parse the contents of a config file (tsconfig.json). * @param jsonNode The contents of the config file to parse @@ -9170,27 +11566,27 @@ declare namespace ts { * @param basePath A root directory to resolve relative path entries in the config * file to. e.g. outDir */ - function parseJsonSourceFileConfigFileContent(sourceFile: TsConfigSourceFile, host: ParseConfigHost, basePath: string, existingOptions?: CompilerOptions, configFileName?: string, resolutionStack?: Path[], extraFileExtensions?: readonly FileExtensionInfo[], extendedConfigCache?: Map, existingWatchOptions?: WatchOptions): ParsedCommandLine; - function convertCompilerOptionsFromJson(jsonOptions: any, basePath: string, configFileName?: string): { + export function parseJsonSourceFileConfigFileContent(sourceFile: TsConfigSourceFile, host: ParseConfigHost, basePath: string, existingOptions?: CompilerOptions, configFileName?: string, resolutionStack?: Path[], extraFileExtensions?: readonly FileExtensionInfo[], extendedConfigCache?: Map, existingWatchOptions?: WatchOptions): ParsedCommandLine; + export function convertCompilerOptionsFromJson(jsonOptions: any, basePath: string, configFileName?: string): { options: CompilerOptions; errors: Diagnostic[]; }; - function convertTypeAcquisitionFromJson(jsonOptions: any, basePath: string, configFileName?: string): { + export function convertTypeAcquisitionFromJson(jsonOptions: any, basePath: string, configFileName?: string): { options: TypeAcquisition; errors: Diagnostic[]; }; /** Parsed command line for build */ - interface ParsedBuildCommand { + export interface ParsedBuildCommand { buildOptions: BuildOptions; watchOptions: WatchOptions | undefined; projects: string[]; errors: Diagnostic[]; } - type DiagnosticReporter = (diagnostic: Diagnostic) => void; + export type DiagnosticReporter = (diagnostic: Diagnostic) => void; /** * Reports config file diagnostics */ - interface ConfigFileDiagnosticsReporter { + export interface ConfigFileDiagnosticsReporter { /** * Reports unrecoverable error when parsing config file */ @@ -9199,10 +11595,10 @@ declare namespace ts { /** * Interface extending ParseConfigHost to support ParseConfigFile that reads config file and reports errors */ - interface ParseConfigFileHost extends ParseConfigHost, ConfigFileDiagnosticsReporter { + export interface ParseConfigFileHost extends ParseConfigHost, ConfigFileDiagnosticsReporter { getCurrentDirectory(): string; } - interface ParsedTsconfig { + export interface ParsedTsconfig { raw: any; options?: CompilerOptions; watchOptions?: WatchOptions; @@ -9212,17 +11608,17 @@ declare namespace ts { */ extendedConfigPath?: string | string[]; } - interface ExtendedConfigCacheEntry { + export interface ExtendedConfigCacheEntry { extendedResult: TsConfigSourceFile; extendedConfig: ParsedTsconfig | undefined; } - function getEffectiveTypeRoots(options: CompilerOptions, host: GetEffectiveTypeRootsHost): string[] | undefined; + export function getEffectiveTypeRoots(options: CompilerOptions, host: GetEffectiveTypeRootsHost): string[] | undefined; /** * @param {string | undefined} containingFile - file that contains type reference directive, can be undefined if containing file is unknown. * This is possible in case if resolution is performed for directives specified via 'types' parameter. In this case initial path for secondary lookups * is assumed to be the same as root directory of the project. */ - function resolveTypeReferenceDirective(typeReferenceDirectiveName: string, containingFile: string | undefined, options: CompilerOptions, host: ModuleResolutionHost, redirectedReference?: ResolvedProjectReference, cache?: TypeReferenceDirectiveResolutionCache, resolutionMode?: ResolutionMode): ResolvedTypeReferenceDirectiveWithFailedLookupLocations; + export function resolveTypeReferenceDirective(typeReferenceDirectiveName: string, containingFile: string | undefined, options: CompilerOptions, host: ModuleResolutionHost, redirectedReference?: ResolvedProjectReference, cache?: TypeReferenceDirectiveResolutionCache, resolutionMode?: ResolutionMode): ResolvedTypeReferenceDirectiveWithFailedLookupLocations; /** * Given a set of options, returns the set of type directive names * that should be included for this program automatically. @@ -9231,17 +11627,17 @@ declare namespace ts { * More type directives might appear in the program later as a result of loading actual source files; * this list is only the set of defaults that are implicitly included. */ - function getAutomaticTypeDirectiveNames(options: CompilerOptions, host: ModuleResolutionHost): string[]; - function createModuleResolutionCache(currentDirectory: string, getCanonicalFileName: (s: string) => string, options?: CompilerOptions, packageJsonInfoCache?: PackageJsonInfoCache): ModuleResolutionCache; - function createTypeReferenceDirectiveResolutionCache(currentDirectory: string, getCanonicalFileName: (s: string) => string, options?: CompilerOptions, packageJsonInfoCache?: PackageJsonInfoCache): TypeReferenceDirectiveResolutionCache; - function resolveModuleNameFromCache(moduleName: string, containingFile: string, cache: ModuleResolutionCache, mode?: ResolutionMode): ResolvedModuleWithFailedLookupLocations | undefined; - function resolveModuleName(moduleName: string, containingFile: string, compilerOptions: CompilerOptions, host: ModuleResolutionHost, cache?: ModuleResolutionCache, redirectedReference?: ResolvedProjectReference, resolutionMode?: ResolutionMode): ResolvedModuleWithFailedLookupLocations; - function bundlerModuleNameResolver(moduleName: string, containingFile: string, compilerOptions: CompilerOptions, host: ModuleResolutionHost, cache?: ModuleResolutionCache, redirectedReference?: ResolvedProjectReference): ResolvedModuleWithFailedLookupLocations; - function nodeModuleNameResolver(moduleName: string, containingFile: string, compilerOptions: CompilerOptions, host: ModuleResolutionHost, cache?: ModuleResolutionCache, redirectedReference?: ResolvedProjectReference): ResolvedModuleWithFailedLookupLocations; - function classicNameResolver(moduleName: string, containingFile: string, compilerOptions: CompilerOptions, host: ModuleResolutionHost, cache?: NonRelativeModuleNameResolutionCache, redirectedReference?: ResolvedProjectReference): ResolvedModuleWithFailedLookupLocations; - interface TypeReferenceDirectiveResolutionCache extends PerDirectoryResolutionCache, NonRelativeNameResolutionCache, PackageJsonInfoCache { + export function getAutomaticTypeDirectiveNames(options: CompilerOptions, host: ModuleResolutionHost): string[]; + export function createModuleResolutionCache(currentDirectory: string, getCanonicalFileName: (s: string) => string, options?: CompilerOptions, packageJsonInfoCache?: PackageJsonInfoCache): ModuleResolutionCache; + export function createTypeReferenceDirectiveResolutionCache(currentDirectory: string, getCanonicalFileName: (s: string) => string, options?: CompilerOptions, packageJsonInfoCache?: PackageJsonInfoCache): TypeReferenceDirectiveResolutionCache; + export function resolveModuleNameFromCache(moduleName: string, containingFile: string, cache: ModuleResolutionCache, mode?: ResolutionMode): ResolvedModuleWithFailedLookupLocations | undefined; + export function resolveModuleName(moduleName: string, containingFile: string, compilerOptions: CompilerOptions, host: ModuleResolutionHost, cache?: ModuleResolutionCache, redirectedReference?: ResolvedProjectReference, resolutionMode?: ResolutionMode): ResolvedModuleWithFailedLookupLocations; + export function bundlerModuleNameResolver(moduleName: string, containingFile: string, compilerOptions: CompilerOptions, host: ModuleResolutionHost, cache?: ModuleResolutionCache, redirectedReference?: ResolvedProjectReference): ResolvedModuleWithFailedLookupLocations; + export function nodeModuleNameResolver(moduleName: string, containingFile: string, compilerOptions: CompilerOptions, host: ModuleResolutionHost, cache?: ModuleResolutionCache, redirectedReference?: ResolvedProjectReference): ResolvedModuleWithFailedLookupLocations; + export function classicNameResolver(moduleName: string, containingFile: string, compilerOptions: CompilerOptions, host: ModuleResolutionHost, cache?: NonRelativeModuleNameResolutionCache, redirectedReference?: ResolvedProjectReference): ResolvedModuleWithFailedLookupLocations; + export interface TypeReferenceDirectiveResolutionCache extends PerDirectoryResolutionCache, NonRelativeNameResolutionCache, PackageJsonInfoCache { } - interface ModeAwareCache { + export interface ModeAwareCache { get(key: string, mode: ResolutionMode): T | undefined; set(key: string, mode: ResolutionMode, value: T): this; delete(key: string, mode: ResolutionMode): this; @@ -9253,7 +11649,7 @@ declare namespace ts { * Cached resolutions per containing directory. * This assumes that any module id will have the same resolution for sibling files located in the same folder. */ - interface PerDirectoryResolutionCache { + export interface PerDirectoryResolutionCache { getFromDirectoryCache(name: string, mode: ResolutionMode, directoryName: string, redirectedReference: ResolvedProjectReference | undefined): T | undefined; getOrCreateCacheForDirectory(directoryName: string, redirectedReference?: ResolvedProjectReference): ModeAwareCache; clear(): void; @@ -9263,7 +11659,7 @@ declare namespace ts { */ update(options: CompilerOptions): void; } - interface NonRelativeNameResolutionCache { + export interface NonRelativeNameResolutionCache { getFromNonRelativeNameCache(nonRelativeName: string, mode: ResolutionMode, directoryName: string, redirectedReference: ResolvedProjectReference | undefined): T | undefined; getOrCreateCacheForNonRelativeName(nonRelativeName: string, mode: ResolutionMode, redirectedReference?: ResolvedProjectReference): PerNonRelativeNameCache; clear(): void; @@ -9273,25 +11669,25 @@ declare namespace ts { */ update(options: CompilerOptions): void; } - interface PerNonRelativeNameCache { + export interface PerNonRelativeNameCache { get(directory: string): T | undefined; set(directory: string, result: T): void; } - interface ModuleResolutionCache extends PerDirectoryResolutionCache, NonRelativeModuleNameResolutionCache, PackageJsonInfoCache { + export interface ModuleResolutionCache extends PerDirectoryResolutionCache, NonRelativeModuleNameResolutionCache, PackageJsonInfoCache { getPackageJsonInfoCache(): PackageJsonInfoCache; } /** * Stored map from non-relative module name to a table: directory -> result of module lookup in this directory * We support only non-relative module names because resolution of relative module names is usually more deterministic and thus less expensive. */ - interface NonRelativeModuleNameResolutionCache extends NonRelativeNameResolutionCache, PackageJsonInfoCache { + export interface NonRelativeModuleNameResolutionCache extends NonRelativeNameResolutionCache, PackageJsonInfoCache { /** @deprecated Use getOrCreateCacheForNonRelativeName */ getOrCreateCacheForModuleName(nonRelativeModuleName: string, mode: ResolutionMode, redirectedReference?: ResolvedProjectReference): PerModuleNameCache; } - interface PackageJsonInfoCache { + export interface PackageJsonInfoCache { clear(): void; } - type PerModuleNameCache = PerNonRelativeNameCache; + export type PerModuleNameCache = PerNonRelativeNameCache; /** * Visits a Node using the supplied visitor, possibly returning a new Node in its place. * @@ -9306,7 +11702,7 @@ declare namespace ts { * @param test A callback to execute to verify the Node is valid. * @param lift An optional callback to execute to lift a NodeArray into a valid Node. */ - function visitNode(node: TIn, visitor: Visitor, TVisited>, test: (node: Node) => node is TOut, lift?: (node: readonly Node[]) => Node): TOut | (TIn & undefined) | (TVisited & undefined); + export function visitNode(node: TIn, visitor: Visitor, TVisited>, test: (node: Node) => node is TOut, lift?: (node: readonly Node[]) => Node): TOut | (TIn & undefined) | (TVisited & undefined); /** * Visits a Node using the supplied visitor, possibly returning a new Node in its place. * @@ -9321,7 +11717,7 @@ declare namespace ts { * @param test A callback to execute to verify the Node is valid. * @param lift An optional callback to execute to lift a NodeArray into a valid Node. */ - function visitNode(node: TIn, visitor: Visitor, TVisited>, test?: (node: Node) => boolean, lift?: (node: readonly Node[]) => Node): Node | (TIn & undefined) | (TVisited & undefined); + export function visitNode(node: TIn, visitor: Visitor, TVisited>, test?: (node: Node) => boolean, lift?: (node: readonly Node[]) => Node): Node | (TIn & undefined) | (TVisited & undefined); /** * Visits a NodeArray using the supplied visitor, possibly returning a new NodeArray in its place. * @@ -9337,7 +11733,7 @@ declare namespace ts { * @param start An optional value indicating the starting offset at which to start visiting. * @param count An optional value indicating the maximum number of nodes to visit. */ - function visitNodes | undefined, TOut extends Node>(nodes: TInArray, visitor: Visitor, test: (node: Node) => node is TOut, start?: number, count?: number): NodeArray | (TInArray & undefined); + export function visitNodes | undefined, TOut extends Node>(nodes: TInArray, visitor: Visitor, test: (node: Node) => node is TOut, start?: number, count?: number): NodeArray | (TInArray & undefined); /** * Visits a NodeArray using the supplied visitor, possibly returning a new NodeArray in its place. * @@ -9353,43 +11749,43 @@ declare namespace ts { * @param start An optional value indicating the starting offset at which to start visiting. * @param count An optional value indicating the maximum number of nodes to visit. */ - function visitNodes | undefined>(nodes: TInArray, visitor: Visitor, test?: (node: Node) => boolean, start?: number, count?: number): NodeArray | (TInArray & undefined); + export function visitNodes | undefined>(nodes: TInArray, visitor: Visitor, test?: (node: Node) => boolean, start?: number, count?: number): NodeArray | (TInArray & undefined); /** * Starts a new lexical environment and visits a statement list, ending the lexical environment * and merging hoisted declarations upon completion. */ - function visitLexicalEnvironment(statements: NodeArray, visitor: Visitor, context: TransformationContext, start?: number, ensureUseStrict?: boolean, nodesVisitor?: NodesVisitor): NodeArray; + export function visitLexicalEnvironment(statements: NodeArray, visitor: Visitor, context: TransformationContext, start?: number, ensureUseStrict?: boolean, nodesVisitor?: NodesVisitor): NodeArray; /** * Starts a new lexical environment and visits a parameter list, suspending the lexical * environment upon completion. */ - function visitParameterList(nodes: NodeArray, visitor: Visitor, context: TransformationContext, nodesVisitor?: NodesVisitor): NodeArray; - function visitParameterList(nodes: NodeArray | undefined, visitor: Visitor, context: TransformationContext, nodesVisitor?: NodesVisitor): NodeArray | undefined; + export function visitParameterList(nodes: NodeArray, visitor: Visitor, context: TransformationContext, nodesVisitor?: NodesVisitor): NodeArray; + export function visitParameterList(nodes: NodeArray | undefined, visitor: Visitor, context: TransformationContext, nodesVisitor?: NodesVisitor): NodeArray | undefined; /** * Resumes a suspended lexical environment and visits a function body, ending the lexical * environment and merging hoisted declarations upon completion. */ - function visitFunctionBody(node: FunctionBody, visitor: Visitor, context: TransformationContext): FunctionBody; + export function visitFunctionBody(node: FunctionBody, visitor: Visitor, context: TransformationContext): FunctionBody; /** * Resumes a suspended lexical environment and visits a function body, ending the lexical * environment and merging hoisted declarations upon completion. */ - function visitFunctionBody(node: FunctionBody | undefined, visitor: Visitor, context: TransformationContext): FunctionBody | undefined; + export function visitFunctionBody(node: FunctionBody | undefined, visitor: Visitor, context: TransformationContext): FunctionBody | undefined; /** * Resumes a suspended lexical environment and visits a concise body, ending the lexical * environment and merging hoisted declarations upon completion. */ - function visitFunctionBody(node: ConciseBody, visitor: Visitor, context: TransformationContext): ConciseBody; + export function visitFunctionBody(node: ConciseBody, visitor: Visitor, context: TransformationContext): ConciseBody; /** * Visits an iteration body, adding any block-scoped variables required by the transformation. */ - function visitIterationBody(body: Statement, visitor: Visitor, context: TransformationContext): Statement; + export function visitIterationBody(body: Statement, visitor: Visitor, context: TransformationContext): Statement; /** * Visits the elements of a {@link CommaListExpression}. * @param visitor The visitor to use when visiting expressions whose result will not be discarded at runtime. * @param discardVisitor The visitor to use when visiting expressions whose result will be discarded at runtime. Defaults to {@link visitor}. */ - function visitCommaListElements(elements: NodeArray, visitor: Visitor, discardVisitor?: Visitor): NodeArray; + export function visitCommaListElements(elements: NodeArray, visitor: Visitor, discardVisitor?: Visitor): NodeArray; /** * Visits each child of a Node using the supplied visitor, possibly returning a new Node of the same kind in its place. * @@ -9397,7 +11793,7 @@ declare namespace ts { * @param visitor The callback used to visit each child. * @param context A lexical environment context for the visitor. */ - function visitEachChild(node: T, visitor: Visitor, context: TransformationContext | undefined): T; + export function visitEachChild(node: T, visitor: Visitor, context: TransformationContext | undefined): T; /** * Visits each child of a Node using the supplied visitor, possibly returning a new Node of the same kind in its place. * @@ -9405,11 +11801,11 @@ declare namespace ts { * @param visitor The callback used to visit each child. * @param context A lexical environment context for the visitor. */ - function visitEachChild(node: T | undefined, visitor: Visitor, context: TransformationContext | undefined, nodesVisitor?: typeof visitNodes, tokenVisitor?: Visitor): T | undefined; - function getTsBuildInfoEmitOutputFilePath(options: CompilerOptions): string | undefined; - function getOutputFileNames(commandLine: ParsedCommandLine, inputFileName: string, ignoreCase: boolean): readonly string[]; - function createPrinter(printerOptions?: PrinterOptions, handlers?: PrintHandlers): Printer; - enum ProgramUpdateLevel { + export function visitEachChild(node: T | undefined, visitor: Visitor, context: TransformationContext | undefined, nodesVisitor?: typeof visitNodes, tokenVisitor?: Visitor): T | undefined; + export function getTsBuildInfoEmitOutputFilePath(options: CompilerOptions): string | undefined; + export function getOutputFileNames(commandLine: ParsedCommandLine, inputFileName: string, ignoreCase: boolean): readonly string[]; + export function createPrinter(printerOptions?: PrinterOptions, handlers?: PrintHandlers): Printer; + export enum ProgramUpdateLevel { /** Program is updated with same root file names and options */ Update = 0, /** Loads program after updating root file names from the disk */ @@ -9422,19 +11818,19 @@ declare namespace ts { */ Full = 2, } - function findConfigFile(searchPath: string, fileExists: (fileName: string) => boolean, configName?: string): string | undefined; - function resolveTripleslashReference(moduleName: string, containingFile: string): string; - function createCompilerHost(options: CompilerOptions, setParentNodes?: boolean): CompilerHost; - function getPreEmitDiagnostics(program: Program, sourceFile?: SourceFile, cancellationToken?: CancellationToken): readonly Diagnostic[]; - function formatDiagnostics(diagnostics: readonly Diagnostic[], host: FormatDiagnosticsHost): string; - function formatDiagnostic(diagnostic: Diagnostic, host: FormatDiagnosticsHost): string; - function formatDiagnosticsWithColorAndContext(diagnostics: readonly Diagnostic[], host: FormatDiagnosticsHost): string; - function flattenDiagnosticMessageText(diag: string | DiagnosticMessageChain | undefined, newLine: string, indent?: number): string; + export function findConfigFile(searchPath: string, fileExists: (fileName: string) => boolean, configName?: string): string | undefined; + export function resolveTripleslashReference(moduleName: string, containingFile: string): string; + export function createCompilerHost(options: CompilerOptions, setParentNodes?: boolean): CompilerHost; + export function getPreEmitDiagnostics(program: Program, sourceFile?: SourceFile, cancellationToken?: CancellationToken): readonly Diagnostic[]; + export function formatDiagnostics(diagnostics: readonly Diagnostic[], host: FormatDiagnosticsHost): string; + export function formatDiagnostic(diagnostic: Diagnostic, host: FormatDiagnosticsHost): string; + export function formatDiagnosticsWithColorAndContext(diagnostics: readonly Diagnostic[], host: FormatDiagnosticsHost): string; + export function flattenDiagnosticMessageText(diag: string | DiagnosticMessageChain | undefined, newLine: string, indent?: number): string; /** * Calculates the resulting resolution mode for some reference in some file - this is generally the explicitly * provided resolution mode in the reference, unless one is not present, in which case it is the mode of the containing file. */ - function getModeForFileReference(ref: FileReference | string, containingFileMode: ResolutionMode): ResolutionMode; + export function getModeForFileReference(ref: FileReference | string, containingFileMode: ResolutionMode): ResolutionMode; /** * Use `program.getModeForResolutionAtIndex`, which retrieves the correct `compilerOptions`, instead of this function whenever possible. * Calculates the final resolution mode for an import at some index within a file's `imports` list. This is the resolution mode @@ -9447,7 +11843,7 @@ declare namespace ts { * @param compilerOptions The compiler options for the program that owns the file. If the file belongs to a referenced project, the compiler options * should be the options of the referenced project, not the referencing project. */ - function getModeForResolutionAtIndex(file: SourceFile, index: number, compilerOptions: CompilerOptions): ResolutionMode; + export function getModeForResolutionAtIndex(file: SourceFile, index: number, compilerOptions: CompilerOptions): ResolutionMode; /** * Use `program.getModeForUsageLocation`, which retrieves the correct `compilerOptions`, instead of this function whenever possible. * Calculates the final resolution mode for a given module reference node. This function only returns a result when module resolution @@ -9486,8 +11882,8 @@ declare namespace ts { * should be the options of the referenced project, not the referencing project. * @returns The final resolution mode of the import */ - function getModeForUsageLocation(file: SourceFile, usage: StringLiteralLike, compilerOptions: CompilerOptions): ResolutionMode; - function getConfigFileParsingDiagnostics(configFileParseResult: ParsedCommandLine): readonly Diagnostic[]; + export function getModeForUsageLocation(file: SourceFile, usage: StringLiteralLike, compilerOptions: CompilerOptions): ResolutionMode; + export function getConfigFileParsingDiagnostics(configFileParseResult: ParsedCommandLine): readonly Diagnostic[]; /** * A function for determining if a given file is esm or cjs format, assuming modern node module resolution rules, as configured by the * `options` parameter. @@ -9498,7 +11894,7 @@ declare namespace ts { * @param options The compiler options to perform the analysis under - relevant options are `moduleResolution` and `traceResolution` * @returns `undefined` if the path has no relevant implied format, `ModuleKind.ESNext` for esm format, and `ModuleKind.CommonJS` for cjs format */ - function getImpliedNodeFormatForFile(fileName: string, packageJsonInfoCache: PackageJsonInfoCache | undefined, host: ModuleResolutionHost, options: CompilerOptions): ResolutionMode; + export function getImpliedNodeFormatForFile(fileName: string, packageJsonInfoCache: PackageJsonInfoCache | undefined, host: ModuleResolutionHost, options: CompilerOptions): ResolutionMode; /** * Create a new 'Program' instance. A Program is an immutable collection of 'SourceFile's and a 'CompilerOptions' * that represent a compilation unit. @@ -9509,7 +11905,7 @@ declare namespace ts { * @param createProgramOptions - The options for creating a program. * @returns A 'Program' object. */ - function createProgram(createProgramOptions: CreateProgramOptions): Program; + export function createProgram(createProgramOptions: CreateProgramOptions): Program; /** * Create a new 'Program' instance. A Program is an immutable collection of 'SourceFile's and a 'CompilerOptions' * that represent a compilation unit. @@ -9524,23 +11920,23 @@ declare namespace ts { * @param configFileParsingDiagnostics - error during config file parsing * @returns A 'Program' object. */ - function createProgram(rootNames: readonly string[], options: CompilerOptions, host?: CompilerHost, oldProgram?: Program, configFileParsingDiagnostics?: readonly Diagnostic[]): Program; + export function createProgram(rootNames: readonly string[], options: CompilerOptions, host?: CompilerHost, oldProgram?: Program, configFileParsingDiagnostics?: readonly Diagnostic[]): Program; /** * Returns the target config filename of a project reference. * Note: The file might not exist. */ - function resolveProjectReferencePath(ref: ProjectReference): ResolvedConfigFileName; - interface FormatDiagnosticsHost { + export function resolveProjectReferencePath(ref: ProjectReference): ResolvedConfigFileName; + export interface FormatDiagnosticsHost { getCurrentDirectory(): string; getCanonicalFileName(fileName: string): string; getNewLine(): string; } - interface EmitOutput { + export interface EmitOutput { outputFiles: OutputFile[]; emitSkipped: boolean; diagnostics: readonly Diagnostic[]; } - interface OutputFile { + export interface OutputFile { name: string; writeByteOrderMark: boolean; text: string; @@ -9548,24 +11944,24 @@ declare namespace ts { /** * Create the builder to manage semantic diagnostics and cache them */ - function createSemanticDiagnosticsBuilderProgram(newProgram: Program, host: BuilderProgramHost, oldProgram?: SemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[]): SemanticDiagnosticsBuilderProgram; - function createSemanticDiagnosticsBuilderProgram(rootNames: readonly string[] | undefined, options: CompilerOptions | undefined, host?: CompilerHost, oldProgram?: SemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[], projectReferences?: readonly ProjectReference[]): SemanticDiagnosticsBuilderProgram; + export function createSemanticDiagnosticsBuilderProgram(newProgram: Program, host: BuilderProgramHost, oldProgram?: SemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[]): SemanticDiagnosticsBuilderProgram; + export function createSemanticDiagnosticsBuilderProgram(rootNames: readonly string[] | undefined, options: CompilerOptions | undefined, host?: CompilerHost, oldProgram?: SemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[], projectReferences?: readonly ProjectReference[]): SemanticDiagnosticsBuilderProgram; /** * Create the builder that can handle the changes in program and iterate through changed files * to emit the those files and manage semantic diagnostics cache as well */ - function createEmitAndSemanticDiagnosticsBuilderProgram(newProgram: Program, host: BuilderProgramHost, oldProgram?: EmitAndSemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[]): EmitAndSemanticDiagnosticsBuilderProgram; - function createEmitAndSemanticDiagnosticsBuilderProgram(rootNames: readonly string[] | undefined, options: CompilerOptions | undefined, host?: CompilerHost, oldProgram?: EmitAndSemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[], projectReferences?: readonly ProjectReference[]): EmitAndSemanticDiagnosticsBuilderProgram; + export function createEmitAndSemanticDiagnosticsBuilderProgram(newProgram: Program, host: BuilderProgramHost, oldProgram?: EmitAndSemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[]): EmitAndSemanticDiagnosticsBuilderProgram; + export function createEmitAndSemanticDiagnosticsBuilderProgram(rootNames: readonly string[] | undefined, options: CompilerOptions | undefined, host?: CompilerHost, oldProgram?: EmitAndSemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[], projectReferences?: readonly ProjectReference[]): EmitAndSemanticDiagnosticsBuilderProgram; /** * Creates a builder thats just abstraction over program and can be used with watch */ - function createAbstractBuilder(newProgram: Program, host: BuilderProgramHost, oldProgram?: BuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[]): BuilderProgram; - function createAbstractBuilder(rootNames: readonly string[] | undefined, options: CompilerOptions | undefined, host?: CompilerHost, oldProgram?: BuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[], projectReferences?: readonly ProjectReference[]): BuilderProgram; - type AffectedFileResult = { + export function createAbstractBuilder(newProgram: Program, host: BuilderProgramHost, oldProgram?: BuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[]): BuilderProgram; + export function createAbstractBuilder(rootNames: readonly string[] | undefined, options: CompilerOptions | undefined, host?: CompilerHost, oldProgram?: BuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[], projectReferences?: readonly ProjectReference[]): BuilderProgram; + export type AffectedFileResult = { result: T; affected: SourceFile | Program; } | undefined; - interface BuilderProgramHost { + export interface BuilderProgramHost { /** * If provided this would be used this hash instead of actual file shape text for detecting changes */ @@ -9579,7 +11975,7 @@ declare namespace ts { /** * Builder to manage the program state changes */ - interface BuilderProgram { + export interface BuilderProgram { /** * Returns current program */ @@ -9649,7 +12045,7 @@ declare namespace ts { /** * The builder that caches the semantic diagnostics for the program and handles the changed files and affected files */ - interface SemanticDiagnosticsBuilderProgram extends BuilderProgram { + export interface SemanticDiagnosticsBuilderProgram extends BuilderProgram { /** * Gets the semantic diagnostics from the program for the next affected file and caches it * Returns undefined if the iteration is complete @@ -9660,7 +12056,7 @@ declare namespace ts { * The builder that can handle the changes in program and iterate through changed file to emit the files * The semantic diagnostics are cached per file and managed by clearing for the changed/affected files */ - interface EmitAndSemanticDiagnosticsBuilderProgram extends SemanticDiagnosticsBuilderProgram { + export interface EmitAndSemanticDiagnosticsBuilderProgram extends SemanticDiagnosticsBuilderProgram { /** * Emits the next affected file's emit result (EmitResult and sourceFiles emitted) or returns undefined if iteration is complete * The first of writeFile if provided, writeFile of BuilderProgramHost if provided, writeFile of compiler host @@ -9668,28 +12064,28 @@ declare namespace ts { */ emitNextAffectedFile(writeFile?: WriteFileCallback, cancellationToken?: CancellationToken, emitOnlyDtsFiles?: boolean, customTransformers?: CustomTransformers): AffectedFileResult; } - function readBuilderProgram(compilerOptions: CompilerOptions, host: ReadBuildProgramHost): EmitAndSemanticDiagnosticsBuilderProgram | undefined; - function createIncrementalCompilerHost(options: CompilerOptions, system?: System): CompilerHost; - function createIncrementalProgram({ rootNames, options, configFileParsingDiagnostics, projectReferences, host, createProgram }: IncrementalProgramOptions): T; + export function readBuilderProgram(compilerOptions: CompilerOptions, host: ReadBuildProgramHost): EmitAndSemanticDiagnosticsBuilderProgram | undefined; + export function createIncrementalCompilerHost(options: CompilerOptions, system?: System): CompilerHost; + export function createIncrementalProgram({ rootNames, options, configFileParsingDiagnostics, projectReferences, host, createProgram }: IncrementalProgramOptions): T; /** * Create the watch compiler host for either configFile or fileNames and its options */ - function createWatchCompilerHost(configFileName: string, optionsToExtend: CompilerOptions | undefined, system: System, createProgram?: CreateProgram, reportDiagnostic?: DiagnosticReporter, reportWatchStatus?: WatchStatusReporter, watchOptionsToExtend?: WatchOptions, extraFileExtensions?: readonly FileExtensionInfo[]): WatchCompilerHostOfConfigFile; - function createWatchCompilerHost(rootFiles: string[], options: CompilerOptions, system: System, createProgram?: CreateProgram, reportDiagnostic?: DiagnosticReporter, reportWatchStatus?: WatchStatusReporter, projectReferences?: readonly ProjectReference[], watchOptions?: WatchOptions): WatchCompilerHostOfFilesAndCompilerOptions; + export function createWatchCompilerHost(configFileName: string, optionsToExtend: CompilerOptions | undefined, system: System, createProgram?: CreateProgram, reportDiagnostic?: DiagnosticReporter, reportWatchStatus?: WatchStatusReporter, watchOptionsToExtend?: WatchOptions, extraFileExtensions?: readonly FileExtensionInfo[]): WatchCompilerHostOfConfigFile; + export function createWatchCompilerHost(rootFiles: string[], options: CompilerOptions, system: System, createProgram?: CreateProgram, reportDiagnostic?: DiagnosticReporter, reportWatchStatus?: WatchStatusReporter, projectReferences?: readonly ProjectReference[], watchOptions?: WatchOptions): WatchCompilerHostOfFilesAndCompilerOptions; /** * Creates the watch from the host for root files and compiler options */ - function createWatchProgram(host: WatchCompilerHostOfFilesAndCompilerOptions): WatchOfFilesAndCompilerOptions; + export function createWatchProgram(host: WatchCompilerHostOfFilesAndCompilerOptions): WatchOfFilesAndCompilerOptions; /** * Creates the watch from the host for config file */ - function createWatchProgram(host: WatchCompilerHostOfConfigFile): WatchOfConfigFile; - interface ReadBuildProgramHost { + export function createWatchProgram(host: WatchCompilerHostOfConfigFile): WatchOfConfigFile; + export interface ReadBuildProgramHost { useCaseSensitiveFileNames(): boolean; getCurrentDirectory(): string; readFile(fileName: string): string | undefined; } - interface IncrementalProgramOptions { + export interface IncrementalProgramOptions { rootNames: readonly string[]; options: CompilerOptions; configFileParsingDiagnostics?: readonly Diagnostic[]; @@ -9697,11 +12093,11 @@ declare namespace ts { host?: CompilerHost; createProgram?: CreateProgram; } - type WatchStatusReporter = (diagnostic: Diagnostic, newLine: string, options: CompilerOptions, errorCount?: number) => void; + export type WatchStatusReporter = (diagnostic: Diagnostic, newLine: string, options: CompilerOptions, errorCount?: number) => void; /** Create the program with rootNames and options, if they are undefined, oldProgram and new configFile diagnostics create new program */ - type CreateProgram = (rootNames: readonly string[] | undefined, options: CompilerOptions | undefined, host?: CompilerHost, oldProgram?: T, configFileParsingDiagnostics?: readonly Diagnostic[], projectReferences?: readonly ProjectReference[] | undefined) => T; + export type CreateProgram = (rootNames: readonly string[] | undefined, options: CompilerOptions | undefined, host?: CompilerHost, oldProgram?: T, configFileParsingDiagnostics?: readonly Diagnostic[], projectReferences?: readonly ProjectReference[] | undefined) => T; /** Host that has watch functionality used in --watch mode */ - interface WatchHost { + export interface WatchHost { /** If provided, called with Diagnostic message that informs about change in watch status */ onWatchStatusChange?(diagnostic: Diagnostic, newLine: string, options: CompilerOptions, errorCount?: number): void; /** Used to watch changes in source files, missing files needed to update the program or config file */ @@ -9714,7 +12110,7 @@ declare namespace ts { clearTimeout?(timeoutId: any): void; preferNonRecursiveWatch?: boolean; } - interface ProgramHost { + export interface ProgramHost { /** * Used to create the program when need for program creation or recreation detected */ @@ -9769,7 +12165,7 @@ declare namespace ts { getModuleResolutionCache?(): ModuleResolutionCache | undefined; jsDocParsingMode?: JSDocParsingMode; } - interface WatchCompilerHost extends ProgramHost, WatchHost { + export interface WatchCompilerHost extends ProgramHost, WatchHost { /** Instead of using output d.ts file from project reference, use its source file */ useSourceOfProjectReferenceRedirect?(): boolean; /** If provided, use this method to get parsed command lines for referenced projects */ @@ -9780,7 +12176,7 @@ declare namespace ts { /** * Host to create watch with root files and options */ - interface WatchCompilerHostOfFilesAndCompilerOptions extends WatchCompilerHost { + export interface WatchCompilerHostOfFilesAndCompilerOptions extends WatchCompilerHost { /** root files to use to generate program */ rootFiles: string[]; /** Compiler options */ @@ -9792,7 +12188,7 @@ declare namespace ts { /** * Host to create watch with config file */ - interface WatchCompilerHostOfConfigFile extends WatchCompilerHost, ConfigFileDiagnosticsReporter { + export interface WatchCompilerHostOfConfigFile extends WatchCompilerHost, ConfigFileDiagnosticsReporter { /** Name of the config file to compile */ configFileName: string; /** Options to extend */ @@ -9805,7 +12201,7 @@ declare namespace ts { */ readDirectory(path: string, extensions?: readonly string[], exclude?: readonly string[], include?: readonly string[], depth?: number): string[]; } - interface Watch { + export interface Watch { /** Synchronize with host and get updated program */ getProgram(): T; /** Closes the watch */ @@ -9814,24 +12210,24 @@ declare namespace ts { /** * Creates the watch what generates program using the config file */ - interface WatchOfConfigFile extends Watch { + export interface WatchOfConfigFile extends Watch { } /** * Creates the watch that generates program using the root files and compiler options */ - interface WatchOfFilesAndCompilerOptions extends Watch { + export interface WatchOfFilesAndCompilerOptions extends Watch { /** Updates the root files in the program, only if this is not config file compilation */ updateRootFileNames(fileNames: string[]): void; } /** * Create a function that reports watch status by writing to the system and handles the formating of the diagnostic */ - function createBuilderStatusReporter(system: System, pretty?: boolean): DiagnosticReporter; - function createSolutionBuilderHost(system?: System, createProgram?: CreateProgram, reportDiagnostic?: DiagnosticReporter, reportSolutionBuilderStatus?: DiagnosticReporter, reportErrorSummary?: ReportEmitErrorSummary): SolutionBuilderHost; - function createSolutionBuilderWithWatchHost(system?: System, createProgram?: CreateProgram, reportDiagnostic?: DiagnosticReporter, reportSolutionBuilderStatus?: DiagnosticReporter, reportWatchStatus?: WatchStatusReporter): SolutionBuilderWithWatchHost; - function createSolutionBuilder(host: SolutionBuilderHost, rootNames: readonly string[], defaultOptions: BuildOptions): SolutionBuilder; - function createSolutionBuilderWithWatch(host: SolutionBuilderWithWatchHost, rootNames: readonly string[], defaultOptions: BuildOptions, baseWatchOptions?: WatchOptions): SolutionBuilder; - interface BuildOptions { + export function createBuilderStatusReporter(system: System, pretty?: boolean): DiagnosticReporter; + export function createSolutionBuilderHost(system?: System, createProgram?: CreateProgram, reportDiagnostic?: DiagnosticReporter, reportSolutionBuilderStatus?: DiagnosticReporter, reportErrorSummary?: ReportEmitErrorSummary): SolutionBuilderHost; + export function createSolutionBuilderWithWatchHost(system?: System, createProgram?: CreateProgram, reportDiagnostic?: DiagnosticReporter, reportSolutionBuilderStatus?: DiagnosticReporter, reportWatchStatus?: WatchStatusReporter): SolutionBuilderWithWatchHost; + export function createSolutionBuilder(host: SolutionBuilderHost, rootNames: readonly string[], defaultOptions: BuildOptions): SolutionBuilder; + export function createSolutionBuilderWithWatch(host: SolutionBuilderWithWatchHost, rootNames: readonly string[], defaultOptions: BuildOptions, baseWatchOptions?: WatchOptions): SolutionBuilder; + export interface BuildOptions { dry?: boolean; force?: boolean; verbose?: boolean; @@ -9846,12 +12242,12 @@ declare namespace ts { traceResolution?: boolean; [option: string]: CompilerOptionsValue | undefined; } - type ReportEmitErrorSummary = (errorCount: number, filesInError: (ReportFileInError | undefined)[]) => void; - interface ReportFileInError { + export type ReportEmitErrorSummary = (errorCount: number, filesInError: (ReportFileInError | undefined)[]) => void; + export interface ReportFileInError { fileName: string; line: number; } - interface SolutionBuilderHostBase extends ProgramHost { + export interface SolutionBuilderHostBase extends ProgramHost { createDirectory?(path: string): void; /** * Should provide create directory and writeFile if done of invalidatedProjects is not invoked with @@ -9867,23 +12263,23 @@ declare namespace ts { reportSolutionBuilderStatus: DiagnosticReporter; afterProgramEmitAndDiagnostics?(program: T): void; } - interface SolutionBuilderHost extends SolutionBuilderHostBase { + export interface SolutionBuilderHost extends SolutionBuilderHostBase { reportErrorSummary?: ReportEmitErrorSummary; } - interface SolutionBuilderWithWatchHost extends SolutionBuilderHostBase, WatchHost { + export interface SolutionBuilderWithWatchHost extends SolutionBuilderHostBase, WatchHost { } - interface SolutionBuilder { + export interface SolutionBuilder { build(project?: string, cancellationToken?: CancellationToken, writeFile?: WriteFileCallback, getCustomTransformers?: (project: string) => CustomTransformers): ExitStatus; clean(project?: string): ExitStatus; buildReferences(project: string, cancellationToken?: CancellationToken, writeFile?: WriteFileCallback, getCustomTransformers?: (project: string) => CustomTransformers): ExitStatus; cleanReferences(project?: string): ExitStatus; getNextInvalidatedProject(cancellationToken?: CancellationToken): InvalidatedProject | undefined; } - enum InvalidatedProjectKind { + export enum InvalidatedProjectKind { Build = 0, UpdateOutputFileStamps = 1, } - interface InvalidatedProjectBase { + export interface InvalidatedProjectBase { readonly kind: InvalidatedProjectKind; readonly project: ResolvedConfigFileName; /** @@ -9893,11 +12289,11 @@ declare namespace ts { getCompilerOptions(): CompilerOptions; getCurrentDirectory(): string; } - interface UpdateOutputFileStampsProject extends InvalidatedProjectBase { + export interface UpdateOutputFileStampsProject extends InvalidatedProjectBase { readonly kind: InvalidatedProjectKind.UpdateOutputFileStamps; updateOutputFileStatmps(): void; } - interface BuildInvalidedProject extends InvalidatedProjectBase { + export interface BuildInvalidedProject extends InvalidatedProjectBase { readonly kind: InvalidatedProjectKind.Build; getBuilderProgram(): T | undefined; getProgram(): Program | undefined; @@ -9912,35 +12308,14 @@ declare namespace ts { getSemanticDiagnosticsOfNextAffectedFile(cancellationToken?: CancellationToken, ignoreSourceFile?: (sourceFile: SourceFile) => boolean): AffectedFileResult; emit(targetSourceFile?: SourceFile, writeFile?: WriteFileCallback, cancellationToken?: CancellationToken, emitOnlyDtsFiles?: boolean, customTransformers?: CustomTransformers): EmitResult | undefined; } - type InvalidatedProject = UpdateOutputFileStampsProject | BuildInvalidedProject; + export type InvalidatedProject = UpdateOutputFileStampsProject | BuildInvalidedProject; /** Returns true if commandline is --build and needs to be parsed useing parseBuildCommand */ - function isBuildCommand(commandLineArgs: readonly string[]): boolean; - function getDefaultFormatCodeSettings(newLineCharacter?: string): FormatCodeSettings; - /** - * Represents an immutable snapshot of a script at a specified time.Once acquired, the - * snapshot is observably immutable. i.e. the same calls with the same parameters will return - * the same values. - */ - interface IScriptSnapshot { - /** Gets a portion of the script snapshot specified by [start, end). */ - getText(start: number, end: number): string; - /** Gets the length of this script snapshot. */ - getLength(): number; - /** - * Gets the TextChangeRange that describe how the text changed between this text and - * an older version. This information is used by the incremental parser to determine - * what sections of the script need to be re-parsed. 'undefined' can be returned if the - * change range cannot be determined. However, in that case, incremental parsing will - * not happen and the entire document will be re - parsed. - */ - getChangeRange(oldSnapshot: IScriptSnapshot): TextChangeRange | undefined; - /** Releases all resources held by this script snapshot */ - dispose?(): void; - } - namespace ScriptSnapshot { + export function isBuildCommand(commandLineArgs: readonly string[]): boolean; + export function getDefaultFormatCodeSettings(newLineCharacter?: string): FormatCodeSettings; + export namespace ScriptSnapshot { function fromString(text: string): IScriptSnapshot; } - interface PreProcessedFileInfo { + export interface PreProcessedFileInfo { referencedFiles: FileReference[]; typeReferenceDirectives: FileReference[]; libReferenceDirectives: FileReference[]; @@ -9948,28 +12323,28 @@ declare namespace ts { ambientExternalModules?: string[]; isLibFile: boolean; } - interface HostCancellationToken { + export interface HostCancellationToken { isCancellationRequested(): boolean; } - interface InstallPackageOptions { + export interface InstallPackageOptions { fileName: Path; packageName: string; } - interface PerformanceEvent { + export interface PerformanceEvent { kind: "UpdateGraph" | "CreatePackageJsonAutoImportProvider"; durationMs: number; } - enum LanguageServiceMode { + export enum LanguageServiceMode { Semantic = 0, PartialSemantic = 1, Syntactic = 2, } - interface IncompleteCompletionsCache { + export interface IncompleteCompletionsCache { get(): CompletionInfo | undefined; set(response: CompletionInfo): void; clear(): void; } - interface LanguageServiceHost extends GetEffectiveTypeRootsHost, MinimalResolutionCacheHost { + export interface LanguageServiceHost extends GetEffectiveTypeRootsHost, MinimalResolutionCacheHost { getCompilationSettings(): CompilerOptions; getNewLine?(): string; getProjectVersion?(): string; @@ -10009,14 +12384,14 @@ declare namespace ts { getParsedCommandLine?(fileName: string): ParsedCommandLine | undefined; jsDocParsingMode?: JSDocParsingMode | undefined; } - type WithMetadata = T & { + export type WithMetadata = T & { metadata?: unknown; }; - enum SemanticClassificationFormat { + export enum SemanticClassificationFormat { Original = "original", TwentyTwenty = "2020", } - interface LanguageService { + export interface LanguageService { /** This is used as a part of restarting the language service. */ cleanupSemanticCache(): void; /** @@ -10191,27 +12566,27 @@ declare namespace ts { dispose(): void; getPasteEdits(args: PasteEditsArgs, formatOptions: FormatCodeSettings): PasteEdits; } - interface JsxClosingTagInfo { + export interface JsxClosingTagInfo { readonly newText: string; } - interface LinkedEditingInfo { + export interface LinkedEditingInfo { readonly ranges: TextSpan[]; wordPattern?: string; } - interface CombinedCodeFixScope { + export interface CombinedCodeFixScope { type: "file"; fileName: string; } - enum OrganizeImportsMode { + export enum OrganizeImportsMode { All = "All", SortAndCombine = "SortAndCombine", RemoveUnused = "RemoveUnused", } - interface PasteEdits { + export interface PasteEdits { edits: readonly FileTextChanges[]; fixId?: {}; } - interface PasteEditsArgs { + export interface PasteEditsArgs { targetFile: string; pastedText: string[]; pasteLocations: TextRange[]; @@ -10221,13 +12596,13 @@ declare namespace ts { } | undefined; preferences: UserPreferences; } - interface OrganizeImportsArgs extends CombinedCodeFixScope { + export interface OrganizeImportsArgs extends CombinedCodeFixScope { /** @deprecated Use `mode` instead */ skipDestructiveCodeActions?: boolean; mode?: OrganizeImportsMode; } - type CompletionsTriggerCharacter = "." | '"' | "'" | "`" | "/" | "@" | "<" | "#" | " "; - enum CompletionTriggerKind { + export type CompletionsTriggerCharacter = "." | '"' | "'" | "`" | "/" | "@" | "<" | "#" | " "; + export enum CompletionTriggerKind { /** Completion was triggered by typing an identifier, manual invocation (e.g Ctrl+Space) or via API. */ Invoked = 1, /** Completion was triggered by a trigger character. */ @@ -10235,7 +12610,7 @@ declare namespace ts { /** Completion was re-triggered as the current completion list is incomplete. */ TriggerForIncompleteCompletions = 3, } - interface GetCompletionsAtPositionOptions extends UserPreferences { + export interface GetCompletionsAtPositionOptions extends UserPreferences { /** * If the editor is asking for completions because a certain character was typed * (as opposed to when the user explicitly requested them) this should be set. @@ -10254,17 +12629,17 @@ declare namespace ts { /** @deprecated Use includeCompletionsWithInsertText */ includeInsertTextCompletions?: boolean; } - type SignatureHelpTriggerCharacter = "," | "(" | "<"; - type SignatureHelpRetriggerCharacter = SignatureHelpTriggerCharacter | ")"; - interface SignatureHelpItemsOptions { + export type SignatureHelpTriggerCharacter = "," | "(" | "<"; + export type SignatureHelpRetriggerCharacter = SignatureHelpTriggerCharacter | ")"; + export interface SignatureHelpItemsOptions { triggerReason?: SignatureHelpTriggerReason; } - type SignatureHelpTriggerReason = SignatureHelpInvokedReason | SignatureHelpCharacterTypedReason | SignatureHelpRetriggeredReason; + export type SignatureHelpTriggerReason = SignatureHelpInvokedReason | SignatureHelpCharacterTypedReason | SignatureHelpRetriggeredReason; /** * Signals that the user manually requested signature help. * The language service will unconditionally attempt to provide a result. */ - interface SignatureHelpInvokedReason { + export interface SignatureHelpInvokedReason { kind: "invoked"; triggerCharacter?: undefined; } @@ -10272,7 +12647,7 @@ declare namespace ts { * Signals that the signature help request came from a user typing a character. * Depending on the character and the syntactic context, the request may or may not be served a result. */ - interface SignatureHelpCharacterTypedReason { + export interface SignatureHelpCharacterTypedReason { kind: "characterTyped"; /** * Character that was responsible for triggering signature help. @@ -10285,25 +12660,25 @@ declare namespace ts { * The language service will unconditionally attempt to provide a result. * `triggerCharacter` can be `undefined` for a retrigger caused by a cursor move. */ - interface SignatureHelpRetriggeredReason { + export interface SignatureHelpRetriggeredReason { kind: "retrigger"; /** * Character that was responsible for triggering signature help. */ triggerCharacter?: SignatureHelpRetriggerCharacter; } - interface ApplyCodeActionCommandResult { + export interface ApplyCodeActionCommandResult { successMessage: string; } - interface Classifications { + export interface Classifications { spans: number[]; endOfLineState: EndOfLineState; } - interface ClassifiedSpan { + export interface ClassifiedSpan { textSpan: TextSpan; classificationType: ClassificationTypeNames; } - interface ClassifiedSpan2020 { + export interface ClassifiedSpan2020 { textSpan: TextSpan; classificationType: number; } @@ -10313,7 +12688,7 @@ declare namespace ts { * The navbar is returned as a list of top-level items, each of which has a list of child items. * Child items always have an empty array for their `childItems`. */ - interface NavigationBarItem { + export interface NavigationBarItem { text: string; kind: ScriptElementKind; kindModifiers: string; @@ -10327,7 +12702,7 @@ declare namespace ts { * Node in a tree of nested declarations in a file. * The top node is always a script or module node. */ - interface NavigationTree { + export interface NavigationTree { /** Name of the declaration, or a short description, e.g. "". */ text: string; kind: ScriptElementKind; @@ -10342,7 +12717,7 @@ declare namespace ts { /** Present if non-empty */ childItems?: NavigationTree[]; } - interface CallHierarchyItem { + export interface CallHierarchyItem { name: string; kind: ScriptElementKind; kindModifiers?: string; @@ -10351,20 +12726,20 @@ declare namespace ts { selectionSpan: TextSpan; containerName?: string; } - interface CallHierarchyIncomingCall { + export interface CallHierarchyIncomingCall { from: CallHierarchyItem; fromSpans: TextSpan[]; } - interface CallHierarchyOutgoingCall { + export interface CallHierarchyOutgoingCall { to: CallHierarchyItem; fromSpans: TextSpan[]; } - enum InlayHintKind { + export enum InlayHintKind { Type = "Type", Parameter = "Parameter", Enum = "Enum", } - interface InlayHint { + export interface InlayHint { /** This property will be the empty string when displayParts is set. */ text: string; position: number; @@ -10373,30 +12748,30 @@ declare namespace ts { whitespaceAfter?: boolean; displayParts?: InlayHintDisplayPart[]; } - interface InlayHintDisplayPart { + export interface InlayHintDisplayPart { text: string; span?: TextSpan; file?: string; } - interface TodoCommentDescriptor { + export interface TodoCommentDescriptor { text: string; priority: number; } - interface TodoComment { + export interface TodoComment { descriptor: TodoCommentDescriptor; message: string; position: number; } - interface TextChange { + export interface TextChange { span: TextSpan; newText: string; } - interface FileTextChanges { + export interface FileTextChanges { fileName: string; textChanges: readonly TextChange[]; isNewFile?: boolean; } - interface CodeAction { + export interface CodeAction { /** Description of the code action to display in the UI of the editor */ description: string; /** Text changes to apply to each file as part of the code action */ @@ -10407,7 +12782,7 @@ declare namespace ts { */ commands?: CodeActionCommand[]; } - interface CodeFixAction extends CodeAction { + export interface CodeFixAction extends CodeAction { /** Short name to identify the fix, for use by telemetry. */ fixName: string; /** @@ -10417,17 +12792,17 @@ declare namespace ts { fixId?: {}; fixAllDescription?: string; } - interface CombinedCodeActions { + export interface CombinedCodeActions { changes: readonly FileTextChanges[]; commands?: readonly CodeActionCommand[]; } - type CodeActionCommand = InstallPackageAction; - interface InstallPackageAction { + export type CodeActionCommand = InstallPackageAction; + export interface InstallPackageAction { } /** * A set of one or more available refactoring actions, grouped under a parent refactoring. */ - interface ApplicableRefactorInfo { + export interface ApplicableRefactorInfo { /** * The programmatic name of the refactoring */ @@ -10451,7 +12826,7 @@ declare namespace ts { * Represents a single refactoring action - for example, the "Extract Method..." refactor might * offer several actions, each corresponding to a surround class or closure to extract into. */ - interface RefactorActionInfo { + export interface RefactorActionInfo { /** * The programmatic name of the refactoring action */ @@ -10494,20 +12869,20 @@ declare namespace ts { * A set of edits to make in response to a refactor action, plus an optional * location where renaming should be invoked from */ - interface RefactorEditInfo { + export interface RefactorEditInfo { edits: FileTextChanges[]; renameFilename?: string; renameLocation?: number; commands?: CodeActionCommand[]; notApplicableReason?: string; } - type RefactorTriggerReason = "implicit" | "invoked"; - interface TextInsertion { + export type RefactorTriggerReason = "implicit" | "invoked"; + export interface TextInsertion { newText: string; /** The position in newText the caret should point to after the insertion. */ caretOffset: number; } - interface DocumentSpan { + export interface DocumentSpan { textSpan: TextSpan; fileName: string; /** @@ -10523,32 +12898,32 @@ declare namespace ts { contextSpan?: TextSpan; originalContextSpan?: TextSpan; } - interface RenameLocation extends DocumentSpan { + export interface RenameLocation extends DocumentSpan { readonly prefixText?: string; readonly suffixText?: string; } - interface ReferenceEntry extends DocumentSpan { + export interface ReferenceEntry extends DocumentSpan { isWriteAccess: boolean; isInString?: true; } - interface ImplementationLocation extends DocumentSpan { + export interface ImplementationLocation extends DocumentSpan { kind: ScriptElementKind; displayParts: SymbolDisplayPart[]; } - enum HighlightSpanKind { + export enum HighlightSpanKind { none = "none", definition = "definition", reference = "reference", writtenReference = "writtenReference", } - interface HighlightSpan { + export interface HighlightSpan { fileName?: string; isInString?: true; textSpan: TextSpan; contextSpan?: TextSpan; kind: HighlightSpanKind; } - interface NavigateToItem { + export interface NavigateToItem { name: string; kind: ScriptElementKind; kindModifiers: string; @@ -10559,18 +12934,18 @@ declare namespace ts { containerName: string; containerKind: ScriptElementKind; } - enum IndentStyle { + export enum IndentStyle { None = 0, Block = 1, Smart = 2, } - enum SemicolonPreference { + export enum SemicolonPreference { Ignore = "ignore", Insert = "insert", Remove = "remove", } /** @deprecated - consider using EditorSettings instead */ - interface EditorOptions { + export interface EditorOptions { BaseIndentSize?: number; IndentSize: number; TabSize: number; @@ -10578,7 +12953,7 @@ declare namespace ts { ConvertTabsToSpaces: boolean; IndentStyle: IndentStyle; } - interface EditorSettings { + export interface EditorSettings { baseIndentSize?: number; indentSize?: number; tabSize?: number; @@ -10588,7 +12963,7 @@ declare namespace ts { trimTrailingWhitespace?: boolean; } /** @deprecated - consider using FormatCodeSettings instead */ - interface FormatCodeOptions extends EditorOptions { + export interface FormatCodeOptions extends EditorOptions { InsertSpaceAfterCommaDelimiter: boolean; InsertSpaceAfterSemicolonInForStatements: boolean; InsertSpaceBeforeAndAfterBinaryOperators: boolean; @@ -10606,7 +12981,7 @@ declare namespace ts { PlaceOpenBraceOnNewLineForControlBlocks: boolean; insertSpaceBeforeTypeAnnotation?: boolean; } - interface FormatCodeSettings extends EditorSettings { + export interface FormatCodeSettings extends EditorSettings { readonly insertSpaceAfterCommaDelimiter?: boolean; readonly insertSpaceAfterSemicolonInForStatements?: boolean; readonly insertSpaceBeforeAndAfterBinaryOperators?: boolean; @@ -10628,28 +13003,28 @@ declare namespace ts { readonly semicolons?: SemicolonPreference; readonly indentSwitchCase?: boolean; } - interface DefinitionInfo extends DocumentSpan { + export interface DefinitionInfo extends DocumentSpan { kind: ScriptElementKind; name: string; containerKind: ScriptElementKind; containerName: string; unverified?: boolean; } - interface DefinitionInfoAndBoundSpan { + export interface DefinitionInfoAndBoundSpan { definitions?: readonly DefinitionInfo[]; textSpan: TextSpan; } - interface ReferencedSymbolDefinitionInfo extends DefinitionInfo { + export interface ReferencedSymbolDefinitionInfo extends DefinitionInfo { displayParts: SymbolDisplayPart[]; } - interface ReferencedSymbol { + export interface ReferencedSymbol { definition: ReferencedSymbolDefinitionInfo; references: ReferencedSymbolEntry[]; } - interface ReferencedSymbolEntry extends ReferenceEntry { + export interface ReferencedSymbolEntry extends ReferenceEntry { isDefinition?: boolean; } - enum SymbolDisplayPartKind { + export enum SymbolDisplayPartKind { aliasName = 0, className = 1, enumName = 2, @@ -10676,7 +13051,7 @@ declare namespace ts { linkName = 23, linkText = 24, } - interface SymbolDisplayPart { + export interface SymbolDisplayPart { /** * Text of an item describing the symbol. */ @@ -10686,14 +13061,14 @@ declare namespace ts { */ kind: string; } - interface JSDocLinkDisplayPart extends SymbolDisplayPart { + export interface JSDocLinkDisplayPart extends SymbolDisplayPart { target: DocumentSpan; } - interface JSDocTagInfo { + export interface JSDocTagInfo { name: string; text?: SymbolDisplayPart[]; } - interface QuickInfo { + export interface QuickInfo { kind: ScriptElementKind; kindModifiers: string; textSpan: TextSpan; @@ -10701,8 +13076,8 @@ declare namespace ts { documentation?: SymbolDisplayPart[]; tags?: JSDocTagInfo[]; } - type RenameInfo = RenameInfoSuccess | RenameInfoFailure; - interface RenameInfoSuccess { + export type RenameInfo = RenameInfoSuccess | RenameInfoFailure; + export interface RenameInfoSuccess { canRename: true; /** * File or directory to rename. @@ -10719,33 +13094,33 @@ declare namespace ts { kindModifiers: string; triggerSpan: TextSpan; } - interface RenameInfoFailure { + export interface RenameInfoFailure { canRename: false; localizedErrorMessage: string; } /** * @deprecated Use `UserPreferences` instead. */ - interface RenameInfoOptions { + export interface RenameInfoOptions { readonly allowRenameOfImportPath?: boolean; } - interface DocCommentTemplateOptions { + export interface DocCommentTemplateOptions { readonly generateReturnInDocTemplate?: boolean; } - interface InteractiveRefactorArguments { + export interface InteractiveRefactorArguments { targetFile: string; } /** * Signature help information for a single parameter */ - interface SignatureHelpParameter { + export interface SignatureHelpParameter { name: string; documentation: SymbolDisplayPart[]; displayParts: SymbolDisplayPart[]; isOptional: boolean; isRest?: boolean; } - interface SelectionRange { + export interface SelectionRange { textSpan: TextSpan; parent?: SelectionRange; } @@ -10756,7 +13131,7 @@ declare namespace ts { * an edit has happened, while signature help is still active, the host can ask important * questions like 'what parameter is the user currently contained within?'. */ - interface SignatureHelpItem { + export interface SignatureHelpItem { isVariadic: boolean; prefixDisplayParts: SymbolDisplayPart[]; suffixDisplayParts: SymbolDisplayPart[]; @@ -10768,14 +13143,14 @@ declare namespace ts { /** * Represents a set of signature help items, and the preferred item that should be selected. */ - interface SignatureHelpItems { + export interface SignatureHelpItems { items: SignatureHelpItem[]; applicableSpan: TextSpan; selectedItemIndex: number; argumentIndex: number; argumentCount: number; } - enum CompletionInfoFlags { + export enum CompletionInfoFlags { None = 0, MayIncludeAutoImports = 1, IsImportStatementCompletion = 2, @@ -10784,7 +13159,7 @@ declare namespace ts { ResolvedModuleSpecifiersBeyondLimit = 16, MayIncludeMethodSnippets = 32, } - interface CompletionInfo { + export interface CompletionInfo { /** For performance telemetry. */ flags?: CompletionInfoFlags; /** Not true for all global completions. This will be true if the enclosing scope matches a few syntax kinds. See `isSnippetScope`. */ @@ -10810,7 +13185,7 @@ declare namespace ts { */ defaultCommitCharacters?: string[]; } - interface CompletionEntryDataAutoImport { + export interface CompletionEntryDataAutoImport { /** * The name of the property or export in the module's symbol table. Differs from the completion name * in the case of InternalSymbolName.ExportEquals and InternalSymbolName.Default. @@ -10825,14 +13200,14 @@ declare namespace ts { /** True if the export was found in the package.json AutoImportProvider */ isPackageJsonImport?: true; } - interface CompletionEntryDataUnresolved extends CompletionEntryDataAutoImport { + export interface CompletionEntryDataUnresolved extends CompletionEntryDataAutoImport { exportMapKey: ExportMapInfoKey; } - interface CompletionEntryDataResolved extends CompletionEntryDataAutoImport { + export interface CompletionEntryDataResolved extends CompletionEntryDataAutoImport { moduleSpecifier: string; } - type CompletionEntryData = CompletionEntryDataUnresolved | CompletionEntryDataResolved; - interface CompletionEntry { + export type CompletionEntryData = CompletionEntryDataUnresolved | CompletionEntryDataResolved; + export interface CompletionEntry { name: string; kind: ScriptElementKind; kindModifiers?: string; @@ -10920,7 +13295,7 @@ declare namespace ts { */ commitCharacters?: string[]; } - interface CompletionEntryLabelDetails { + export interface CompletionEntryLabelDetails { /** * An optional string which is rendered less prominently directly after * {@link CompletionEntry.name name}, without any spacing. Should be @@ -10934,7 +13309,7 @@ declare namespace ts { */ description?: string; } - interface CompletionEntryDetails { + export interface CompletionEntryDetails { name: string; kind: ScriptElementKind; kindModifiers: string; @@ -10946,7 +13321,7 @@ declare namespace ts { source?: SymbolDisplayPart[]; sourceDisplay?: SymbolDisplayPart[]; } - interface OutliningSpan { + export interface OutliningSpan { /** The span of the document to actually collapse. */ textSpan: TextSpan; /** The span of the document to display when the user hovers over the collapsed span. */ @@ -10963,7 +13338,7 @@ declare namespace ts { */ kind: OutliningSpanKind; } - enum OutliningSpanKind { + export enum OutliningSpanKind { /** Single or multi-line comments */ Comment = "comment", /** Sections marked by '// #region' and '// #endregion' comments */ @@ -10973,12 +13348,12 @@ declare namespace ts { /** Contiguous blocks of import declarations */ Imports = "imports", } - enum OutputFileType { + export enum OutputFileType { JavaScript = 0, SourceMap = 1, Declaration = 2, } - enum EndOfLineState { + export enum EndOfLineState { None = 0, InMultiLineCommentTrivia = 1, InSingleQuoteStringLiteral = 2, @@ -10987,7 +13362,7 @@ declare namespace ts { InTemplateMiddleOrTail = 5, InTemplateSubstitutionPosition = 6, } - enum TokenClass { + export enum TokenClass { Punctuation = 0, Keyword = 1, Operator = 2, @@ -10999,15 +13374,15 @@ declare namespace ts { StringLiteral = 8, RegExpLiteral = 9, } - interface ClassificationResult { + export interface ClassificationResult { finalLexState: EndOfLineState; entries: ClassificationInfo[]; } - interface ClassificationInfo { + export interface ClassificationInfo { length: number; classification: TokenClass; } - interface Classifier { + export interface Classifier { /** * Gives lexical classifications of tokens on a line without any syntactic context. * For instance, a token consisting of the text 'string' can be either an identifier @@ -11031,7 +13406,7 @@ declare namespace ts { getClassificationsForLine(text: string, lexState: EndOfLineState, syntacticClassifierAbsent: boolean): ClassificationResult; getEncodedLexicalClassifications(text: string, endOfLineState: EndOfLineState, syntacticClassifierAbsent: boolean): Classifications; } - enum ScriptElementKind { + export enum ScriptElementKind { unknown = "", warning = "warning", /** predefined type (void) or keyword (class) */ @@ -11116,7 +13491,7 @@ declare namespace ts { /** Jsdoc @link: in `{@link C link text}`, the link text "link text" */ linkText = "link text", } - enum ScriptElementKindModifier { + export enum ScriptElementKindModifier { none = "", publicMemberModifier = "public", privateMemberModifier = "private", @@ -11140,7 +13515,7 @@ declare namespace ts { ctsModifier = ".cts", cjsModifier = ".cjs", } - enum ClassificationTypeNames { + export enum ClassificationTypeNames { comment = "comment", identifier = "identifier", keyword = "keyword", @@ -11166,7 +13541,7 @@ declare namespace ts { jsxText = "jsx text", jsxAttributeStringLiteralValue = "jsx attribute string literal value", } - enum ClassificationType { + export enum ClassificationType { comment = 1, identifier = 2, keyword = 3, @@ -11193,7 +13568,7 @@ declare namespace ts { jsxAttributeStringLiteralValue = 24, bigintLiteral = 25, } - interface InlayHintsContext { + export interface InlayHintsContext { file: SourceFile; program: Program; cancellationToken: CancellationToken; @@ -11201,16 +13576,16 @@ declare namespace ts { span: TextSpan; preferences: UserPreferences; } - type ExportMapInfoKey = string & { + export type ExportMapInfoKey = string & { __exportInfoKey: void; }; /** The classifier is used for syntactic highlighting in editors via the TSServer */ - function createClassifier(): Classifier; - interface DocumentHighlights { + export function createClassifier(): Classifier; + export interface DocumentHighlights { fileName: string; highlightSpans: HighlightSpan[]; } - function createDocumentRegistry(useCaseSensitiveFileNames?: boolean, currentDirectory?: string, jsDocParsingMode?: JSDocParsingMode): DocumentRegistry; + export function createDocumentRegistry(useCaseSensitiveFileNames?: boolean, currentDirectory?: string, jsDocParsingMode?: JSDocParsingMode): DocumentRegistry; /** * The document registry represents a store of SourceFile objects that can be shared between * multiple LanguageService instances. A LanguageService instance holds on the SourceFile (AST) @@ -11226,7 +13601,7 @@ declare namespace ts { * To create a default DocumentRegistry, use createDocumentRegistry to create one, and pass it * to all subsequent createLanguageService calls. */ - interface DocumentRegistry { + export interface DocumentRegistry { /** * Request a stored SourceFile with a given fileName and compilationSettings. * The first call to acquire will call createLanguageServiceSourceFile to generate @@ -11295,14 +13670,14 @@ declare namespace ts { releaseDocumentWithKey(path: Path, key: DocumentRegistryBucketKey, scriptKind: ScriptKind, impliedNodeFormat: ResolutionMode): void; reportStats(): string; } - type DocumentRegistryBucketKey = string & { + export type DocumentRegistryBucketKey = string & { __bucketKey: any; }; - function preProcessFile(sourceText: string, readImportFiles?: boolean, detectJavaScriptImports?: boolean): PreProcessedFileInfo; - function transpileModule(input: string, transpileOptions: TranspileOptions): TranspileOutput; - function transpileDeclaration(input: string, transpileOptions: TranspileOptions): TranspileOutput; - function transpile(input: string, compilerOptions?: CompilerOptions, fileName?: string, diagnostics?: Diagnostic[], moduleName?: string): string; - interface TranspileOptions { + export function preProcessFile(sourceText: string, readImportFiles?: boolean, detectJavaScriptImports?: boolean): PreProcessedFileInfo; + export function transpileModule(input: string, transpileOptions: TranspileOptions): TranspileOutput; + export function transpileDeclaration(input: string, transpileOptions: TranspileOptions): TranspileOutput; + export function transpile(input: string, compilerOptions?: CompilerOptions, fileName?: string, diagnostics?: Diagnostic[], moduleName?: string): string; + export interface TranspileOptions { compilerOptions?: CompilerOptions; fileName?: string; reportDiagnostics?: boolean; @@ -11311,32 +13686,32 @@ declare namespace ts { transformers?: CustomTransformers; jsDocParsingMode?: JSDocParsingMode; } - interface TranspileOutput { + export interface TranspileOutput { outputText: string; diagnostics?: Diagnostic[]; sourceMapText?: string; } - function toEditorSettings(options: EditorOptions | EditorSettings): EditorSettings; - function displayPartsToString(displayParts: SymbolDisplayPart[] | undefined): string; - function getDefaultCompilerOptions(): CompilerOptions; - function getSupportedCodeFixes(): readonly string[]; - function createLanguageServiceSourceFile(fileName: string, scriptSnapshot: IScriptSnapshot, scriptTargetOrOptions: ScriptTarget | CreateSourceFileOptions, version: string, setNodeParents: boolean, scriptKind?: ScriptKind): SourceFile; - function updateLanguageServiceSourceFile(sourceFile: SourceFile, scriptSnapshot: IScriptSnapshot, version: string, textChangeRange: TextChangeRange | undefined, aggressiveChecks?: boolean): SourceFile; - function createLanguageService(host: LanguageServiceHost, documentRegistry?: DocumentRegistry, syntaxOnlyOrLanguageServiceMode?: boolean | LanguageServiceMode): LanguageService; + export function toEditorSettings(options: EditorOptions | EditorSettings): EditorSettings; + export function displayPartsToString(displayParts: SymbolDisplayPart[] | undefined): string; + export function getDefaultCompilerOptions(): CompilerOptions; + export function getSupportedCodeFixes(): readonly string[]; + export function createLanguageServiceSourceFile(fileName: string, scriptSnapshot: IScriptSnapshot, scriptTargetOrOptions: ScriptTarget | CreateSourceFileOptions, version: string, setNodeParents: boolean, scriptKind?: ScriptKind): SourceFile; + export function updateLanguageServiceSourceFile(sourceFile: SourceFile, scriptSnapshot: IScriptSnapshot, version: string, textChangeRange: TextChangeRange | undefined, aggressiveChecks?: boolean): SourceFile; + export function createLanguageService(host: LanguageServiceHost, documentRegistry?: DocumentRegistry, syntaxOnlyOrLanguageServiceMode?: boolean | LanguageServiceMode): LanguageService; /** * Get the path of the default library files (lib.d.ts) as distributed with the typescript * node package. * The functionality is not supported if the ts module is consumed outside of a node module. */ - function getDefaultLibFilePath(options: CompilerOptions): string; + export function getDefaultLibFilePath(options: CompilerOptions): string; /** The version of the language service API */ - const servicesVersion = "0.8"; + export const servicesVersion = "0.8"; /** * Transform one or more nodes using the supplied transformers. * @param source A single `Node` or an array of `Node` objects. * @param transformers An array of `TransformerFactory` callbacks used to process the transformation. * @param compilerOptions Optional compiler options. */ - function transform(source: T | T[], transformers: TransformerFactory[], compilerOptions?: CompilerOptions): TransformationResult; + export function transform(source: T | T[], transformers: TransformerFactory[], compilerOptions?: CompilerOptions): TransformationResult; } export = ts; diff --git a/tests/baselines/reference/objectRestPropertyMustBeLast.js b/tests/baselines/reference/objectRestPropertyMustBeLast.js index aa644259f6e..9cd3a26a3ad 100644 --- a/tests/baselines/reference/objectRestPropertyMustBeLast.js +++ b/tests/baselines/reference/objectRestPropertyMustBeLast.js @@ -24,4 +24,4 @@ var _a, _b; var _c = { x: 1 }, x = _c.x; // Error, rest must be last property (_a = { x: 1 }, x = _a.x); // Error, rest must be last property var _d = { x: 1 }, x = _d.x, b = __rest(_d, ["a", "x"]); // Error, rest must be last property -(_b = { x: 1 }, x = _b.x, b = __rest(_b, ["x"])); // Error, rest must be last property +(_b = { x: 1 }, x = _b.x, b = __rest(_b, ["a", "x"])); // Error, rest must be last property