Skip to content

Commit 95b6afd

Browse files
committed
Remove BaseNodeFactory
1 parent cadf6e8 commit 95b6afd

File tree

7 files changed

+51
-142
lines changed

7 files changed

+51
-142
lines changed

src/compiler/_namespaces/ts.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ export * from "../diagnosticInformationMap.generated";
1414
export * from "../scanner";
1515
export * from "../utilitiesPublic";
1616
export * from "../utilities";
17-
export * from "../factory/baseNodeFactory";
1817
export * from "../factory/parenthesizerRules";
1918
export * from "../factory/nodeConverters";
2019
export * from "../factory/nodeFactory";

src/compiler/factory/baseNodeFactory.ts

Lines changed: 0 additions & 54 deletions
This file was deleted.

src/compiler/factory/nodeFactory.ts

Lines changed: 33 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import {
1717
AsteriskToken,
1818
AwaitExpression,
1919
AwaitKeyword,
20-
BaseNodeFactory,
2120
BigIntLiteral,
2221
BinaryExpression,
2322
BinaryOperator,
@@ -59,7 +58,6 @@ import {
5958
ConstructorTypeNode,
6059
ConstructSignatureDeclaration,
6160
ContinueStatement,
62-
createBaseNodeFactory,
6361
createNodeConverters,
6462
createParenthesizerRules,
6563
createScanner,
@@ -467,15 +465,15 @@ import {
467465
WithStatement,
468466
YieldExpression,
469467
} from "../_namespaces/ts";
470-
// import {
471-
// Node as NodeObject,
472-
// Identifier as IdentifierObject,
473-
// PrivateIdentifier as PrivateIdentifierObject,
474-
// Token as TokenObject,
475-
// SourceFile as SourceFileObject,
476-
// } from "../nodeConstructors";
477468
import {
478-
SourceMapSourceObject as SourceMapSourceObject,
469+
IdentifierObject,
470+
NodeObject,
471+
PrivateIdentifierObject,
472+
SourceFileObject,
473+
TokenObject,
474+
} from "../nodeConstructors";
475+
import {
476+
SourceMapSourceObject,
479477
} from "../objectConstructors";
480478

481479
let nextAutoGenerateId = 0;
@@ -491,6 +489,8 @@ export const enum NodeFactoryFlags {
491489
NoIndentationOnFreshPropertyAccess = 1 << 2,
492490
// Do not set an `original` pointer when updating a node.
493491
NoOriginalNode = 1 << 3,
492+
// Mark nodes as synthetic
493+
MarkSynthetic = 1 << 4,
494494
}
495495

496496
const nodeFactoryPatchers: ((factory: NodeFactory) => void)[] = [];
@@ -507,7 +507,8 @@ export function addNodeFactoryPatcher(fn: (factory: NodeFactory) => void) {
507507
*
508508
* @internal
509509
*/
510-
export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNodeFactory): NodeFactory {
510+
export function createNodeFactory(flags: NodeFactoryFlags): NodeFactory {
511+
const markSynthetic = !!(flags & NodeFactoryFlags.MarkSynthetic);
511512
const update = flags & NodeFactoryFlags.NoOriginalNode ? updateWithoutOriginal : updateWithOriginal;
512513

513514
// Lazily load the parenthesizer, node converters, and some factory methods until they are used.
@@ -531,7 +532,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
531532
const factory: NodeFactory = {
532533
get parenthesizer() { return parenthesizerRules(); },
533534
get converters() { return converters(); },
534-
baseFactory,
535535
flags,
536536
createNodeArray,
537537
createNumericLiteral,
@@ -1074,7 +1074,9 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
10741074
}
10751075

10761076
function createBaseNode<T extends Node>(kind: T["kind"]) {
1077-
return baseFactory.createBaseNode(kind) as Mutable<T>;
1077+
const node = new NodeObject(kind) as Node as Mutable<T>;
1078+
if (markSynthetic) node.flags |= NodeFlags.Synthesized;
1079+
return node;
10781080
}
10791081

10801082
function createBaseDeclaration<T extends Declaration>(kind: T["kind"]) {
@@ -1160,7 +1162,8 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
11601162
//
11611163

11621164
function createBaseIdentifier(escapedText: __String, originalKeywordKind: SyntaxKind | undefined) {
1163-
const node = baseFactory.createBaseIdentifierNode() as Mutable<Identifier>;
1165+
const node = new IdentifierObject() as Mutable<Identifier>;
1166+
if (markSynthetic) node.flags |= NodeFlags.Synthesized;
11641167
node.originalKeywordKind = originalKeywordKind;
11651168
node.escapedText = escapedText;
11661169
node.autoGenerate = undefined;
@@ -1257,7 +1260,8 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
12571260
}
12581261

12591262
function createBasePrivateIdentifier(escapedText: __String) {
1260-
const node = baseFactory.createBasePrivateIdentifierNode() as Mutable<PrivateIdentifier>;
1263+
const node = new PrivateIdentifierObject() as Mutable<PrivateIdentifier>;
1264+
if (markSynthetic) node.flags |= NodeFlags.Synthesized;
12611265
node.escapedText = escapedText;
12621266
node.autoGenerate = undefined;
12631267
node.transformFlags |= TransformFlags.ContainsClassFields;
@@ -1306,7 +1310,9 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
13061310
//
13071311

13081312
function createBaseToken<T extends Node>(kind: T["kind"]) {
1309-
return baseFactory.createBaseTokenNode(kind) as Mutable<T>;
1313+
const node = new TokenObject(kind) as Token<T["kind"]> as Mutable<T>;
1314+
if (markSynthetic) node.flags |= NodeFlags.Synthesized;
1315+
return node;
13101316
}
13111317

13121318
// @api
@@ -6033,7 +6039,8 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
60336039
endOfFileToken: EndOfFileToken,
60346040
flags: NodeFlags
60356041
) {
6036-
const node = baseFactory.createBaseSourceFileNode() as Mutable<SourceFile>;
6042+
const node = new SourceFileObject() as Mutable<SourceFile>;
6043+
if (markSynthetic) node.flags |= NodeFlags.Synthesized;
60376044
node.statements = createNodeArray(statements);
60386045
node.endOfFileToken = endOfFileToken;
60396046
node.flags |= flags;
@@ -6102,7 +6109,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
61026109

61036110
function cloneRedirectedSourceFile(source: SourceFile) {
61046111
const node = createRedirectedSourceFile(source.redirectInfo!) as Mutable<SourceFile>;
6105-
node.flags |= source.flags & ~NodeFlags.Synthesized;
6112+
if (markSynthetic) node.flags |= source.flags & ~NodeFlags.Synthesized;
61066113
node.fileName = source.fileName;
61076114
node.path = source.path;
61086115
node.resolvedPath = source.resolvedPath;
@@ -6116,8 +6123,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
61166123
function cloneSourceFileWorker(source: SourceFile) {
61176124
// TODO: This mechanism for cloning results in megamorphic property reads and writes. In future perf-related
61186125
// work, we should consider switching explicit property assignments instead of using `for..in`.
6119-
const node = baseFactory.createBaseSourceFileNode() as Mutable<SourceFile>;
6120-
node.flags |= source.flags & ~NodeFlags.Synthesized;
6126+
const node = new SourceFileObject() as Mutable<SourceFile>;
61216127
for (const p in source) {
61226128
if (hasProperty(node, p) || !hasProperty(source, p)) {
61236129
continue;
@@ -6388,7 +6394,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
63886394

63896395
function cloneGeneratedIdentifier(node: GeneratedIdentifier): GeneratedIdentifier {
63906396
const clone = createBaseIdentifier(node.escapedText, /*originalKeywordKind*/ undefined) as Mutable<GeneratedIdentifier>;
6391-
clone.flags |= node.flags & ~NodeFlags.Synthesized;
6397+
if (markSynthetic) clone.flags |= node.flags & ~NodeFlags.Synthesized;
63926398
clone.autoGenerate = { ...node.autoGenerate };
63936399
clone.transformFlags = node.transformFlags;
63946400
setOriginalNode(clone, node);
@@ -6397,7 +6403,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
63976403

63986404
function cloneIdentifier(node: Identifier): Identifier {
63996405
const clone = createBaseIdentifier(node.escapedText, node.originalKeywordKind);
6400-
clone.flags |= node.flags & ~NodeFlags.Synthesized;
6406+
if (markSynthetic) clone.flags |= node.flags & ~NodeFlags.Synthesized;
64016407
clone.typeArguments = node.typeArguments;
64026408
clone.hasExtendedUnicodeEscape = node.hasExtendedUnicodeEscape;
64036409
clone.jsDoc = node.jsDoc;
@@ -6411,7 +6417,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
64116417

64126418
function cloneGeneratedPrivateIdentifier(node: GeneratedPrivateIdentifier): GeneratedPrivateIdentifier {
64136419
const clone = createBasePrivateIdentifier(node.escapedText) as Mutable<GeneratedPrivateIdentifier>;
6414-
clone.flags |= node.flags & ~NodeFlags.Synthesized;
6420+
if (markSynthetic) clone.flags |= node.flags & ~NodeFlags.Synthesized;
64156421
clone.autoGenerate = { ...node.autoGenerate };
64166422
clone.transformFlags = node.transformFlags;
64176423
setOriginalNode(clone, node);
@@ -6420,7 +6426,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
64206426

64216427
function clonePrivateIdentifier(node: PrivateIdentifier): PrivateIdentifier {
64226428
const clone = createBasePrivateIdentifier(node.escapedText);
6423-
clone.flags |= node.flags & ~NodeFlags.Synthesized;
6429+
if (markSynthetic) clone.flags |= node.flags & ~NodeFlags.Synthesized;
64246430
clone.transformFlags = node.transformFlags;
64256431
setOriginalNode(clone, node);
64266432
return clone;
@@ -6452,10 +6458,9 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
64526458
}
64536459

64546460
const clone =
6455-
!isNodeKind(node.kind) ? baseFactory.createBaseTokenNode(node.kind) as T :
6456-
baseFactory.createBaseNode(node.kind) as T;
6461+
!isNodeKind(node.kind) ? new TokenObject(node.kind) as Node as T :
6462+
new NodeObject(node.kind) as Node as T;
64576463

6458-
(clone as Mutable<T>).flags |= (node.flags & ~NodeFlags.Synthesized);
64596464
(clone as Mutable<T>).transformFlags = node.transformFlags;
64606465
setOriginalNode(clone, node);
64616466

@@ -7388,22 +7393,7 @@ export function getTransformFlagsSubtreeExclusions(kind: SyntaxKind) {
73887393
}
73897394
}
73907395

7391-
const baseFactory = createBaseNodeFactory();
7392-
7393-
function makeSynthetic(node: Node) {
7394-
(node as Mutable<Node>).flags |= NodeFlags.Synthesized;
7395-
return node;
7396-
}
7397-
7398-
const syntheticFactory: BaseNodeFactory = {
7399-
createBaseSourceFileNode: () => makeSynthetic(baseFactory.createBaseSourceFileNode()),
7400-
createBaseIdentifierNode: () => makeSynthetic(baseFactory.createBaseIdentifierNode()),
7401-
createBasePrivateIdentifierNode: () => makeSynthetic(baseFactory.createBasePrivateIdentifierNode()),
7402-
createBaseTokenNode: kind => makeSynthetic(baseFactory.createBaseTokenNode(kind)),
7403-
createBaseNode: kind => makeSynthetic(baseFactory.createBaseNode(kind)),
7404-
};
7405-
7406-
export const factory = createNodeFactory(NodeFactoryFlags.NoIndentationOnFreshPropertyAccess, syntheticFactory);
7396+
export const factory = createNodeFactory(NodeFactoryFlags.NoIndentationOnFreshPropertyAccess | NodeFactoryFlags.MarkSynthetic);
74077397

74087398
export function createUnparsedSourceFile(text: string): UnparsedSource;
74097399
export function createUnparsedSourceFile(inputFile: InputFiles, type: "js" | "dts", stripInternal?: boolean): UnparsedSource;

src/compiler/parser.ts

Lines changed: 11 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { IdentifierObject, NodeObject, PrivateIdentifierObject, SourceFileObject, TokenObject } from "./nodeConstructors";
21
import * as ts from "./_namespaces/ts";
32
import {
43
AccessorDeclaration,
@@ -17,7 +16,6 @@ import {
1716
AsteriskToken,
1817
attachFileToDiagnostics,
1918
AwaitExpression,
20-
BaseNodeFactory,
2119
BinaryExpression,
2220
BinaryOperatorToken,
2321
BindingElement,
@@ -401,21 +399,8 @@ const enum SpeculationKind {
401399
Reparse
402400
}
403401

404-
/**
405-
* NOTE: You should not use this, it is only exported to support `createNode` in `~/src/deprecatedCompat/deprecations.ts`.
406-
*
407-
* @internal
408-
*/
409-
export const parseBaseNodeFactory: BaseNodeFactory = {
410-
createBaseSourceFileNode: () => new SourceFileObject(),
411-
createBaseIdentifierNode: () => new IdentifierObject(),
412-
createBasePrivateIdentifierNode: () => new PrivateIdentifierObject(),
413-
createBaseTokenNode: kind => new TokenObject(kind),
414-
createBaseNode: kind => new NodeObject(kind),
415-
};
416-
417402
/** @internal */
418-
export const parseNodeFactory = createNodeFactory(NodeFactoryFlags.NoParenthesizerRules, parseBaseNodeFactory);
403+
export const parseNodeFactory = createNodeFactory(NodeFactoryFlags.NoParenthesizerRules);
419404

420405
function visitNode<T>(cbNode: (node: Node) => T, node: Node | undefined): T | undefined {
421406
return node && cbNode(node);
@@ -1410,22 +1395,7 @@ namespace Parser {
14101395

14111396
const disallowInAndDecoratorContext = NodeFlags.DisallowInContext | NodeFlags.DecoratorContext;
14121397

1413-
function countNode(node: Node) {
1414-
nodeCount++;
1415-
return node;
1416-
}
1417-
1418-
// Rather than using `createBaseNodeFactory` here, we establish a `BaseNodeFactory` that closes over the
1419-
// constructors above, which are reset each time `initializeState` is called.
1420-
const baseNodeFactory: BaseNodeFactory = {
1421-
createBaseSourceFileNode: () => countNode(new SourceFileObject()),
1422-
createBaseIdentifierNode: () => countNode(new IdentifierObject()),
1423-
createBasePrivateIdentifierNode: () => countNode(new PrivateIdentifierObject()),
1424-
createBaseTokenNode: kind => countNode(new TokenObject(kind)),
1425-
createBaseNode: kind => countNode(new NodeObject(kind))
1426-
};
1427-
1428-
const factory = createNodeFactory(NodeFactoryFlags.NoParenthesizerRules | NodeFactoryFlags.NoNodeConverters | NodeFactoryFlags.NoOriginalNode, baseNodeFactory);
1398+
const factory = createNodeFactory(NodeFactoryFlags.NoParenthesizerRules | NodeFactoryFlags.NoNodeConverters | NodeFactoryFlags.NoOriginalNode);
14291399

14301400
let fileName: string;
14311401
let sourceFlags: NodeFlags;
@@ -1898,9 +1868,16 @@ namespace Parser {
18981868
setTextRangePosWidth(sourceFile, 0, sourceText.length);
18991869
setFields(sourceFile);
19001870

1871+
// include the file in the count
1872+
nodeCount++;
1873+
19011874
// If we parsed this as an external module, it may contain top-level await
19021875
if (!isDeclarationFile && isExternalModule(sourceFile) && sourceFile.transformFlags & TransformFlags.ContainsPossibleTopLevelAwait) {
1903-
sourceFile = reparseTopLevelAwait(sourceFile);
1876+
const updated = reparseTopLevelAwait(sourceFile);
1877+
if (sourceFile !== updated) {
1878+
nodeCount++;
1879+
sourceFile = updated;
1880+
}
19041881
setFields(sourceFile);
19051882
}
19061883

@@ -2514,6 +2491,7 @@ namespace Parser {
25142491
(node as Mutable<T>).flags |= NodeFlags.ThisNodeHasError;
25152492
}
25162493

2494+
nodeCount++;
25172495
return node;
25182496
}
25192497

src/compiler/types.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import {
2-
BaseNodeFactory,
32
CreateSourceFileOptions,
43
EmitHelperFactory,
54
GetCanonicalFileName,
@@ -8135,7 +8134,6 @@ export interface GeneratedNamePart {
81358134
export interface NodeFactory {
81368135
/** @internal */ readonly parenthesizer: ParenthesizerRules;
81378136
/** @internal */ readonly converters: NodeConverters;
8138-
/** @internal */ readonly baseFactory: BaseNodeFactory;
81398137
/** @internal */ readonly flags: NodeFactoryFlags;
81408138
createNodeArray<T extends Node>(elements?: readonly T[], hasTrailingComma?: boolean): NodeArray<T>;
81418139

0 commit comments

Comments
 (0)