mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
Move UnparsedSource nodes to factory
This commit is contained in:
@@ -1,5 +1,20 @@
|
||||
namespace ts {
|
||||
// #region Node Factory compat (deprecated since 3.8)
|
||||
// The following are deprecations for the public API. Deprecated exports are removed from the compiler itself
|
||||
// and compatible implementations are added here, along with an appropriate deprecation warning using
|
||||
// the `@deprecated` JSDoc tag as well as the `Debug.deprecateExport` API.
|
||||
//
|
||||
// Deprecations fall into one of three categories:
|
||||
//
|
||||
// * "soft" - Soft deprecations are indicated with the `@deprecated` JSDoc Tag.
|
||||
// * "warn" - Warning deprecations are indicated with the `@deprecated` JSDoc Tag and a diagnostic message (assuming a compatible host)
|
||||
// * "error" - Error deprecations are indicated with the `@deprecated` JSDoc tag and will throw a `TypeError` when invoked.
|
||||
|
||||
// DEPRECATION: Node factory top-level exports
|
||||
// DEPRECATION PLAN:
|
||||
// - soft: 3.8
|
||||
// - warn: 3.9
|
||||
// - error: TBD
|
||||
// #region Node factory top-level exports
|
||||
|
||||
// #region export const { ... } = factory;
|
||||
// NOTE: These exports are deprecated in favor of using a `NodeFactory` instance and exist here purely for backwards compatibility reasons.
|
||||
@@ -1380,7 +1395,7 @@ namespace ts {
|
||||
initializer?: Expression
|
||||
): PropertySignature {
|
||||
const node = factory.createPropertySignature(modifiers, name, questionToken, type);
|
||||
node.initializer = initializer;
|
||||
factory.trackExtraneousChildNode(node, node.initializer = initializer);
|
||||
return node;
|
||||
}
|
||||
|
||||
@@ -1395,13 +1410,14 @@ namespace ts {
|
||||
type: TypeNode | undefined,
|
||||
initializer: Expression | undefined
|
||||
) {
|
||||
return node.modifiers !== modifiers
|
||||
|| node.name !== name
|
||||
|| node.questionToken !== questionToken
|
||||
|| node.type !== type
|
||||
|| node.initializer !== initializer
|
||||
? updateNode(createPropertySignature(modifiers, name, questionToken, type, initializer), node)
|
||||
: node;
|
||||
let updated = factory.updatePropertySignature(node, modifiers, name, questionToken, type);
|
||||
if (node.initializer !== initializer) {
|
||||
if (updated === node) {
|
||||
updated = factory.cloneNode(node);
|
||||
}
|
||||
factory.trackExtraneousChildNode(updated, updated.initializer = initializer);
|
||||
}
|
||||
return updated;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1905,9 +1921,38 @@ namespace ts {
|
||||
warnAfter: "3.9"
|
||||
});
|
||||
|
||||
// #endregion NodeFactory compat (deprecated in 3.8)
|
||||
Debug.deprecateExport(ts, "createNode", {
|
||||
message: "Use an appropriate `factory` method instead.",
|
||||
since: "3.8",
|
||||
warnAfter: "3.9"
|
||||
});
|
||||
|
||||
// #region Node Test compat (deprecated since 3.8)
|
||||
/**
|
||||
* Creates a shallow, memberwise clone of a node for mutation.
|
||||
* @deprecated Use `factory.cloneNode` instead and set `pos`, `end`, and `parent` as needed.
|
||||
*/
|
||||
export function getMutableClone<T extends Node>(node: T): T {
|
||||
const clone = factory.cloneNode(node);
|
||||
clone.pos = node.pos;
|
||||
clone.end = node.end;
|
||||
clone.parent = node.parent;
|
||||
return clone;
|
||||
}
|
||||
|
||||
Debug.deprecateExport(ts, "getMutableClone", {
|
||||
message: "Use `factory.cloneNode` instead and set `pos`, `end`, and `parent` as needed.",
|
||||
since: "3.8",
|
||||
warnAfter: "3.9"
|
||||
});
|
||||
|
||||
// #endregion Node Factory top-level exports
|
||||
|
||||
// DEPRECATION: Renamed node tests
|
||||
// DEPRECATION PLAN:
|
||||
// - soft: 3.8
|
||||
// - warn: 3.9
|
||||
// - error: TBD
|
||||
// #region Renamed node Tests
|
||||
/**
|
||||
* @deprecated Use `isTypeAssertionExpression` instead.
|
||||
*/
|
||||
@@ -1921,5 +1966,5 @@ namespace ts {
|
||||
warnAfter: "3.9"
|
||||
});
|
||||
|
||||
// #endregion NodeTest compat (deprecated since 3.8)
|
||||
// #endregion Renamed node Tests
|
||||
}
|
||||
@@ -7,6 +7,6 @@
|
||||
{ "path": "../compiler" }
|
||||
],
|
||||
"files": [
|
||||
"factory.ts"
|
||||
"deprecations.ts"
|
||||
]
|
||||
}
|
||||
+12
-15
@@ -4450,12 +4450,12 @@ namespace ts {
|
||||
}
|
||||
const parameterTypeNode = typeToTypeNodeHelper(parameterType, context);
|
||||
|
||||
const modifiers = !(context.flags & NodeBuilderFlags.OmitParameterModifiers) && preserveModifierFlags && parameterDeclaration && parameterDeclaration.modifiers ? parameterDeclaration.modifiers.map(getSynthesizedClone) : undefined;
|
||||
const modifiers = !(context.flags & NodeBuilderFlags.OmitParameterModifiers) && preserveModifierFlags && parameterDeclaration && parameterDeclaration.modifiers ? parameterDeclaration.modifiers.map(factory.cloneNode) : undefined;
|
||||
const isRest = parameterDeclaration && isRestParameter(parameterDeclaration) || getCheckFlags(parameterSymbol) & CheckFlags.RestParameter;
|
||||
const dotDotDotToken = isRest ? factory.createToken(SyntaxKind.DotDotDotToken) : undefined;
|
||||
const name = parameterDeclaration ? parameterDeclaration.name ?
|
||||
parameterDeclaration.name.kind === SyntaxKind.Identifier ? setEmitFlags(getSynthesizedClone(parameterDeclaration.name), EmitFlags.NoAsciiEscaping) :
|
||||
parameterDeclaration.name.kind === SyntaxKind.QualifiedName ? setEmitFlags(getSynthesizedClone(parameterDeclaration.name.right), EmitFlags.NoAsciiEscaping) :
|
||||
parameterDeclaration.name.kind === SyntaxKind.Identifier ? setEmitFlags(factory.cloneNode(parameterDeclaration.name), EmitFlags.NoAsciiEscaping) :
|
||||
parameterDeclaration.name.kind === SyntaxKind.QualifiedName ? setEmitFlags(factory.cloneNode(parameterDeclaration.name.right), EmitFlags.NoAsciiEscaping) :
|
||||
cloneBindingName(parameterDeclaration.name) :
|
||||
symbolName(parameterSymbol) :
|
||||
symbolName(parameterSymbol);
|
||||
@@ -4479,7 +4479,7 @@ namespace ts {
|
||||
trackComputedName(node.expression, context.enclosingDeclaration, context);
|
||||
}
|
||||
const visited = visitEachChild(node, elideInitializerAndSetEmitFlags, nullTransformationContext, /*nodesVisitor*/ undefined, elideInitializerAndSetEmitFlags)!;
|
||||
const clone = nodeIsSynthesized(visited) ? visited : getSynthesizedClone(visited);
|
||||
const clone = nodeIsSynthesized(visited) ? visited : factory.cloneNode(visited);
|
||||
if (clone.kind === SyntaxKind.BindingElement) {
|
||||
(<BindingElement>clone).initializer = undefined;
|
||||
}
|
||||
@@ -5935,7 +5935,7 @@ namespace ts {
|
||||
// try to reuse the existing annotation
|
||||
const existing = getEffectiveTypeAnnotationNode(declWithExistingAnnotation)!;
|
||||
const transformed = visitNode(existing, visitExistingNodeTreeSymbols);
|
||||
return transformed === existing ? getMutableClone(existing) : transformed;
|
||||
return transformed === existing ? setTextRange(factory.cloneNode(existing), existing) : transformed;
|
||||
}
|
||||
const oldFlags = context.flags;
|
||||
if (type.flags & TypeFlags.UniqueESSymbol &&
|
||||
@@ -6689,13 +6689,10 @@ namespace ts {
|
||||
if (parentAccess && parentAccess.flowNode) {
|
||||
const propName = getDestructuringPropertyName(node);
|
||||
if (propName) {
|
||||
const result = <ElementAccessExpression>createNode(SyntaxKind.ElementAccessExpression, node.pos, node.end);
|
||||
result.parent = node;
|
||||
result.expression = <LeftHandSideExpression>parentAccess;
|
||||
const literal = <StringLiteral>createNode(SyntaxKind.StringLiteral, node.pos, node.end);
|
||||
const literal = setTextRange(parseNodeFactory.createStringLiteral(propName), node);
|
||||
const result = setTextRange(parseNodeFactory.createElementAccess(parentAccess, literal), node);
|
||||
literal.parent = result;
|
||||
literal.text = propName;
|
||||
result.argumentExpression = literal;
|
||||
result.parent = node;
|
||||
result.flowNode = parentAccess.flowNode;
|
||||
return result;
|
||||
}
|
||||
@@ -20231,7 +20228,8 @@ namespace ts {
|
||||
if (returnType && returnType.flags & TypeFlags.Union) {
|
||||
const unionTypes = (<UnionTypeNode>funcTypeNode.type).types;
|
||||
if (unionTypes && unionTypes[unionTypes.length - 1].kind === SyntaxKind.UndefinedKeyword) {
|
||||
const parenedFuncType = getMutableClone(funcTypeNode);
|
||||
// TODO(rbuckton): Does this need to be parented?
|
||||
const parenedFuncType = setParent(setTextRange(factory.cloneNode(funcTypeNode), funcTypeNode), funcTypeNode.parent);
|
||||
// Highlight to the end of the second to last constituent of the union
|
||||
parenedFuncType.end = unionTypes[unionTypes.length - 2].end;
|
||||
addRelatedInfo(diag, createDiagnosticForNode(parenedFuncType, Diagnostics.Did_you_mean_to_parenthesize_this_function_type));
|
||||
@@ -23901,10 +23899,9 @@ namespace ts {
|
||||
}
|
||||
|
||||
function createSyntheticExpression(parent: Node, type: Type, isSpread?: boolean) {
|
||||
const result = <SyntheticExpression>createNode(SyntaxKind.SyntheticExpression, parent.pos, parent.end);
|
||||
const result = parseNodeFactory.createSyntheticExpression(type, isSpread);
|
||||
setTextRange(result, parent);
|
||||
result.parent = parent;
|
||||
result.type = type;
|
||||
result.isSpread = isSpread || false;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
+21
-17
@@ -674,30 +674,34 @@ namespace ts {
|
||||
}
|
||||
|
||||
function createSourceFilesFromBundleBuildInfo(bundle: BundleBuildInfo, buildInfoDirectory: string, host: EmitUsingBuildInfoHost): readonly SourceFile[] {
|
||||
const sourceFiles = bundle.sourceFiles.map(fileName => {
|
||||
const sourceFile = createNode(SyntaxKind.SourceFile, 0, 0) as SourceFile;
|
||||
const jsBundle = Debug.assertDefined(bundle.js);
|
||||
const prologueMap = jsBundle.sources?.prologues && arrayToMap(jsBundle.sources.prologues, prologueInfo => "" + prologueInfo.file);
|
||||
return bundle.sourceFiles.map((fileName, index) => {
|
||||
const prologueInfo = prologueMap?.get("" + index);
|
||||
const statements = prologueInfo?.directives.map(directive => {
|
||||
const literal = setTextRange(factory.createStringLiteral(directive.expression.text), directive.expression);
|
||||
const statement = setTextRange(factory.createExpressionStatement(literal), directive);
|
||||
literal.parent = statement;
|
||||
return statement;
|
||||
});
|
||||
const eofToken = factory.createToken(SyntaxKind.EndOfFileToken);
|
||||
const sourceFile = factory.createSourceFile(statements ?? [], eofToken);
|
||||
sourceFile.fileName = getRelativePathFromDirectory(
|
||||
host.getCurrentDirectory(),
|
||||
getNormalizedAbsolutePath(fileName, buildInfoDirectory),
|
||||
!host.useCaseSensitiveFileNames()
|
||||
);
|
||||
sourceFile.text = "";
|
||||
sourceFile.statements = factory.createNodeArray();
|
||||
sourceFile.text = prologueInfo?.text ?? "";
|
||||
sourceFile.pos = 0;
|
||||
sourceFile.end = prologueInfo?.text.length ?? 0;
|
||||
for (const statement of sourceFile.statements) {
|
||||
statement.parent = sourceFile;
|
||||
}
|
||||
eofToken.pos = sourceFile.end;
|
||||
eofToken.end = sourceFile.end;
|
||||
eofToken.parent = sourceFile;
|
||||
return sourceFile;
|
||||
});
|
||||
const jsBundle = Debug.assertDefined(bundle.js);
|
||||
forEach(jsBundle.sources && jsBundle.sources.prologues, prologueInfo => {
|
||||
const sourceFile = sourceFiles[prologueInfo.file];
|
||||
sourceFile.text = prologueInfo.text;
|
||||
sourceFile.end = prologueInfo.text.length;
|
||||
sourceFile.statements = factory.createNodeArray(prologueInfo.directives.map(directive => {
|
||||
const statement = createNode(SyntaxKind.ExpressionStatement, directive.pos, directive.end) as PrologueDirective;
|
||||
statement.expression = createNode(SyntaxKind.StringLiteral, directive.expression.pos, directive.expression.end) as StringLiteral;
|
||||
statement.expression.text = directive.expression.text;
|
||||
return statement;
|
||||
}));
|
||||
});
|
||||
return sourceFiles;
|
||||
}
|
||||
|
||||
/*@internal*/
|
||||
|
||||
+223
-163
@@ -24,6 +24,7 @@ namespace ts {
|
||||
* - This is raised *after* the child has been attached to the parent.
|
||||
* - This is raised *before* the transform flags of the child have been aggregated into the parent.
|
||||
* - The `parent` pointer for the child will likely be `undefined`.
|
||||
* - NOTE: This may be raised *after* `onFinishNode` if the child is an *extraneous child* attached to a node purely for the purposes of reporting diagnostics.
|
||||
*/
|
||||
onSetChild?(parent: Node, child: Node): void;
|
||||
/**
|
||||
@@ -32,8 +33,9 @@ namespace ts {
|
||||
* - This is raised *after* the array of children has been attached to the parent.
|
||||
* - This is raised *before* the transform flags of the child have been aggregated into the parent.
|
||||
* - The `parent` pointer for each child in the array will likely be `undefined`.
|
||||
* - NOTE: This may be raised *after* `onFinishNode` if the child is an *extraneous child* attached to a node purely for the purposes of reporting diagnostics.
|
||||
*/
|
||||
onSetChildren?(parent: Node, children: NodeArray<Node>): void;
|
||||
onSetChildren?(parent: Node, children: readonly Node[]): void;
|
||||
/**
|
||||
* Observes when a `Node` is "finished" (i.e. its child nodes have been attached).
|
||||
* - This is raised *after* transform flags for the node have been aggregated.
|
||||
@@ -76,10 +78,11 @@ namespace ts {
|
||||
const createSourceFileNode = observeResult(baseFactory.createBaseSourceFileNode, treeStateObserver && treeStateObserver.onCreateNode);
|
||||
const setChild = observeArguments(setChildWorker, treeStateObserver && treeStateObserver.onSetChild);
|
||||
const setChildren = observeArguments(setChildrenWorker, treeStateObserver && treeStateObserver.onSetChildren);
|
||||
const setChildrenArray = observeArguments(setChildrenArrayWorker, treeStateObserver && treeStateObserver.onSetChildren);
|
||||
const finish = observeResult(finishWorker, treeStateObserver && treeStateObserver.onFinishNode);
|
||||
const finishJSDoc = observeResult(identity, treeStateObserver && treeStateObserver.onFinishNode);
|
||||
const update = observeArguments(updateWorker, treeStateObserver && treeStateObserver.onUpdateNode);
|
||||
const reuse = observeResult(reuseWorker, treeStateObserver && treeStateObserver.onReuseNode);
|
||||
const update = observeArguments(updateNodeWorker, treeStateObserver && treeStateObserver.onUpdateNode);
|
||||
const reuse = observeResult(identity, treeStateObserver && treeStateObserver.onReuseNode);
|
||||
|
||||
const factory: NodeFactory = {
|
||||
get parenthesizer() { return parenthesizerRules(); },
|
||||
@@ -421,6 +424,14 @@ namespace ts {
|
||||
updateSourceFile,
|
||||
createBundle,
|
||||
updateBundle,
|
||||
createUnparsedSource,
|
||||
createUnparsedPrologue,
|
||||
createUnparsedPrepend,
|
||||
createUnparsedTextLike,
|
||||
createUnparsedSyntheticReference,
|
||||
createInputFiles,
|
||||
createSyntheticExpression,
|
||||
createSyntaxList,
|
||||
createNotEmittedStatement,
|
||||
createPartiallyEmittedExpression,
|
||||
updatePartiallyEmittedExpression,
|
||||
@@ -430,6 +441,7 @@ namespace ts {
|
||||
createMergeDeclarationMarker,
|
||||
createSyntheticReferenceExpression,
|
||||
updateSyntheticReferenceExpression,
|
||||
cloneNode,
|
||||
|
||||
// Lazily load factory methods for common operator factories and utilities
|
||||
get createSignatureDeclaration() { return lazyFactory().createSignatureDeclaration; },
|
||||
@@ -1209,7 +1221,7 @@ namespace ts {
|
||||
markTypeScriptClassSyntax(node);
|
||||
}
|
||||
markClassFields(node);
|
||||
if (questionOrExclamationToken) {
|
||||
if (questionOrExclamationToken || hasModifier(node, ModifierFlags.Ambient)) {
|
||||
markTypeScript(node);
|
||||
}
|
||||
}
|
||||
@@ -4523,6 +4535,94 @@ namespace ts {
|
||||
: reuse(node);
|
||||
}
|
||||
|
||||
// @api
|
||||
function createUnparsedSource(prologues: readonly UnparsedPrologue[], syntheticReferences: readonly UnparsedSyntheticReference[] | undefined, texts: readonly UnparsedSourceText[]) {
|
||||
const node = createBaseNode<UnparsedSource>(SyntaxKind.UnparsedSource);
|
||||
setChildrenArray(node, node.prologues = prologues);
|
||||
setChildrenArray(node, node.syntheticReferences = syntheticReferences);
|
||||
setChildrenArray(node, node.texts = texts);
|
||||
node.fileName = "";
|
||||
node.text = "";
|
||||
node.helpers = undefined;
|
||||
node.referencedFiles = emptyArray;
|
||||
node.typeReferenceDirectives = undefined;
|
||||
node.libReferenceDirectives = emptyArray;
|
||||
node.hasNoDefaultLib = undefined;
|
||||
node.sourceMapPath = undefined;
|
||||
node.sourceMapText = undefined;
|
||||
node.oldFileOfCurrentEmit = undefined;
|
||||
node.parsedSourceMap = undefined;
|
||||
node.getLineAndCharacterOfPosition = pos => getLineAndCharacterOfPosition(node, pos);
|
||||
return node;
|
||||
}
|
||||
|
||||
function createBaseUnparsedNode<T extends UnparsedNode>(kind: T["kind"], data?: string): T {
|
||||
const node = createBaseNode<T>(kind);
|
||||
node.data = data;
|
||||
return node;
|
||||
}
|
||||
|
||||
// @api
|
||||
function createUnparsedPrologue(data?: string): UnparsedPrologue {
|
||||
return createBaseUnparsedNode(SyntaxKind.UnparsedPrologue, data);
|
||||
}
|
||||
|
||||
// @api
|
||||
function createUnparsedPrepend(data: string | undefined, texts: readonly UnparsedTextLike[]): UnparsedPrepend {
|
||||
const node = createBaseUnparsedNode<UnparsedPrepend>(SyntaxKind.UnparsedPrepend, data);
|
||||
setChildrenArray(node, node.texts = texts);
|
||||
return node;
|
||||
}
|
||||
|
||||
// @api
|
||||
function createUnparsedTextLike(data: string | undefined, internal: boolean): UnparsedTextLike {
|
||||
return createBaseUnparsedNode(internal ? SyntaxKind.UnparsedInternalText : SyntaxKind.UnparsedText, data);
|
||||
}
|
||||
|
||||
// @api
|
||||
function createUnparsedSyntheticReference(section: BundleFileHasNoDefaultLib | BundleFileReference): UnparsedSyntheticReference {
|
||||
const node = createBaseNode<UnparsedSyntheticReference>(SyntaxKind.UnparsedSyntheticReference);
|
||||
node.data = section.data;
|
||||
node.section = section;
|
||||
return node;
|
||||
}
|
||||
|
||||
// @api
|
||||
function createInputFiles(): InputFiles {
|
||||
const node = createBaseNode<InputFiles>(SyntaxKind.InputFiles);
|
||||
node.javascriptPath = undefined;
|
||||
node.javascriptText = "";
|
||||
node.javascriptMapPath = undefined;
|
||||
node.javascriptMapText = undefined;
|
||||
node.declarationPath = undefined;
|
||||
node.declarationText = "";
|
||||
node.declarationMapPath = undefined;
|
||||
node.declarationMapText = undefined;
|
||||
node.buildInfoPath = undefined;
|
||||
node.buildInfo = undefined;
|
||||
node.oldFileOfCurrentEmit = undefined;
|
||||
return node;
|
||||
}
|
||||
|
||||
//
|
||||
// Synthetic Nodes (used by checker)
|
||||
//
|
||||
|
||||
// @api
|
||||
function createSyntheticExpression(type: Type, isSpread = false) {
|
||||
const node = createBaseNode<SyntheticExpression>(SyntaxKind.SyntheticExpression);
|
||||
node.type = type;
|
||||
node.isSpread = isSpread;
|
||||
return node;
|
||||
}
|
||||
|
||||
// @api
|
||||
function createSyntaxList(children: Node[]) {
|
||||
const node = createBaseNode<SyntaxList>(SyntaxKind.SyntaxList);
|
||||
node._children = children;
|
||||
return node;
|
||||
}
|
||||
|
||||
//
|
||||
// Transformation nodes
|
||||
//
|
||||
@@ -4629,10 +4729,39 @@ namespace ts {
|
||||
function updateSyntheticReferenceExpression(node: SyntheticReferenceExpression, expression: Expression, thisArg: Expression) {
|
||||
return node.expression !== expression
|
||||
|| node.thisArg !== thisArg
|
||||
? updateNode(createSyntheticReferenceExpression(expression, thisArg), node)
|
||||
? update(createSyntheticReferenceExpression(expression, thisArg), node)
|
||||
: node;
|
||||
}
|
||||
|
||||
// @api
|
||||
function cloneNode<T extends Node | undefined>(node: T): T;
|
||||
function cloneNode<T extends Node>(node: T) {
|
||||
// We don't use "clone" from core.ts here, as we need to preserve the prototype chain of
|
||||
// the original node. We also need to exclude specific properties and only include own-
|
||||
// properties (to skip members already defined on the shared prototype).
|
||||
if (node === undefined) {
|
||||
return node;
|
||||
}
|
||||
|
||||
const clone = node.kind === SyntaxKind.SourceFile ? createSourceFileNode(node.kind) as T:
|
||||
node.kind === SyntaxKind.Identifier ? createIdentifierNode(node.kind) as T:
|
||||
!isNodeKind(node.kind) ? createTokenNode(node.kind) as T:
|
||||
createBaseNode(node.kind) as T;
|
||||
|
||||
clone.flags |= node.flags;
|
||||
setOriginalNode(clone, node);
|
||||
|
||||
for (const key in node) {
|
||||
if (clone.hasOwnProperty(key) || !node.hasOwnProperty(key)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
clone[key] = node[key];
|
||||
}
|
||||
|
||||
return clone;
|
||||
}
|
||||
|
||||
function asNodeArray<T extends Node>(array: readonly T[]): NodeArray<T>;
|
||||
function asNodeArray<T extends Node>(array: readonly T[] | undefined): NodeArray<T> | undefined;
|
||||
function asNodeArray<T extends Node>(array: readonly T[] | undefined): NodeArray<T> | undefined {
|
||||
@@ -4662,18 +4791,14 @@ namespace ts {
|
||||
}
|
||||
|
||||
function setChildWorker(parent: Node, child: Node | undefined): void {
|
||||
if (!skipTransformationFlags) {
|
||||
if (child) {
|
||||
parent.transformFlags |= propagateChildFlags(child);
|
||||
}
|
||||
if (!skipTransformationFlags && child) {
|
||||
parent.transformFlags |= propagateChildFlags(child);
|
||||
}
|
||||
}
|
||||
|
||||
function setChildrenWorker(parent: Node, children: NodeArray<Node> | undefined): void {
|
||||
if (!skipTransformationFlags) {
|
||||
if (children) {
|
||||
parent.transformFlags |= propagateChildrenFlags(children);
|
||||
}
|
||||
if (!skipTransformationFlags && children) {
|
||||
parent.transformFlags |= propagateChildrenFlags(children);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4683,14 +4808,18 @@ namespace ts {
|
||||
}
|
||||
return node;
|
||||
}
|
||||
}
|
||||
|
||||
function updateWorker<T extends Node>(updated: T, original: T) {
|
||||
return updateNode(updated, original);
|
||||
}
|
||||
function setChildrenArrayWorker(_parent: Node, _children: readonly Node[] | undefined): void {
|
||||
// does nothing
|
||||
}
|
||||
|
||||
function reuseWorker<T extends Node>(node: T) {
|
||||
return node;
|
||||
function updateNodeWorker<T extends Node>(updated: T, original: T): T {
|
||||
if (updated !== original) {
|
||||
setOriginalNode(updated, original);
|
||||
setTextRange(updated, original);
|
||||
}
|
||||
return updated;
|
||||
}
|
||||
|
||||
function createLazyFactoryMembers(
|
||||
@@ -5117,7 +5246,8 @@ namespace ts {
|
||||
function getName(node: Declaration, allowComments?: boolean, allowSourceMaps?: boolean, emitFlags: EmitFlags = 0) {
|
||||
const nodeName = getNameOfDeclaration(node);
|
||||
if (nodeName && isIdentifier(nodeName) && !isGeneratedIdentifier(nodeName)) {
|
||||
const name = getMutableClone(nodeName);
|
||||
// TODO(rbuckton): Does this need to be parented?
|
||||
const name = setParent(setTextRange(factory.cloneNode(nodeName), nodeName), nodeName.parent);
|
||||
emitFlags |= getEmitFlags(nodeName);
|
||||
if (!allowSourceMaps) emitFlags |= EmitFlags.NoSourceMap;
|
||||
if (!allowComments) emitFlags |= EmitFlags.NoComments;
|
||||
@@ -5190,7 +5320,7 @@ namespace ts {
|
||||
* @param allowSourceMaps A value indicating whether source maps may be emitted for the name.
|
||||
*/
|
||||
function getNamespaceMemberName(ns: Identifier, name: Identifier, allowComments?: boolean, allowSourceMaps?: boolean): PropertyAccessExpression {
|
||||
const qualifiedName = factory.createPropertyAccess(ns, nodeIsSynthesized(name) ? name : getSynthesizedClone(name));
|
||||
const qualifiedName = factory.createPropertyAccess(ns, nodeIsSynthesized(name) ? name : factory.cloneNode(name));
|
||||
setTextRange(qualifiedName, name);
|
||||
let emitFlags: EmitFlags = 0;
|
||||
if (!allowSourceMaps) emitFlags |= EmitFlags.NoSourceMap;
|
||||
@@ -5516,152 +5646,106 @@ namespace ts {
|
||||
}
|
||||
}
|
||||
|
||||
export const factory = createNodeFactory(NodeFactoryFlags.NoIndentationOnFreshPropertyAccess, createBaseNodeFactory(), {
|
||||
const baseFactory = createBaseNodeFactory();
|
||||
|
||||
export const factory = createNodeFactory(NodeFactoryFlags.NoIndentationOnFreshPropertyAccess, baseFactory, {
|
||||
onCreateNode: node => node.flags |= NodeFlags.Synthesized
|
||||
});
|
||||
|
||||
/* @internal */
|
||||
export function createSynthesizedNode(kind: SyntaxKind): Node {
|
||||
const node = createNode(kind, -1, -1);
|
||||
node.flags |= NodeFlags.Synthesized;
|
||||
return node;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a shallow, memberwise clone of a node with no source map location.
|
||||
*/
|
||||
/* @internal */
|
||||
export function getSynthesizedClone<T extends Node>(node: T): T {
|
||||
// We don't use "clone" from core.ts here, as we need to preserve the prototype chain of
|
||||
// the original node. We also need to exclude specific properties and only include own-
|
||||
// properties (to skip members already defined on the shared prototype).
|
||||
|
||||
if (node === undefined) {
|
||||
return node;
|
||||
}
|
||||
|
||||
const clone = <T>createSynthesizedNode(node.kind);
|
||||
clone.flags |= node.flags;
|
||||
setOriginalNode(clone, node);
|
||||
|
||||
for (const key in node) {
|
||||
if (clone.hasOwnProperty(key) || !node.hasOwnProperty(key)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
(<any>clone)[key] = (<any>node)[key];
|
||||
}
|
||||
|
||||
return clone;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a shallow, memberwise clone of a node for mutation.
|
||||
*/
|
||||
export function getMutableClone<T extends Node>(node: T): T {
|
||||
const clone = getSynthesizedClone(node);
|
||||
clone.pos = node.pos;
|
||||
clone.end = node.end;
|
||||
clone.parent = node.parent;
|
||||
return clone;
|
||||
}
|
||||
|
||||
/* @internal */
|
||||
export function updateNode<T extends Node>(updated: T, original: T): T {
|
||||
if (updated !== original) {
|
||||
setOriginalNode(updated, original);
|
||||
setTextRange(updated, original);
|
||||
}
|
||||
return updated;
|
||||
}
|
||||
|
||||
// TODO(rbuckton): Move this to factory
|
||||
function createUnparsedSource() {
|
||||
const node = <UnparsedSource>createNode(SyntaxKind.UnparsedSource);
|
||||
node.prologues = emptyArray;
|
||||
node.referencedFiles = emptyArray;
|
||||
node.libReferenceDirectives = emptyArray;
|
||||
node.getLineAndCharacterOfPosition = pos => getLineAndCharacterOfPosition(node, pos);
|
||||
return node;
|
||||
}
|
||||
|
||||
export function createUnparsedSourceFile(text: string): UnparsedSource;
|
||||
export function createUnparsedSourceFile(inputFile: InputFiles, type: "js" | "dts", stripInternal?: boolean): UnparsedSource;
|
||||
export function createUnparsedSourceFile(text: string, mapPath: string | undefined, map: string | undefined): UnparsedSource;
|
||||
export function createUnparsedSourceFile(textOrInputFiles: string | InputFiles, mapPathOrType?: string, mapTextOrStripInternal?: string | boolean): UnparsedSource {
|
||||
const node = createUnparsedSource();
|
||||
let stripInternal: boolean | undefined;
|
||||
let bundleFileInfo: BundleFileInfo | undefined;
|
||||
let fileName: string;
|
||||
let text: string | undefined;
|
||||
let length: number | (() => number);
|
||||
let sourceMapPath: string | undefined;
|
||||
let sourceMapText: string | undefined;
|
||||
let getText: (() => string) | undefined;
|
||||
let getSourceMapText: (() => string | undefined) | undefined;
|
||||
let oldFileOfCurrentEmit: boolean | undefined;
|
||||
|
||||
if (!isString(textOrInputFiles)) {
|
||||
Debug.assert(mapPathOrType === "js" || mapPathOrType === "dts");
|
||||
node.fileName = (mapPathOrType === "js" ? textOrInputFiles.javascriptPath : textOrInputFiles.declarationPath) || "";
|
||||
node.sourceMapPath = mapPathOrType === "js" ? textOrInputFiles.javascriptMapPath : textOrInputFiles.declarationMapPath;
|
||||
Object.defineProperties(node, {
|
||||
text: { get() { return mapPathOrType === "js" ? textOrInputFiles.javascriptText : textOrInputFiles.declarationText; } },
|
||||
sourceMapText: { get() { return mapPathOrType === "js" ? textOrInputFiles.javascriptMapText : textOrInputFiles.declarationMapText; } },
|
||||
});
|
||||
|
||||
|
||||
fileName = (mapPathOrType === "js" ? textOrInputFiles.javascriptPath : textOrInputFiles.declarationPath) || "";
|
||||
sourceMapPath = mapPathOrType === "js" ? textOrInputFiles.javascriptMapPath : textOrInputFiles.declarationMapPath;
|
||||
getText = () => mapPathOrType === "js" ? textOrInputFiles.javascriptText : textOrInputFiles.declarationText;
|
||||
getSourceMapText = () => mapPathOrType === "js" ? textOrInputFiles.javascriptMapText : textOrInputFiles.declarationMapText;
|
||||
length = () => getText!().length;
|
||||
if (textOrInputFiles.buildInfo && textOrInputFiles.buildInfo.bundle) {
|
||||
node.oldFileOfCurrentEmit = textOrInputFiles.oldFileOfCurrentEmit;
|
||||
Debug.assert(mapTextOrStripInternal === undefined || typeof mapTextOrStripInternal === "boolean");
|
||||
stripInternal = mapTextOrStripInternal as boolean | undefined;
|
||||
bundleFileInfo = mapPathOrType === "js" ? textOrInputFiles.buildInfo.bundle.js : textOrInputFiles.buildInfo.bundle.dts;
|
||||
if (node.oldFileOfCurrentEmit) {
|
||||
parseOldFileOfCurrentEmit(node, Debug.assertDefined(bundleFileInfo));
|
||||
return node;
|
||||
}
|
||||
oldFileOfCurrentEmit = textOrInputFiles.oldFileOfCurrentEmit;
|
||||
}
|
||||
}
|
||||
else {
|
||||
node.fileName = "";
|
||||
node.text = textOrInputFiles;
|
||||
node.sourceMapPath = mapPathOrType;
|
||||
node.sourceMapText = mapTextOrStripInternal as string;
|
||||
fileName = "";
|
||||
text = textOrInputFiles;
|
||||
length = textOrInputFiles.length;
|
||||
sourceMapPath = mapPathOrType;
|
||||
sourceMapText = mapTextOrStripInternal as string;
|
||||
}
|
||||
Debug.assert(!node.oldFileOfCurrentEmit);
|
||||
parseUnparsedSourceFile(node, bundleFileInfo, stripInternal);
|
||||
const node = oldFileOfCurrentEmit ?
|
||||
parseOldFileOfCurrentEmit(Debug.assertDefined(bundleFileInfo)) :
|
||||
parseUnparsedSourceFile(bundleFileInfo, stripInternal, length);
|
||||
node.fileName = fileName;
|
||||
node.sourceMapPath = sourceMapPath;
|
||||
node.oldFileOfCurrentEmit = oldFileOfCurrentEmit;
|
||||
if (getText && getSourceMapText) {
|
||||
Object.defineProperty(node, "text", { get: getText });
|
||||
Object.defineProperty(node, "sourceMapText", { get: getSourceMapText });
|
||||
}
|
||||
else {
|
||||
Debug.assert(!oldFileOfCurrentEmit);
|
||||
node.text = text ?? "";
|
||||
node.sourceMapText = sourceMapText;
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
function parseUnparsedSourceFile(node: UnparsedSource, bundleFileInfo: BundleFileInfo | undefined, stripInternal: boolean | undefined) {
|
||||
function parseUnparsedSourceFile(bundleFileInfo: BundleFileInfo | undefined, stripInternal: boolean | undefined, length: number | (() => number)) {
|
||||
let prologues: UnparsedPrologue[] | undefined;
|
||||
let helpers: UnscopedEmitHelper[] | undefined;
|
||||
let referencedFiles: FileReference[] | undefined;
|
||||
let typeReferenceDirectives: string[] | undefined;
|
||||
let libReferenceDirectives: FileReference[] | undefined;
|
||||
let prependChildren: UnparsedTextLike[] | undefined;
|
||||
let texts: UnparsedSourceText[] | undefined;
|
||||
let hasNoDefaultLib: boolean | undefined;
|
||||
|
||||
for (const section of bundleFileInfo ? bundleFileInfo.sections : emptyArray) {
|
||||
switch (section.kind) {
|
||||
case BundleFileSectionKind.Prologue:
|
||||
(prologues || (prologues = [])).push(createUnparsedNode(section, node) as UnparsedPrologue);
|
||||
prologues = append(prologues, setTextRange(factory.createUnparsedPrologue(section.data), section));
|
||||
break;
|
||||
case BundleFileSectionKind.EmitHelpers:
|
||||
(helpers || (helpers = [])).push(getAllUnscopedEmitHelpers().get(section.data)!);
|
||||
helpers = append(helpers, getAllUnscopedEmitHelpers().get(section.data)!);
|
||||
break;
|
||||
case BundleFileSectionKind.NoDefaultLib:
|
||||
node.hasNoDefaultLib = true;
|
||||
hasNoDefaultLib = true;
|
||||
break;
|
||||
case BundleFileSectionKind.Reference:
|
||||
(referencedFiles || (referencedFiles = [])).push({ pos: -1, end: -1, fileName: section.data });
|
||||
referencedFiles = append(referencedFiles, { pos: -1, end: -1, fileName: section.data });
|
||||
break;
|
||||
case BundleFileSectionKind.Type:
|
||||
(typeReferenceDirectives || (typeReferenceDirectives = [])).push(section.data);
|
||||
typeReferenceDirectives = append(typeReferenceDirectives, section.data);
|
||||
break;
|
||||
case BundleFileSectionKind.Lib:
|
||||
(libReferenceDirectives || (libReferenceDirectives = [])).push({ pos: -1, end: -1, fileName: section.data });
|
||||
libReferenceDirectives = append(libReferenceDirectives, { pos: -1, end: -1, fileName: section.data });
|
||||
break;
|
||||
case BundleFileSectionKind.Prepend:
|
||||
const prependNode = createUnparsedNode(section, node) as UnparsedPrepend;
|
||||
let prependTexts: UnparsedTextLike[] | undefined;
|
||||
for (const text of section.texts) {
|
||||
if (!stripInternal || text.kind !== BundleFileSectionKind.Internal) {
|
||||
(prependTexts || (prependTexts = [])).push(createUnparsedNode(text, node) as UnparsedTextLike);
|
||||
prependTexts = append(prependTexts, setTextRange(factory.createUnparsedTextLike(text.data, text.kind === BundleFileSectionKind.Internal), text));
|
||||
}
|
||||
}
|
||||
prependNode.texts = prependTexts || emptyArray;
|
||||
(texts || (texts = [])).push(prependNode);
|
||||
prependChildren = addRange(prependChildren, prependTexts);
|
||||
texts = append(texts, factory.createUnparsedPrepend(section.data, prependTexts ?? emptyArray));
|
||||
break;
|
||||
case BundleFileSectionKind.Internal:
|
||||
if (stripInternal) {
|
||||
@@ -5671,37 +5755,47 @@ namespace ts {
|
||||
// falls through
|
||||
|
||||
case BundleFileSectionKind.Text:
|
||||
(texts || (texts = [])).push(createUnparsedNode(section, node) as UnparsedTextLike);
|
||||
texts = append(texts, setTextRange(factory.createUnparsedTextLike(section.data, section.kind === BundleFileSectionKind.Internal), section));
|
||||
break;
|
||||
default:
|
||||
Debug.assertNever(section);
|
||||
}
|
||||
}
|
||||
|
||||
node.prologues = prologues || emptyArray;
|
||||
if (!texts) {
|
||||
const textNode = factory.createUnparsedTextLike(/*data*/ undefined, /*internal*/ false);
|
||||
textNode.pos = 0;
|
||||
textNode.end = typeof length === "function" ? length() : length;
|
||||
texts = [textNode];
|
||||
}
|
||||
|
||||
const node = parseNodeFactory.createUnparsedSource(prologues ?? emptyArray, /*syntheticReferences*/ undefined, texts);
|
||||
setEachParent(prologues, node);
|
||||
setEachParent(texts, node);
|
||||
setEachParent(prependChildren, node);
|
||||
node.hasNoDefaultLib = hasNoDefaultLib;
|
||||
node.helpers = helpers;
|
||||
node.referencedFiles = referencedFiles || emptyArray;
|
||||
node.typeReferenceDirectives = typeReferenceDirectives;
|
||||
node.libReferenceDirectives = libReferenceDirectives || emptyArray;
|
||||
node.texts = texts || [<UnparsedTextLike>createUnparsedNode({ kind: BundleFileSectionKind.Text, pos: 0, end: node.text.length }, node)];
|
||||
return node;
|
||||
}
|
||||
|
||||
function parseOldFileOfCurrentEmit(node: UnparsedSource, bundleFileInfo: BundleFileInfo) {
|
||||
Debug.assert(!!node.oldFileOfCurrentEmit);
|
||||
function parseOldFileOfCurrentEmit(bundleFileInfo: BundleFileInfo) {
|
||||
let texts: UnparsedTextLike[] | undefined;
|
||||
let syntheticReferences: UnparsedSyntheticReference[] | undefined;
|
||||
for (const section of bundleFileInfo.sections) {
|
||||
switch (section.kind) {
|
||||
case BundleFileSectionKind.Internal:
|
||||
case BundleFileSectionKind.Text:
|
||||
(texts || (texts = [])).push(createUnparsedNode(section, node) as UnparsedTextLike);
|
||||
texts = append(texts, setTextRange(factory.createUnparsedTextLike(section.data, section.kind === BundleFileSectionKind.Internal), section));
|
||||
break;
|
||||
|
||||
case BundleFileSectionKind.NoDefaultLib:
|
||||
case BundleFileSectionKind.Reference:
|
||||
case BundleFileSectionKind.Type:
|
||||
case BundleFileSectionKind.Lib:
|
||||
(syntheticReferences || (syntheticReferences = [])).push(createUnparsedSyntheticReference(section, node));
|
||||
syntheticReferences = append(syntheticReferences, setTextRange(factory.createUnparsedSyntheticReference(section), section));
|
||||
break;
|
||||
|
||||
// Ignore
|
||||
@@ -5714,45 +5808,11 @@ namespace ts {
|
||||
Debug.assertNever(section);
|
||||
}
|
||||
}
|
||||
node.texts = texts || emptyArray;
|
||||
|
||||
const node = factory.createUnparsedSource(emptyArray, syntheticReferences, texts ?? emptyArray);
|
||||
setEachParent(syntheticReferences, node);
|
||||
setEachParent(texts, node);
|
||||
node.helpers = map(bundleFileInfo.sources && bundleFileInfo.sources.helpers, name => getAllUnscopedEmitHelpers().get(name)!);
|
||||
node.syntheticReferences = syntheticReferences;
|
||||
return node;
|
||||
}
|
||||
|
||||
function mapBundleFileSectionKindToSyntaxKind(kind: BundleFileSectionKind): SyntaxKind {
|
||||
switch (kind) {
|
||||
case BundleFileSectionKind.Prologue: return SyntaxKind.UnparsedPrologue;
|
||||
case BundleFileSectionKind.Prepend: return SyntaxKind.UnparsedPrepend;
|
||||
case BundleFileSectionKind.Internal: return SyntaxKind.UnparsedInternalText;
|
||||
case BundleFileSectionKind.Text: return SyntaxKind.UnparsedText;
|
||||
|
||||
case BundleFileSectionKind.EmitHelpers:
|
||||
case BundleFileSectionKind.NoDefaultLib:
|
||||
case BundleFileSectionKind.Reference:
|
||||
case BundleFileSectionKind.Type:
|
||||
case BundleFileSectionKind.Lib:
|
||||
return Debug.fail(`BundleFileSectionKind: ${kind} not yet mapped to SyntaxKind`);
|
||||
|
||||
default:
|
||||
return Debug.assertNever(kind);
|
||||
}
|
||||
}
|
||||
|
||||
// TODO(rbuckton): Move this to factory
|
||||
function createUnparsedNode(section: BundleFileSection, parent: UnparsedSource): UnparsedNode {
|
||||
const node = createNode(mapBundleFileSectionKindToSyntaxKind(section.kind), section.pos, section.end) as UnparsedNode;
|
||||
node.parent = parent;
|
||||
node.data = section.data;
|
||||
return node;
|
||||
}
|
||||
|
||||
// TODO(rbuckton): Move this to factory
|
||||
function createUnparsedSyntheticReference(section: BundleFileHasNoDefaultLib | BundleFileReference, parent: UnparsedSource) {
|
||||
const node = createNode(SyntaxKind.UnparsedSyntheticReference, section.pos, section.end) as UnparsedSyntheticReference;
|
||||
node.parent = parent;
|
||||
node.data = section.data;
|
||||
node.section = section;
|
||||
return node;
|
||||
}
|
||||
|
||||
@@ -5804,7 +5864,7 @@ namespace ts {
|
||||
buildInfo?: BuildInfo,
|
||||
oldFileOfCurrentEmit?: boolean
|
||||
): InputFiles {
|
||||
const node = <InputFiles>createNode(SyntaxKind.InputFiles);
|
||||
const node = parseNodeFactory.createInputFiles();
|
||||
if (!isString(javascriptTextOrReadFileText)) {
|
||||
const cache = createMap<string | false>();
|
||||
const textGetter = (path: string | undefined) => {
|
||||
|
||||
@@ -156,11 +156,13 @@ namespace ts {
|
||||
export function createExpressionFromEntityName(factory: NodeFactory, node: EntityName | Expression): Expression {
|
||||
if (isQualifiedName(node)) {
|
||||
const left = createExpressionFromEntityName(factory, node.left);
|
||||
const right = getMutableClone(node.right);
|
||||
// TODO(rbuckton): Does this need to be parented?
|
||||
const right = setParent(setTextRange(factory.cloneNode(node.right), node.right), node.right.parent);
|
||||
return setTextRange(factory.createPropertyAccess(left, right), node);
|
||||
}
|
||||
else {
|
||||
return getMutableClone(node);
|
||||
// TODO(rbuckton): Does this need to be parented?
|
||||
return setParent(setTextRange(factory.cloneNode(node), node), node.parent);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -169,10 +171,12 @@ namespace ts {
|
||||
return factory.createStringLiteralFromNode(memberName);
|
||||
}
|
||||
else if (isComputedPropertyName(memberName)) {
|
||||
return getMutableClone(memberName.expression);
|
||||
// TODO(rbuckton): Does this need to be parented?
|
||||
return setParent(setTextRange(factory.cloneNode(memberName.expression), memberName.expression), memberName.expression.parent);
|
||||
}
|
||||
else {
|
||||
return getMutableClone(memberName);
|
||||
// TODO(rbuckton): Does this need to be parented?
|
||||
return setParent(setTextRange(factory.cloneNode(memberName), memberName), memberName.parent);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -243,7 +247,7 @@ namespace ts {
|
||||
setTextRange(
|
||||
factory.createAssignment(
|
||||
createMemberAccessForPropertyName(factory, receiver, property.name, /*location*/ property.name),
|
||||
getSynthesizedClone(property.name)
|
||||
factory.cloneNode(property.name)
|
||||
),
|
||||
/*location*/ property
|
||||
),
|
||||
@@ -525,7 +529,7 @@ namespace ts {
|
||||
if (moduleName.kind === SyntaxKind.StringLiteral) {
|
||||
return tryGetModuleNameFromDeclaration(importNode, host, factory, resolver, compilerOptions)
|
||||
|| tryRenameExternalModule(factory, <StringLiteral>moduleName, sourceFile)
|
||||
|| getSynthesizedClone(<StringLiteral>moduleName);
|
||||
|| factory.cloneNode(<StringLiteral>moduleName);
|
||||
}
|
||||
|
||||
return undefined;
|
||||
|
||||
+138
-142
@@ -13,28 +13,27 @@ namespace ts {
|
||||
let IdentifierConstructor: new (kind: SyntaxKind, pos?: number, end?: number) => Node;
|
||||
let SourceFileConstructor: new (kind: SyntaxKind, pos?: number, end?: number) => Node;
|
||||
|
||||
export function createNode(kind: SyntaxKind, pos?: number, end?: number): Node {
|
||||
if (kind === SyntaxKind.SourceFile) {
|
||||
return new (SourceFileConstructor || (SourceFileConstructor = objectAllocator.getSourceFileConstructor()))(kind, pos, end);
|
||||
}
|
||||
else if (kind === SyntaxKind.Identifier) {
|
||||
return new (IdentifierConstructor || (IdentifierConstructor = objectAllocator.getIdentifierConstructor()))(kind, pos, end);
|
||||
}
|
||||
else if (!isNodeKind(kind)) {
|
||||
return new (TokenConstructor || (TokenConstructor = objectAllocator.getTokenConstructor()))(kind, pos, end);
|
||||
}
|
||||
else {
|
||||
return new (NodeConstructor || (NodeConstructor = objectAllocator.getNodeConstructor()))(kind, pos, end);
|
||||
}
|
||||
}
|
||||
const parseBaseNodeFactory: BaseNodeFactory = {
|
||||
createBaseSourceFileNode: kind => new (SourceFileConstructor || (SourceFileConstructor = objectAllocator.getSourceFileConstructor()))(kind, -1, -1),
|
||||
createBaseIdentifierNode: kind => new (IdentifierConstructor || (IdentifierConstructor = objectAllocator.getIdentifierConstructor()))(kind, -1, -1),
|
||||
createBaseTokenNode: kind => new (TokenConstructor || (TokenConstructor = objectAllocator.getTokenConstructor()))(kind, -1, -1),
|
||||
createBaseNode: kind => new (NodeConstructor || (NodeConstructor = objectAllocator.getNodeConstructor()))(kind, -1, -1),
|
||||
};
|
||||
|
||||
/* @internal */
|
||||
export const parseNodeFactory = createNodeFactory(NodeFactoryFlags.None, {
|
||||
createBaseSourceFileNode: createNode,
|
||||
createBaseIdentifierNode: createNode,
|
||||
createBaseTokenNode: createNode,
|
||||
createBaseNode: createNode
|
||||
});
|
||||
export const parseNodeFactory = createNodeFactory(NodeFactoryFlags.NoParenthesizerRules, parseBaseNodeFactory);
|
||||
|
||||
/** @deprecated Use an appropriate `factory` method instead. */
|
||||
export function createNode(kind: SyntaxKind, pos = 0, end = 0): Node {
|
||||
return setTextRangePosEnd(
|
||||
kind === SyntaxKind.SourceFile ? parseBaseNodeFactory.createBaseSourceFileNode(kind) :
|
||||
kind === SyntaxKind.Identifier ? parseBaseNodeFactory.createBaseIdentifierNode(kind) :
|
||||
!isNodeKind(kind) ? parseBaseNodeFactory.createBaseTokenNode(kind) :
|
||||
parseBaseNodeFactory.createBaseNode(kind),
|
||||
pos,
|
||||
end
|
||||
);
|
||||
}
|
||||
|
||||
function visitNode<T>(cbNode: (node: Node) => T, node: Node | undefined): T | undefined {
|
||||
return node && cbNode(node);
|
||||
@@ -618,19 +617,25 @@ namespace ts {
|
||||
createBaseNode: kind => new NodeConstructor(kind, /*pos*/ 0, /*end*/ 0)
|
||||
};
|
||||
|
||||
const factoryWithParentPointers = createNodeFactory(NodeFactoryFlags.NoParenthesizerRules | NodeFactoryFlags.NoNodeConverters, baseNodeFactory, {
|
||||
const factory = createNodeFactory(NodeFactoryFlags.NoParenthesizerRules | NodeFactoryFlags.NoNodeConverters, baseNodeFactory, {
|
||||
onSetChild(parent, child) {
|
||||
child.parent = parent;
|
||||
},
|
||||
onSetChildren(parent, children) {
|
||||
for (const child of children) {
|
||||
if (setParentNodes) {
|
||||
child.parent = parent;
|
||||
}
|
||||
},
|
||||
onSetChildren(parent, children) {
|
||||
if (setParentNodes) {
|
||||
for (const child of children) {
|
||||
child.parent = parent;
|
||||
}
|
||||
}
|
||||
},
|
||||
onFinishNode(node) {
|
||||
if (hasJSDocNodes(node)) {
|
||||
for (const jsDoc of node.jsDoc!) {
|
||||
jsDoc.parent = node;
|
||||
if (setParentNodes) {
|
||||
if (hasJSDocNodes(node)) {
|
||||
for (const jsDoc of node.jsDoc!) {
|
||||
jsDoc.parent = node;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -639,13 +644,6 @@ namespace ts {
|
||||
}
|
||||
});
|
||||
|
||||
const factoryWithoutParentPointers = createNodeFactory(NodeFactoryFlags.NoParenthesizerRules | NodeFactoryFlags.NoNodeConverters, baseNodeFactory, {
|
||||
onCreateNode(_) {
|
||||
nodeCount++;
|
||||
}
|
||||
});
|
||||
|
||||
let factory = factoryWithoutParentPointers;
|
||||
let sourceFlags: NodeFlags;
|
||||
let sourceText: string;
|
||||
let languageVersion: ScriptTarget;
|
||||
@@ -659,6 +657,7 @@ namespace ts {
|
||||
let nodeCount: number;
|
||||
let identifiers: Map<string>;
|
||||
let identifierCount: number;
|
||||
let setParentNodes: boolean;
|
||||
|
||||
let parsingContext: ParsingContext;
|
||||
|
||||
@@ -818,7 +817,6 @@ namespace ts {
|
||||
break;
|
||||
}
|
||||
|
||||
// TODO(rbuckton): this does not create the tree correctly and transform flags won't be properly set
|
||||
const statement = factory.createExpressionStatement(expression) as JsonObjectExpressionStatement;
|
||||
finishNode(statement, pos);
|
||||
statements = createNodeArray([statement], pos);
|
||||
@@ -846,13 +844,13 @@ namespace ts {
|
||||
return result;
|
||||
}
|
||||
|
||||
function initializeState(_sourceText: string, _languageVersion: ScriptTarget, _syntaxCursor: IncrementalParser.SyntaxCursor | undefined, _scriptKind: ScriptKind, setParentNodes: boolean) {
|
||||
function initializeState(_sourceText: string, _languageVersion: ScriptTarget, _syntaxCursor: IncrementalParser.SyntaxCursor | undefined, _scriptKind: ScriptKind, _setParentNodes: boolean) {
|
||||
NodeConstructor = objectAllocator.getNodeConstructor();
|
||||
TokenConstructor = objectAllocator.getTokenConstructor();
|
||||
IdentifierConstructor = objectAllocator.getIdentifierConstructor();
|
||||
SourceFileConstructor = objectAllocator.getSourceFileConstructor();
|
||||
|
||||
factory = setParentNodes ? factoryWithParentPointers : factoryWithoutParentPointers;
|
||||
setParentNodes = _setParentNodes;
|
||||
|
||||
sourceText = _sourceText;
|
||||
languageVersion = _languageVersion;
|
||||
@@ -894,7 +892,7 @@ namespace ts {
|
||||
scanner.setOnError(undefined);
|
||||
|
||||
// Clear any data. We don't want to accidentally hold onto it for too long.
|
||||
factory = factoryWithoutParentPointers;
|
||||
setParentNodes = false;
|
||||
sourceText = undefined!;
|
||||
languageVersion = undefined!;
|
||||
syntaxCursor = undefined;
|
||||
@@ -2537,7 +2535,8 @@ namespace ts {
|
||||
const hasJSDoc = hasPrecedingJSDocComment();
|
||||
if (lookAhead(nextTokenIsOpenParen)) {
|
||||
nextToken();
|
||||
const { parameters, type } = parseSignature(SyntaxKind.ColonToken, SignatureFlags.Type | SignatureFlags.JSDoc);
|
||||
const parameters = parseParameters(SignatureFlags.Type | SignatureFlags.JSDoc);
|
||||
const type = parseReturnType(SyntaxKind.ColonToken, /*isType*/ false);
|
||||
return withJSDoc(finishNode(factory.createJSDocFunctionType(parameters, type), pos), hasJSDoc);
|
||||
}
|
||||
return finishNode(factory.createTypeReferenceNode(parseIdentifierName(), /*typeArguments*/ undefined), pos);
|
||||
@@ -2705,44 +2704,10 @@ namespace ts {
|
||||
);
|
||||
}
|
||||
|
||||
interface SignatureInfo {
|
||||
typeParameters?: NodeArray<TypeParameterDeclaration>;
|
||||
parameters: NodeArray<ParameterDeclaration>;
|
||||
parametersParsedSuccessfully?: boolean;
|
||||
type?: TypeNode;
|
||||
}
|
||||
|
||||
function parseSignature(
|
||||
returnToken: SyntaxKind.ColonToken | SyntaxKind.EqualsGreaterThanToken,
|
||||
flags: SignatureFlags
|
||||
) {
|
||||
const signature: SignatureInfo = {
|
||||
typeParameters: undefined,
|
||||
parameters: undefined!,
|
||||
parametersParsedSuccessfully: undefined,
|
||||
type: undefined
|
||||
};
|
||||
signature.parametersParsedSuccessfully = fillSignature(returnToken, flags, signature);
|
||||
return signature;
|
||||
}
|
||||
|
||||
/**
|
||||
* Note: If returnToken is EqualsGreaterThanToken, `signature.type` will always be defined.
|
||||
* @returns If return type parsing succeeds
|
||||
*/
|
||||
function fillSignature(
|
||||
returnToken: SyntaxKind.ColonToken | SyntaxKind.EqualsGreaterThanToken,
|
||||
flags: SignatureFlags,
|
||||
signature: SignatureInfo): boolean {
|
||||
if (!(flags & SignatureFlags.JSDoc)) {
|
||||
signature.typeParameters = parseTypeParameters();
|
||||
function parseReturnType(returnToken: SyntaxKind.ColonToken | SyntaxKind.EqualsGreaterThanToken, isType: boolean) {
|
||||
if (shouldParseReturnType(returnToken, isType)) {
|
||||
return parseTypeOrTypePredicate();
|
||||
}
|
||||
const parametersParsedSuccessfully = parseParameterList(signature, flags);
|
||||
if (shouldParseReturnType(returnToken, !!(flags & SignatureFlags.Type))) {
|
||||
signature.type = parseTypeOrTypePredicate();
|
||||
if (typeHasArrowFunctionBlockingParseError(signature.type)) return false;
|
||||
}
|
||||
return parametersParsedSuccessfully;
|
||||
}
|
||||
|
||||
function shouldParseReturnType(returnToken: SyntaxKind.ColonToken | SyntaxKind.EqualsGreaterThanToken, isType: boolean): boolean {
|
||||
@@ -2762,8 +2727,37 @@ namespace ts {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Returns true on success.
|
||||
function parseParameterList(signature: SignatureInfo, flags: SignatureFlags): boolean {
|
||||
function parseParametersWorker(flags: SignatureFlags) {
|
||||
// FormalParameters [Yield,Await]: (modified)
|
||||
// [empty]
|
||||
// FormalParameterList[?Yield,Await]
|
||||
//
|
||||
// FormalParameter[Yield,Await]: (modified)
|
||||
// BindingElement[?Yield,Await]
|
||||
//
|
||||
// BindingElement [Yield,Await]: (modified)
|
||||
// SingleNameBinding[?Yield,?Await]
|
||||
// BindingPattern[?Yield,?Await]Initializer [In, ?Yield,?Await] opt
|
||||
//
|
||||
// SingleNameBinding [Yield,Await]:
|
||||
// BindingIdentifier[?Yield,?Await]Initializer [In, ?Yield,?Await] opt
|
||||
const savedYieldContext = inYieldContext();
|
||||
const savedAwaitContext = inAwaitContext();
|
||||
|
||||
setYieldContext(!!(flags & SignatureFlags.Yield));
|
||||
setAwaitContext(!!(flags & SignatureFlags.Await));
|
||||
|
||||
const parameters = flags & SignatureFlags.JSDoc ?
|
||||
parseDelimitedList(ParsingContext.JSDocParameters, parseJSDocParameter) :
|
||||
parseDelimitedList(ParsingContext.Parameters, parseParameter);
|
||||
|
||||
setYieldContext(savedYieldContext);
|
||||
setAwaitContext(savedAwaitContext);
|
||||
|
||||
return parameters;
|
||||
}
|
||||
|
||||
function parseParameters(flags: SignatureFlags): NodeArray<ParameterDeclaration> {
|
||||
// FormalParameters [Yield,Await]: (modified)
|
||||
// [empty]
|
||||
// FormalParameterList[?Yield,Await]
|
||||
@@ -2778,24 +2772,12 @@ namespace ts {
|
||||
// SingleNameBinding [Yield,Await]:
|
||||
// BindingIdentifier[?Yield,?Await]Initializer [In, ?Yield,?Await] opt
|
||||
if (!parseExpected(SyntaxKind.OpenParenToken)) {
|
||||
signature.parameters = createMissingList<ParameterDeclaration>();
|
||||
return false;
|
||||
return createMissingList<ParameterDeclaration>();
|
||||
}
|
||||
|
||||
const savedYieldContext = inYieldContext();
|
||||
const savedAwaitContext = inAwaitContext();
|
||||
|
||||
setYieldContext(!!(flags & SignatureFlags.Yield));
|
||||
setAwaitContext(!!(flags & SignatureFlags.Await));
|
||||
|
||||
signature.parameters = flags & SignatureFlags.JSDoc ?
|
||||
parseDelimitedList(ParsingContext.JSDocParameters, parseJSDocParameter) :
|
||||
parseDelimitedList(ParsingContext.Parameters, parseParameter);
|
||||
|
||||
setYieldContext(savedYieldContext);
|
||||
setAwaitContext(savedAwaitContext);
|
||||
|
||||
return parseExpected(SyntaxKind.CloseParenToken);
|
||||
const parameters = parseParametersWorker(flags);
|
||||
parseExpected(SyntaxKind.CloseParenToken);
|
||||
return parameters;
|
||||
}
|
||||
|
||||
function parseTypeMemberSemicolon() {
|
||||
@@ -2815,7 +2797,10 @@ namespace ts {
|
||||
if (kind === SyntaxKind.ConstructSignature) {
|
||||
parseExpected(SyntaxKind.NewKeyword);
|
||||
}
|
||||
const { typeParameters, parameters, type } = parseSignature(SyntaxKind.ColonToken, SignatureFlags.Type);
|
||||
|
||||
const typeParameters = parseTypeParameters();
|
||||
const parameters = parseParameters(SignatureFlags.Type);
|
||||
const type = parseReturnType(SyntaxKind.ColonToken, /*isType*/ true);
|
||||
parseTypeMemberSemicolon();
|
||||
const node = kind === SyntaxKind.CallSignature
|
||||
? factory.createCallSignature(typeParameters, parameters, type)
|
||||
@@ -2897,7 +2882,9 @@ namespace ts {
|
||||
if (token() === SyntaxKind.OpenParenToken || token() === SyntaxKind.LessThanToken) {
|
||||
// Method signatures don't exist in expression contexts. So they have neither
|
||||
// [Yield] nor [Await]
|
||||
const { typeParameters, parameters, type } = parseSignature(SyntaxKind.ColonToken, SignatureFlags.Type);
|
||||
const typeParameters = parseTypeParameters();
|
||||
const parameters = parseParameters(SignatureFlags.Type);
|
||||
const type = parseReturnType(SyntaxKind.ColonToken, /*isType*/ true);
|
||||
node = factory.createMethodSignature(modifiers, name, questionToken, typeParameters, parameters, type);
|
||||
}
|
||||
else {
|
||||
@@ -3081,7 +3068,9 @@ namespace ts {
|
||||
const pos = getNodePos();
|
||||
const hasJSDoc = hasPrecedingJSDocComment();
|
||||
const isConstructorType = parseOptional(SyntaxKind.NewKeyword);
|
||||
const { typeParameters, parameters, type } = parseSignature(SyntaxKind.EqualsGreaterThanToken, SignatureFlags.Type);
|
||||
const typeParameters = parseTypeParameters();
|
||||
const parameters = parseParameters(SignatureFlags.Type);
|
||||
const type = parseReturnType(SyntaxKind.EqualsGreaterThanToken, /*isType*/ false);
|
||||
const node = isConstructorType
|
||||
? factory.createConstructorTypeNode(typeParameters, parameters, type)
|
||||
: factory.createFunctionTypeNode(typeParameters, parameters, type);
|
||||
@@ -3720,30 +3709,9 @@ namespace ts {
|
||||
// following => or { token. Otherwise, we *might* have an arrow function. Try to parse
|
||||
// it out, but don't allow any ambiguity, and return 'undefined' if this could be an
|
||||
// expression instead.
|
||||
const pos = getNodePos();
|
||||
const hasJSDoc = hasPrecedingJSDocComment();
|
||||
const arrowFunction = triState === Tristate.True
|
||||
? parseParenthesizedArrowFunctionExpressionHead(/*allowAmbiguity*/ true)
|
||||
: tryParse(parsePossibleParenthesizedArrowFunctionExpressionHead);
|
||||
|
||||
if (!arrowFunction) {
|
||||
// Didn't appear to actually be a parenthesized arrow function. Just bail out.
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const { modifiers, typeParameters, parameters, type } = arrowFunction;
|
||||
const isAsync = some(modifiers, isAsyncModifier);
|
||||
|
||||
// If we have an arrow, then try to parse the body. Even if not, try to parse if we
|
||||
// have an opening brace, just in case we're in an error state.
|
||||
const lastToken = token();
|
||||
const equalsGreaterThanToken = parseExpectedToken(SyntaxKind.EqualsGreaterThanToken);
|
||||
const body = (lastToken === SyntaxKind.EqualsGreaterThanToken || lastToken === SyntaxKind.OpenBraceToken)
|
||||
? parseArrowFunctionExpressionBody(isAsync)
|
||||
: parseIdentifier();
|
||||
|
||||
const node = factory.createArrowFunction(modifiers, typeParameters, parameters, type, equalsGreaterThanToken, body);
|
||||
return withJSDoc(finishNode(node, pos), hasJSDoc);
|
||||
return triState === Tristate.True ?
|
||||
parseParenthesizedArrowFunctionExpression(/*allowAmbiguity*/ true) :
|
||||
tryParse(parsePossibleParenthesizedArrowFunctionExpression);
|
||||
}
|
||||
|
||||
// True -> We definitely expect a parenthesized arrow function here.
|
||||
@@ -3889,13 +3857,13 @@ namespace ts {
|
||||
}
|
||||
}
|
||||
|
||||
function parsePossibleParenthesizedArrowFunctionExpressionHead(): ArrowFunctionHead | undefined {
|
||||
function parsePossibleParenthesizedArrowFunctionExpression(): ArrowFunction | undefined {
|
||||
const tokenPos = scanner.getTokenPos();
|
||||
if (notParenthesizedArrow && notParenthesizedArrow.has(tokenPos.toString())) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const result = parseParenthesizedArrowFunctionExpressionHead(/*allowAmbiguity*/ false);
|
||||
const result = parseParenthesizedArrowFunctionExpression(/*allowAmbiguity*/ false);
|
||||
if (!result) {
|
||||
(notParenthesizedArrow || (notParenthesizedArrow = createMap())).set(tokenPos.toString(), true);
|
||||
}
|
||||
@@ -3937,14 +3905,9 @@ namespace ts {
|
||||
return Tristate.False;
|
||||
}
|
||||
|
||||
interface ArrowFunctionHead extends SignatureInfo {
|
||||
modifiers?: ModifiersArray;
|
||||
typeParameters?: NodeArray<TypeParameterDeclaration>;
|
||||
parameters: NodeArray<ParameterDeclaration>;
|
||||
type?: TypeNode;
|
||||
}
|
||||
|
||||
function parseParenthesizedArrowFunctionExpressionHead(allowAmbiguity: boolean): ArrowFunctionHead | undefined {
|
||||
function parseParenthesizedArrowFunctionExpression(allowAmbiguity: boolean): ArrowFunction | undefined {
|
||||
const pos = getNodePos();
|
||||
const hasJSDoc = hasPrecedingJSDocComment();
|
||||
const modifiers = parseModifiersForArrowFunction();
|
||||
const isAsync = some(modifiers, isAsyncModifier) ? SignatureFlags.Await : SignatureFlags.None;
|
||||
// Arrow functions are never generators.
|
||||
@@ -3954,12 +3917,26 @@ namespace ts {
|
||||
// a => (b => c)
|
||||
// And think that "(b =>" was actually a parenthesized arrow function with a missing
|
||||
// close paren.
|
||||
const signature = parseSignature(SyntaxKind.ColonToken, isAsync);
|
||||
if (!signature.parametersParsedSuccessfully && !allowAmbiguity) {
|
||||
return undefined;
|
||||
const typeParameters = parseTypeParameters();
|
||||
|
||||
let parameters: NodeArray<ParameterDeclaration>;
|
||||
if (!parseExpected(SyntaxKind.OpenParenToken)) {
|
||||
if (!allowAmbiguity) {
|
||||
return undefined;
|
||||
}
|
||||
parameters = createMissingList<ParameterDeclaration>();
|
||||
}
|
||||
else {
|
||||
parameters = parseParametersWorker(isAsync);
|
||||
if (!parseExpected(SyntaxKind.CloseParenToken) && !allowAmbiguity) {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
const { typeParameters, parameters, type } = signature;
|
||||
const type = parseReturnType(SyntaxKind.ColonToken, /*isType*/ false);
|
||||
if (type && !allowAmbiguity && typeHasArrowFunctionBlockingParseError(type)) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
// Parsing a signature isn't enough.
|
||||
// Parenthesized arrow signatures often look like other valid expressions.
|
||||
@@ -3976,7 +3953,16 @@ namespace ts {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
return { modifiers, typeParameters, parameters, type };
|
||||
// If we have an arrow, then try to parse the body. Even if not, try to parse if we
|
||||
// have an opening brace, just in case we're in an error state.
|
||||
const lastToken = token();
|
||||
const equalsGreaterThanToken = parseExpectedToken(SyntaxKind.EqualsGreaterThanToken);
|
||||
const body = (lastToken === SyntaxKind.EqualsGreaterThanToken || lastToken === SyntaxKind.OpenBraceToken)
|
||||
? parseArrowFunctionExpressionBody(some(modifiers, isAsyncModifier))
|
||||
: parseIdentifier();
|
||||
|
||||
const node = factory.createArrowFunction(modifiers, typeParameters, parameters, type, equalsGreaterThanToken, body);
|
||||
return withJSDoc(finishNode(node, pos), hasJSDoc);
|
||||
}
|
||||
|
||||
function parseArrowFunctionExpressionBody(isAsync: boolean): Block | Expression {
|
||||
@@ -5091,7 +5077,9 @@ namespace ts {
|
||||
isAsync ? doInAwaitContext(parseOptionalIdentifier) :
|
||||
parseOptionalIdentifier();
|
||||
|
||||
const { typeParameters, parameters, type } = parseSignature(SyntaxKind.ColonToken, isGenerator | isAsync);
|
||||
const typeParameters = parseTypeParameters();
|
||||
const parameters = parseParameters(isGenerator | isAsync);
|
||||
const type = parseReturnType(SyntaxKind.ColonToken, /*isType*/ false);
|
||||
const body = parseFunctionBlock(isGenerator | isAsync);
|
||||
|
||||
if (saveDecoratorContext) {
|
||||
@@ -5902,7 +5890,9 @@ namespace ts {
|
||||
const name = modifierFlags & ModifierFlags.Default ? parseOptionalIdentifier() : parseIdentifier();
|
||||
const isGenerator = asteriskToken ? SignatureFlags.Yield : SignatureFlags.None;
|
||||
const isAsync = modifierFlags & ModifierFlags.Async ? SignatureFlags.Await : SignatureFlags.None;
|
||||
const { typeParameters, parameters, type } = parseSignature(SyntaxKind.ColonToken, isGenerator | isAsync);
|
||||
const typeParameters = parseTypeParameters();
|
||||
const parameters = parseParameters(isGenerator | isAsync);
|
||||
const type = parseReturnType(SyntaxKind.ColonToken, /*isType*/ false);
|
||||
const body = parseFunctionBlockOrSemicolon(isGenerator | isAsync, Diagnostics.or_expected);
|
||||
const node = factory.createFunctionDeclaration(decorators, modifiers, asteriskToken, name, typeParameters, parameters, type, body);
|
||||
return withJSDoc(finishNode(node, pos), hasJSDoc);
|
||||
@@ -5923,7 +5913,9 @@ namespace ts {
|
||||
function tryParseConstructorDeclaration(pos: number, hasJSDoc: boolean, decorators: NodeArray<Decorator> | undefined, modifiers: NodeArray<Modifier> | undefined): ConstructorDeclaration | undefined {
|
||||
return tryParse(() => {
|
||||
if (parseConstructorName()) {
|
||||
const { typeParameters, parameters, type } = parseSignature(SyntaxKind.ColonToken, SignatureFlags.None);
|
||||
const typeParameters = parseTypeParameters();
|
||||
const parameters = parseParameters(SignatureFlags.None);
|
||||
const type = parseReturnType(SyntaxKind.ColonToken, /*isType*/ false);
|
||||
const body = parseFunctionBlockOrSemicolon(SignatureFlags.None, Diagnostics.or_expected);
|
||||
const node = factory.createConstructorDeclaration(decorators, modifiers, parameters, body);
|
||||
// Attach `typeParameters` and `type` if they exist so that we can report them in the grammar checker.
|
||||
@@ -5947,7 +5939,9 @@ namespace ts {
|
||||
): MethodDeclaration {
|
||||
const isGenerator = asteriskToken ? SignatureFlags.Yield : SignatureFlags.None;
|
||||
const isAsync = some(modifiers, isAsyncModifier) ? SignatureFlags.Await : SignatureFlags.None;
|
||||
const { typeParameters, parameters, type } = parseSignature(SyntaxKind.ColonToken, isGenerator | isAsync);
|
||||
const typeParameters = parseTypeParameters();
|
||||
const parameters = parseParameters(isGenerator | isAsync);
|
||||
const type = parseReturnType(SyntaxKind.ColonToken, /*isType*/ false);
|
||||
const body = parseFunctionBlockOrSemicolon(isGenerator | isAsync, diagnosticMessage);
|
||||
const node = factory.createMethodDeclaration(
|
||||
decorators,
|
||||
@@ -6001,7 +5995,9 @@ namespace ts {
|
||||
|
||||
function parseAccessorDeclaration(pos: number, hasJSDoc: boolean, decorators: NodeArray<Decorator> | undefined, modifiers: NodeArray<Modifier> | undefined, kind: AccessorDeclaration["kind"]): AccessorDeclaration {
|
||||
const name = parsePropertyName();
|
||||
const { typeParameters, parameters, type } = parseSignature(SyntaxKind.ColonToken, SignatureFlags.None);
|
||||
const typeParameters = parseTypeParameters();
|
||||
const parameters = parseParameters(SignatureFlags.None);
|
||||
const type = parseReturnType(SyntaxKind.ColonToken, /*isType*/ false);
|
||||
const body = parseFunctionBlockOrSemicolon(SignatureFlags.None);
|
||||
const node = kind === SyntaxKind.GetAccessor
|
||||
? factory.createGetAccessorDeclaration(decorators, modifiers, name, parameters, type, body)
|
||||
|
||||
@@ -235,7 +235,7 @@ namespace ts {
|
||||
if (isClassWithConstructorReference) {
|
||||
// record an alias as the class name is not in scope for statics.
|
||||
enableSubstitutionForClassAliases();
|
||||
const alias = getSynthesizedClone(temp) as GeneratedIdentifier;
|
||||
const alias = factory.cloneNode(temp) as GeneratedIdentifier;
|
||||
alias.autoGenerateFlags &= ~GeneratedIdentifierFlags.ReservedInNestedScopes;
|
||||
classAliases[getOriginalNodeId(node)] = alias;
|
||||
}
|
||||
@@ -488,7 +488,7 @@ namespace ts {
|
||||
if (declaration) {
|
||||
const classAlias = classAliases[declaration.id!]; // TODO: GH#18217
|
||||
if (classAlias) {
|
||||
const clone = getSynthesizedClone(classAlias);
|
||||
const clone = factory.cloneNode(classAlias);
|
||||
setSourceMapRange(clone, node);
|
||||
setCommentRange(clone, node);
|
||||
return clone;
|
||||
|
||||
@@ -1055,7 +1055,8 @@ namespace ts {
|
||||
// Likewise, `export default` classes and the like and just be `default`, so we preserve their `export` modifiers, too
|
||||
return statement;
|
||||
}
|
||||
const clone = getMutableClone(statement);
|
||||
// TODO(rbuckton): Does this need to be parented?
|
||||
const clone = setParent(setTextRange(factory.cloneNode(statement), statement), statement.parent);
|
||||
const modifiers = factory.createModifiersFromModifierFlags(getModifierFlags(statement) & (ModifierFlags.All ^ ModifierFlags.Export));
|
||||
clone.modifiers = modifiers.length ? factory.createNodeArray(modifiers) : undefined;
|
||||
return clone;
|
||||
|
||||
@@ -466,7 +466,7 @@ namespace ts {
|
||||
return flattenContext.context.factory.createElementAccess(value, argumentExpression);
|
||||
}
|
||||
else if (isStringOrNumericLiteralLike(propertyName)) {
|
||||
const argumentExpression = getSynthesizedClone(propertyName);
|
||||
const argumentExpression = factory.cloneNode(propertyName);
|
||||
argumentExpression.text = argumentExpression.text;
|
||||
return flattenContext.context.factory.createElementAccess(value, argumentExpression);
|
||||
}
|
||||
|
||||
@@ -1299,7 +1299,7 @@ namespace ts {
|
||||
function insertDefaultValueAssignmentForInitializer(statements: Statement[], parameter: ParameterDeclaration, name: Identifier, initializer: Expression): void {
|
||||
initializer = visitNode(initializer, visitor, isExpression);
|
||||
const statement = factory.createIf(
|
||||
factory.createTypeCheck(getSynthesizedClone(name), "undefined"),
|
||||
factory.createTypeCheck(factory.cloneNode(name), "undefined"),
|
||||
setEmitFlags(
|
||||
setTextRange(
|
||||
factory.createBlock([
|
||||
@@ -1307,7 +1307,8 @@ namespace ts {
|
||||
setEmitFlags(
|
||||
setTextRange(
|
||||
factory.createAssignment(
|
||||
setEmitFlags(getMutableClone(name), EmitFlags.NoSourceMap),
|
||||
// TODO(rbuckton): Does this need to be parented?
|
||||
setEmitFlags(setParent(setTextRange(factory.cloneNode(name), name), name.parent), EmitFlags.NoSourceMap),
|
||||
setEmitFlags(initializer, EmitFlags.NoSourceMap | getEmitFlags(initializer) | EmitFlags.NoComments)
|
||||
),
|
||||
parameter
|
||||
@@ -1357,11 +1358,12 @@ namespace ts {
|
||||
}
|
||||
|
||||
// `declarationName` is the name of the local declaration for the parameter.
|
||||
const declarationName = parameter.name.kind === SyntaxKind.Identifier ? getMutableClone(parameter.name) : factory.createTempVariable(/*recordTempVariable*/ undefined);
|
||||
// TODO(rbuckton): Does this need to be parented?
|
||||
const declarationName = parameter.name.kind === SyntaxKind.Identifier ? setParent(setTextRange(factory.cloneNode(parameter.name), parameter.name), parameter.name.parent) : factory.createTempVariable(/*recordTempVariable*/ undefined);
|
||||
setEmitFlags(declarationName, EmitFlags.NoSourceMap);
|
||||
|
||||
// `expressionName` is the name of the parameter used in expressions.
|
||||
const expressionName = parameter.name.kind === SyntaxKind.Identifier ? getSynthesizedClone(parameter.name) : declarationName;
|
||||
const expressionName = parameter.name.kind === SyntaxKind.Identifier ? factory.cloneNode(parameter.name) : declarationName;
|
||||
const restIndex = node.parameters.length - 1;
|
||||
const temp = factory.createLoopVariable();
|
||||
|
||||
@@ -1666,7 +1668,8 @@ namespace ts {
|
||||
function transformAccessorsToExpression(receiver: LeftHandSideExpression, { firstAccessor, getAccessor, setAccessor }: AllAccessorDeclarations, container: Node, startsOnNewLine: boolean): Expression {
|
||||
// To align with source maps in the old emitter, the receiver and property name
|
||||
// arguments are both mapped contiguously to the accessor name.
|
||||
const target = getMutableClone(receiver);
|
||||
// TODO(rbuckton): Does this need to be parented?
|
||||
const target = setParent(setTextRange(factory.cloneNode(receiver), receiver), receiver.parent);
|
||||
setEmitFlags(target, EmitFlags.NoComments | EmitFlags.NoTrailingSourceMap);
|
||||
setSourceMapRange(target, firstAccessor.name);
|
||||
|
||||
@@ -2630,7 +2633,8 @@ namespace ts {
|
||||
|
||||
// We need to clone the temporary identifier so that we can write it on a
|
||||
// new line
|
||||
expressions.push(node.multiLine ? startOnNewLine(getMutableClone(temp)) : temp);
|
||||
// TODO(rbuckton): Does this need to be parented?
|
||||
expressions.push(node.multiLine ? startOnNewLine(setParent(setTextRange(factory.cloneNode(temp), temp), temp.parent)) : temp);
|
||||
return factory.inlineExpressions(expressions);
|
||||
}
|
||||
return visitEachChild(node, visitor, context);
|
||||
@@ -3406,7 +3410,7 @@ namespace ts {
|
||||
receiver,
|
||||
visitNode(property.name, visitor, isPropertyName)
|
||||
),
|
||||
getSynthesizedClone(property.name)
|
||||
factory.cloneNode(property.name)
|
||||
);
|
||||
setTextRange(expression, property);
|
||||
if (startsOnNewLine) {
|
||||
@@ -3526,7 +3530,7 @@ namespace ts {
|
||||
return setTextRange(
|
||||
factory.createPropertyAssignment(
|
||||
node.name,
|
||||
getSynthesizedClone(node.name)
|
||||
factory.cloneNode(node.name)
|
||||
),
|
||||
/*location*/ node
|
||||
);
|
||||
|
||||
@@ -1063,7 +1063,8 @@ namespace ts {
|
||||
);
|
||||
|
||||
const expressions = reduceLeft(properties, reduceProperty, <Expression[]>[], numInitialProperties);
|
||||
expressions.push(multiLine ? startOnNewLine(getMutableClone(temp)) : temp);
|
||||
// TODO(rbuckton): Does this need to be parented?
|
||||
expressions.push(multiLine ? startOnNewLine(setParent(setTextRange(factory.cloneNode(temp), temp), temp.parent)) : temp);
|
||||
return factory.inlineExpressions(expressions);
|
||||
|
||||
function reduceProperty(expressions: Expression[], property: ObjectLiteralElementLike) {
|
||||
@@ -1252,7 +1253,7 @@ namespace ts {
|
||||
|
||||
function transformAndEmitVariableDeclarationList(node: VariableDeclarationList): VariableDeclarationList | undefined {
|
||||
for (const variable of node.declarations) {
|
||||
const name = getSynthesizedClone(<Identifier>variable.name);
|
||||
const name = factory.cloneNode(<Identifier>variable.name);
|
||||
setCommentRange(name, variable.name);
|
||||
hoistVariableDeclaration(name);
|
||||
}
|
||||
@@ -1284,7 +1285,7 @@ namespace ts {
|
||||
function transformInitializedVariable(node: VariableDeclaration) {
|
||||
return setSourceMapRange(
|
||||
factory.createAssignment(
|
||||
setSourceMapRange(<Identifier>getSynthesizedClone(node.name), node.name),
|
||||
setSourceMapRange(<Identifier>factory.cloneNode(node.name), node.name),
|
||||
visitNode(node.initializer, visitor, isExpression)
|
||||
),
|
||||
node
|
||||
@@ -1570,7 +1571,7 @@ namespace ts {
|
||||
hoistVariableDeclaration(<Identifier>variable.name);
|
||||
}
|
||||
|
||||
variable = <Identifier>getSynthesizedClone(initializer.declarations[0].name);
|
||||
variable = <Identifier>factory.cloneNode(initializer.declarations[0].name);
|
||||
}
|
||||
else {
|
||||
variable = visitNode(initializer, visitor, isExpression);
|
||||
@@ -1964,7 +1965,8 @@ namespace ts {
|
||||
if (declaration) {
|
||||
const name = renamedCatchVariableDeclarations[getOriginalNodeId(declaration)];
|
||||
if (name) {
|
||||
const clone = getMutableClone(name);
|
||||
// TODO(rbuckton): Does this need to be parented?
|
||||
const clone = setParent(setTextRange(factory.cloneNode(name), name), name.parent);
|
||||
setSourceMapRange(clone, node);
|
||||
setCommentRange(clone, node);
|
||||
return clone;
|
||||
|
||||
@@ -630,7 +630,7 @@ namespace ts {
|
||||
// });
|
||||
needUMDDynamicImportHelper = true;
|
||||
if (isSimpleCopiableExpression(arg)) {
|
||||
const argClone = isGeneratedIdentifier(arg) ? arg : isStringLiteral(arg) ? factory.createStringLiteralFromNode(arg) : setEmitFlags(setTextRange(getSynthesizedClone(arg), arg), EmitFlags.NoComments);
|
||||
const argClone = isGeneratedIdentifier(arg) ? arg : isStringLiteral(arg) ? factory.createStringLiteralFromNode(arg) : setEmitFlags(setTextRange(factory.cloneNode(arg), arg), EmitFlags.NoComments);
|
||||
return factory.createConditional(
|
||||
/*condition*/ factory.createIdentifier("__syncRequire"),
|
||||
/*questionToken*/ undefined,
|
||||
@@ -788,7 +788,7 @@ namespace ts {
|
||||
// import * as n from "mod";
|
||||
variables.push(
|
||||
factory.createVariableDeclaration(
|
||||
getSynthesizedClone(namespaceDeclaration.name),
|
||||
factory.cloneNode(namespaceDeclaration.name),
|
||||
/*exclamationToken*/ undefined,
|
||||
/*type*/ undefined,
|
||||
getHelperExpressionForImport(node, createRequireCall(node))
|
||||
@@ -812,7 +812,7 @@ namespace ts {
|
||||
if (namespaceDeclaration && isDefaultImport(node)) {
|
||||
variables.push(
|
||||
factory.createVariableDeclaration(
|
||||
getSynthesizedClone(namespaceDeclaration.name),
|
||||
factory.cloneNode(namespaceDeclaration.name),
|
||||
/*exclamationToken*/ undefined,
|
||||
/*type*/ undefined,
|
||||
factory.getGeneratedNameForNode(node)
|
||||
@@ -847,7 +847,7 @@ namespace ts {
|
||||
setOriginalNode(
|
||||
setTextRange(
|
||||
factory.createVariableDeclaration(
|
||||
getSynthesizedClone(namespaceDeclaration.name),
|
||||
factory.cloneNode(namespaceDeclaration.name),
|
||||
/*exclamationToken*/ undefined,
|
||||
/*type*/ undefined,
|
||||
factory.getGeneratedNameForNode(node)
|
||||
@@ -923,7 +923,7 @@ namespace ts {
|
||||
factory.createVariableDeclarationList(
|
||||
[
|
||||
factory.createVariableDeclaration(
|
||||
getSynthesizedClone(node.name),
|
||||
factory.cloneNode(node.name),
|
||||
/*exclamationToken*/ undefined,
|
||||
/*type*/ undefined,
|
||||
createRequireCall(node)
|
||||
@@ -1520,7 +1520,7 @@ namespace ts {
|
||||
factory.createAssignment(
|
||||
factory.createPropertyAccess(
|
||||
factory.createIdentifier("exports"),
|
||||
getSynthesizedClone(name)
|
||||
factory.cloneNode(name)
|
||||
),
|
||||
value
|
||||
),
|
||||
@@ -1664,7 +1664,7 @@ namespace ts {
|
||||
return setTextRange(
|
||||
factory.createPropertyAccess(
|
||||
factory.createIdentifier("exports"),
|
||||
getSynthesizedClone(node)
|
||||
factory.cloneNode(node)
|
||||
),
|
||||
/*location*/ node
|
||||
);
|
||||
@@ -1686,7 +1686,7 @@ namespace ts {
|
||||
return setTextRange(
|
||||
factory.createPropertyAccess(
|
||||
factory.getGeneratedNameForNode(importDeclaration.parent.parent.parent),
|
||||
getSynthesizedClone(name)
|
||||
factory.cloneNode(name)
|
||||
),
|
||||
/*location*/ node
|
||||
);
|
||||
|
||||
@@ -794,7 +794,7 @@ namespace ts {
|
||||
}
|
||||
}
|
||||
else {
|
||||
hoistVariableDeclaration(getSynthesizedClone(node.name));
|
||||
hoistVariableDeclaration(factory.cloneNode(node.name));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -861,7 +861,7 @@ namespace ts {
|
||||
* @param isExportedDeclaration A value indicating whether the variable is exported.
|
||||
*/
|
||||
function createVariableAssignment(name: Identifier, value: Expression, location: TextRange | undefined, isExportedDeclaration: boolean) {
|
||||
hoistVariableDeclaration(getSynthesizedClone(name));
|
||||
hoistVariableDeclaration(factory.cloneNode(name));
|
||||
return isExportedDeclaration
|
||||
? createExportExpression(name, preventSubstitution(setTextRange(factory.createAssignment(name, value), location)))
|
||||
: preventSubstitution(setTextRange(factory.createAssignment(name, value), location));
|
||||
@@ -1663,7 +1663,7 @@ namespace ts {
|
||||
if (isImportClause(importDeclaration)) {
|
||||
return setTextRange(
|
||||
factory.createPropertyAssignment(
|
||||
getSynthesizedClone(name),
|
||||
factory.cloneNode(name),
|
||||
factory.createPropertyAccess(
|
||||
factory.getGeneratedNameForNode(importDeclaration.parent),
|
||||
factory.createIdentifier("default")
|
||||
@@ -1675,10 +1675,10 @@ namespace ts {
|
||||
else if (isImportSpecifier(importDeclaration)) {
|
||||
return setTextRange(
|
||||
factory.createPropertyAssignment(
|
||||
getSynthesizedClone(name),
|
||||
factory.cloneNode(name),
|
||||
factory.createPropertyAccess(
|
||||
factory.getGeneratedNameForNode(importDeclaration.parent.parent.parent),
|
||||
getSynthesizedClone(importDeclaration.propertyName || importDeclaration.name)
|
||||
factory.cloneNode(importDeclaration.propertyName || importDeclaration.name)
|
||||
),
|
||||
),
|
||||
/*location*/ node
|
||||
@@ -1747,7 +1747,7 @@ namespace ts {
|
||||
return setTextRange(
|
||||
factory.createPropertyAccess(
|
||||
factory.getGeneratedNameForNode(importDeclaration.parent.parent.parent),
|
||||
getSynthesizedClone(importDeclaration.propertyName || importDeclaration.name)
|
||||
factory.cloneNode(importDeclaration.propertyName || importDeclaration.name)
|
||||
),
|
||||
/*location*/ node
|
||||
);
|
||||
|
||||
@@ -1737,7 +1737,8 @@ namespace ts {
|
||||
case SyntaxKind.Identifier:
|
||||
// Create a clone of the name with a new parent, and treat it as if it were
|
||||
// a source tree node for the purposes of the checker.
|
||||
const name = getMutableClone(node);
|
||||
// TODO(rbuckton): Does this need to be parented?
|
||||
const name = setParent(setTextRange(factory.cloneNode(node), node), node.parent);
|
||||
name.flags &= ~NodeFlags.Synthesized;
|
||||
name.original = undefined;
|
||||
name.parent = getParseTreeNode(currentLexicalScope)!; // ensure the parent is set to a parse tree node.
|
||||
@@ -1807,7 +1808,7 @@ namespace ts {
|
||||
return factory.createStringLiteral(idText(name));
|
||||
}
|
||||
else {
|
||||
return getSynthesizedClone(name);
|
||||
return factory.cloneNode(name);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1962,10 +1963,12 @@ namespace ts {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const propertyName = getMutableClone(name);
|
||||
// TODO(rbuckton): Does this need to be parented?
|
||||
const propertyName = setParent(setTextRange(factory.cloneNode(name), name), name.parent);
|
||||
setEmitFlags(propertyName, EmitFlags.NoComments | EmitFlags.NoSourceMap);
|
||||
|
||||
const localName = getMutableClone(name);
|
||||
// TODO(rbuckton): Does this need to be parented?
|
||||
const localName = setParent(setTextRange(factory.cloneNode(name), name), name.parent);
|
||||
setEmitFlags(localName, EmitFlags.NoComments);
|
||||
|
||||
return startOnNewLine(
|
||||
@@ -3213,7 +3216,7 @@ namespace ts {
|
||||
if (declaration) {
|
||||
const classAlias = classAliases[declaration.id!]; // TODO: GH#18217
|
||||
if (classAlias) {
|
||||
const clone = getSynthesizedClone(classAlias);
|
||||
const clone = factory.cloneNode(classAlias);
|
||||
setSourceMapRange(clone, node);
|
||||
setCommentRange(clone, node);
|
||||
return clone;
|
||||
|
||||
@@ -6541,6 +6541,19 @@ namespace ts {
|
||||
createSourceFile(statements: readonly Statement[], endOfFileToken: EndOfFileToken): SourceFile;
|
||||
updateSourceFile(node: SourceFile, statements: readonly Statement[], isDeclarationFile?: boolean, referencedFiles?: readonly FileReference[], typeReferences?: readonly FileReference[], hasNoDefaultLib?: boolean, libReferences?: readonly FileReference[]): SourceFile;
|
||||
|
||||
/* @internal */ createUnparsedSource(prologues: readonly UnparsedPrologue[], syntheticReferences: readonly UnparsedSyntheticReference[] | undefined, texts: readonly UnparsedSourceText[]): UnparsedSource;
|
||||
/* @internal */ createUnparsedPrologue(data?: string): UnparsedPrologue;
|
||||
/* @internal */ createUnparsedPrepend(data: string | undefined, texts: readonly UnparsedSourceText[]): UnparsedPrepend;
|
||||
/* @internal */ createUnparsedTextLike(data: string | undefined, internal: boolean): UnparsedTextLike;
|
||||
/* @internal */ createUnparsedSyntheticReference(section: BundleFileHasNoDefaultLib | BundleFileReference): UnparsedSyntheticReference;
|
||||
/* @internal */ createInputFiles(): InputFiles;
|
||||
|
||||
//
|
||||
// Synthetic Nodes
|
||||
//
|
||||
/* @internal */ createSyntheticExpression(type: Type, isSpread?: boolean): SyntheticExpression;
|
||||
/* @internal */ createSyntaxList(children: Node[]): SyntaxList;
|
||||
|
||||
//
|
||||
// Transformation nodes
|
||||
//
|
||||
@@ -6719,6 +6732,12 @@ namespace ts {
|
||||
/* @internal */ copyCustomPrologue(source: readonly Statement[], target: Push<Statement>, statementOffset: number | undefined, visitor?: (node: Node) => VisitResult<Node>): number | undefined;
|
||||
/* @internal */ ensureUseStrict(statements: NodeArray<Statement>): NodeArray<Statement>;
|
||||
/* @internal */ liftToBlock(nodes: readonly Node[]): Statement;
|
||||
/**
|
||||
* Creates a shallow, memberwise clone of a node.
|
||||
* - The result will have its `original` pointer set to `node`.
|
||||
* - The result will have its `pos` and `end` set to `-1`.
|
||||
*/
|
||||
/* @internal */ cloneNode<T extends Node | undefined>(node: T): T;
|
||||
}
|
||||
|
||||
export interface CoreTransformationContext {
|
||||
@@ -7214,6 +7233,7 @@ namespace ts {
|
||||
|
||||
// SyntaxKind.SyntaxList
|
||||
export interface SyntaxList extends Node {
|
||||
kind: SyntaxKind.SyntaxList;
|
||||
_children: Node[];
|
||||
}
|
||||
|
||||
|
||||
@@ -5097,8 +5097,9 @@ namespace ts {
|
||||
}
|
||||
}
|
||||
|
||||
export function getDotOrQuestionDotToken(node: PropertyAccessExpression) {
|
||||
return node.questionDotToken || createNode(SyntaxKind.DotToken, node.expression.end, node.name.pos) as DotToken;
|
||||
export function getDotOrQuestionDotToken(node: PropertyAccessExpression): DotToken | QuestionDotToken {
|
||||
return node.questionDotToken ||
|
||||
setTextRangePosEnd(factory.createToken(SyntaxKind.DotToken), node.expression.end, node.name.pos);
|
||||
}
|
||||
|
||||
export function getLeftmostExpression(node: Expression, stopAtCallExpressions: boolean) {
|
||||
@@ -5938,13 +5939,34 @@ namespace ts {
|
||||
|
||||
namespace ts {
|
||||
export function setTextRange<T extends TextRange>(range: T, location: TextRange | undefined): T {
|
||||
if (location) {
|
||||
range.pos = location.pos;
|
||||
range.end = location.end;
|
||||
}
|
||||
return location ? setTextRangePosEnd(range, location.pos, location.end) : range;
|
||||
}
|
||||
|
||||
/* @internal */
|
||||
export function setTextRangePosEnd<T extends TextRange>(range: T, pos: number, end: number) {
|
||||
range.pos = pos;
|
||||
range.end = end;
|
||||
return range;
|
||||
}
|
||||
|
||||
/* @internal */
|
||||
export function setParent<T extends Node>(child: T, parent: T["parent"]): T {
|
||||
if (!child.parent) {
|
||||
child.parent = parent;
|
||||
}
|
||||
return child;
|
||||
}
|
||||
|
||||
/* @internal */
|
||||
export function setEachParent<T extends readonly Node[] | undefined>(children: T, parent: NonNullable<T>[number]["parent"]): T {
|
||||
if (children) {
|
||||
for (const child of children!) {
|
||||
setParent(child, parent);
|
||||
}
|
||||
}
|
||||
return children;
|
||||
}
|
||||
|
||||
export function isConstTypeReference(node: Node) {
|
||||
return isTypeReferenceNode(node) && isIdentifier(node.typeName) &&
|
||||
node.typeName.escapedText === "const" && !node.typeArguments;
|
||||
|
||||
@@ -351,7 +351,7 @@ namespace ts.codefix {
|
||||
if (param.initializer || getJSDocType(param) || !isIdentifier(param.name)) return;
|
||||
|
||||
const typeNode = inference.type && getTypeNodeIfAccessible(inference.type, param, program, host);
|
||||
const name = getSynthesizedClone(param.name);
|
||||
const name = factory.cloneNode(param.name);
|
||||
setEmitFlags(name, EmitFlags.NoComments | EmitFlags.NoNestedComments);
|
||||
return typeNode && factory.createJSDocParameterTag(/*tagName*/ undefined, name, !!inference.isOptional, factory.createJSDocTypeExpression(typeNode), /*isNameFirst*/ undefined, "");
|
||||
});
|
||||
|
||||
@@ -181,24 +181,21 @@ namespace ts.refactor {
|
||||
function doTypedefChange(changes: textChanges.ChangeTracker, file: SourceFile, name: string, info: Info) {
|
||||
const { firstStatement, selection, typeParameters } = info;
|
||||
|
||||
const node = <JSDocTypedefTag>createNode(SyntaxKind.JSDocTypedefTag);
|
||||
node.tagName = factory.createIdentifier("typedef"); // TODO: jsdoc factory https://github.com/Microsoft/TypeScript/pull/29539
|
||||
node.fullName = factory.createIdentifier(name);
|
||||
node.name = node.fullName;
|
||||
node.typeExpression = factory.createJSDocTypeExpression(selection);
|
||||
const node = factory.createJSDocTypedefTag(
|
||||
factory.createIdentifier("typedef"),
|
||||
factory.createJSDocTypeExpression(selection),
|
||||
factory.createIdentifier(name));
|
||||
node.name = node.name as Identifier;
|
||||
|
||||
const templates: JSDocTemplateTag[] = [];
|
||||
forEach(typeParameters, typeParameter => {
|
||||
const constraint = getEffectiveConstraintOfTypeParameter(typeParameter);
|
||||
|
||||
const template = <JSDocTemplateTag>createNode(SyntaxKind.JSDocTemplateTag);
|
||||
template.tagName = factory.createIdentifier("template");
|
||||
template.constraint = constraint && cast(constraint, isJSDocTypeExpression);
|
||||
|
||||
const parameter = <TypeParameterDeclaration>createNode(SyntaxKind.TypeParameter);
|
||||
parameter.name = typeParameter.name;
|
||||
template.typeParameters = factory.createNodeArray([parameter]);
|
||||
|
||||
const parameter = factory.createTypeParameterDeclaration(typeParameter.name);
|
||||
const template = factory.createJSDocTemplateTag(
|
||||
factory.createIdentifier("template"),
|
||||
constraint && cast(constraint, isJSDocTypeExpression),
|
||||
[parameter]
|
||||
);
|
||||
templates.push(template);
|
||||
});
|
||||
|
||||
|
||||
@@ -252,9 +252,7 @@ namespace ts.SmartSelectionRange {
|
||||
|
||||
function createSyntaxList(children: Node[]): SyntaxList {
|
||||
Debug.assertGreaterThanOrEqual(children.length, 1);
|
||||
const syntaxList = createNode(SyntaxKind.SyntaxList, children[0].pos, last(children).end) as SyntaxList;
|
||||
syntaxList._children = children;
|
||||
return syntaxList;
|
||||
return setTextRangePosEnd(parseNodeFactory.createSyntaxList(children), children[0].pos, last(children).end);
|
||||
}
|
||||
|
||||
function isListOpener(token: Node | undefined): token is Node {
|
||||
|
||||
@@ -1787,7 +1787,7 @@ namespace ts {
|
||||
|
||||
if (visited === node) {
|
||||
// This only happens for leaf nodes - internal nodes always see their children change.
|
||||
const clone = getSynthesizedClone(node);
|
||||
const clone = factory.cloneNode(node);
|
||||
if (isStringLiteral(clone)) {
|
||||
clone.textSourceNode = node as any;
|
||||
}
|
||||
|
||||
@@ -174,7 +174,8 @@ namespace ts {
|
||||
|
||||
function replaceWithClassAndNamespace() {
|
||||
return (sourceFile: SourceFile) => {
|
||||
const result = getMutableClone(sourceFile);
|
||||
// TODO(rbuckton): Does this need to be parented?
|
||||
const result = setParent(setTextRange(factory.cloneNode(sourceFile), sourceFile), sourceFile.parent);
|
||||
result.statements = factory.createNodeArray([
|
||||
factory.createClassDeclaration(/*decorators*/ undefined, /*modifiers*/ undefined, "Foo", /*typeParameters*/ undefined, /*heritageClauses*/ undefined, /*members*/ undefined!), // TODO: GH#18217
|
||||
factory.createModuleDeclaration(/*decorators*/ undefined, /*modifiers*/ undefined, factory.createIdentifier("Foo"), factory.createModuleBlock([factory.createEmptyStatement()]))
|
||||
|
||||
+25
-27
@@ -3106,9 +3106,7 @@ declare namespace ts {
|
||||
updateParen(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;
|
||||
updateFunctionExpression(node: FunctionExpression, modifiers: readonly Modifier[] | undefined, asteriskToken: AsteriskToken | undefined, name: Identifier | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: Block): FunctionExpression;
|
||||
createArrowFunction(modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: ConciseBody): ArrowFunction;
|
||||
createArrowFunction(modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, equalsGreaterThanToken: EqualsGreaterThanToken | undefined, body: ConciseBody): ArrowFunction;
|
||||
updateArrowFunction(node: ArrowFunction, modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: ConciseBody): ArrowFunction;
|
||||
updateArrowFunction(node: ArrowFunction, modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, equalsGreaterThanToken: EqualsGreaterThanToken, body: ConciseBody): ArrowFunction;
|
||||
createDelete(expression: Expression): DeleteExpression;
|
||||
updateDelete(node: DeleteExpression, expression: Expression): DeleteExpression;
|
||||
@@ -3124,9 +3122,7 @@ declare namespace ts {
|
||||
updatePostfix(node: PostfixUnaryExpression, operand: Expression): PostfixUnaryExpression;
|
||||
createBinary(left: Expression, operator: BinaryOperator | BinaryOperatorToken, right: Expression): BinaryExpression;
|
||||
updateBinary(node: BinaryExpression, left: Expression, right: Expression, operator?: BinaryOperator | BinaryOperatorToken): BinaryExpression;
|
||||
createConditional(condition: Expression, whenTrue: Expression, whenFalse: Expression): ConditionalExpression;
|
||||
createConditional(condition: Expression, questionToken: QuestionToken, whenTrue: Expression, colonToken: ColonToken, whenFalse: Expression): ConditionalExpression;
|
||||
updateConditional(node: ConditionalExpression, condition: Expression, whenTrue: Expression, whenFalse: Expression): ConditionalExpression;
|
||||
createConditional(condition: Expression, questionToken: QuestionToken | undefined, whenTrue: Expression, colonToken: ColonToken | undefined, whenFalse: Expression): ConditionalExpression;
|
||||
updateConditional(node: ConditionalExpression, condition: Expression, questionToken: QuestionToken, whenTrue: Expression, colonToken: ColonToken, whenFalse: Expression): ConditionalExpression;
|
||||
createTemplateExpression(head: TemplateHead, templateSpans: readonly TemplateSpan[]): TemplateExpression;
|
||||
updateTemplateExpression(node: TemplateExpression, head: TemplateHead, templateSpans: readonly TemplateSpan[]): TemplateExpression;
|
||||
@@ -3513,6 +3509,7 @@ declare namespace ts {
|
||||
newLength: number;
|
||||
}
|
||||
export interface SyntaxList extends Node {
|
||||
kind: SyntaxKind.SyntaxList;
|
||||
_children: Node[];
|
||||
}
|
||||
export enum ListFormat {
|
||||
@@ -3946,10 +3943,6 @@ declare namespace ts {
|
||||
}
|
||||
declare namespace ts {
|
||||
const factory: NodeFactory;
|
||||
/**
|
||||
* Creates a shallow, memberwise clone of a node for mutation.
|
||||
*/
|
||||
function getMutableClone<T extends Node>(node: T): T;
|
||||
function createUnparsedSourceFile(text: string): UnparsedSource;
|
||||
function createUnparsedSourceFile(inputFile: InputFiles, type: "js" | "dts", stripInternal?: boolean): UnparsedSource;
|
||||
function createUnparsedSourceFile(text: string, mapPath: string | undefined, map: string | undefined): UnparsedSource;
|
||||
@@ -4208,6 +4201,7 @@ declare namespace ts {
|
||||
function isJSDocPropertyTag(node: Node): node is JSDocPropertyTag;
|
||||
}
|
||||
declare namespace ts {
|
||||
/** @deprecated Use an appropriate `factory` method instead. */
|
||||
export function createNode(kind: SyntaxKind, pos?: number, end?: number): Node;
|
||||
/**
|
||||
* Invokes a callback for each child of the given node. The 'cbNode' callback is invoked for all child nodes
|
||||
@@ -9832,20 +9826,6 @@ declare namespace ts {
|
||||
* @deprecated Use `factory.updateFunctionExpression` or the factory supplied by your transformation context instead.
|
||||
*/
|
||||
updateFunctionExpression: (node: FunctionExpression, modifiers: readonly Modifier[] | undefined, asteriskToken: AsteriskToken | undefined, name: Identifier | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: Block) => FunctionExpression,
|
||||
/**
|
||||
* @deprecated Use `factory.createArrowFunction` or the factory supplied by your transformation context instead.
|
||||
*/
|
||||
createArrowFunction: {
|
||||
(modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: ConciseBody): ArrowFunction;
|
||||
(modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, equalsGreaterThanToken: EqualsGreaterThanToken | undefined, body: ConciseBody): ArrowFunction;
|
||||
},
|
||||
/**
|
||||
* @deprecated Use `factory.updateArrowFunction` or the factory supplied by your transformation context instead.
|
||||
*/
|
||||
updateArrowFunction: {
|
||||
(node: ArrowFunction, modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: ConciseBody): ArrowFunction;
|
||||
(node: ArrowFunction, modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, equalsGreaterThanToken: EqualsGreaterThanToken, body: ConciseBody): ArrowFunction;
|
||||
},
|
||||
/**
|
||||
* @deprecated Use `factory.createDelete` or the factory supplied by your transformation context instead.
|
||||
*/
|
||||
@@ -9905,10 +9885,7 @@ declare namespace ts {
|
||||
/**
|
||||
* @deprecated Use `factory.updateConditional` or the factory supplied by your transformation context instead.
|
||||
*/
|
||||
updateConditional: {
|
||||
(node: ConditionalExpression, condition: Expression, whenTrue: Expression, whenFalse: Expression): ConditionalExpression;
|
||||
(node: ConditionalExpression, condition: Expression, questionToken: QuestionToken, whenTrue: Expression, colonToken: ColonToken, whenFalse: Expression): ConditionalExpression;
|
||||
},
|
||||
updateConditional: (node: ConditionalExpression, condition: Expression, questionToken: QuestionToken, whenTrue: Expression, colonToken: ColonToken, whenFalse: Expression) => ConditionalExpression,
|
||||
/**
|
||||
* @deprecated Use `factory.createTemplateExpression` or the factory supplied by your transformation context instead.
|
||||
*/
|
||||
@@ -10652,6 +10629,22 @@ declare namespace ts {
|
||||
* @deprecated Use `factory.updateExpressionWithTypeArguments` or the factory supplied by your transformation context instead.
|
||||
*/
|
||||
function updateExpressionWithTypeArguments(node: ExpressionWithTypeArguments, typeArguments: readonly TypeNode[] | undefined, expression: Expression): ExpressionWithTypeArguments;
|
||||
/**
|
||||
* @deprecated Use `factory.createArrowFunction` or the factory supplied by your transformation context instead.
|
||||
*/
|
||||
function createArrowFunction(modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, equalsGreaterThanToken: EqualsGreaterThanToken | undefined, body: ConciseBody): ArrowFunction;
|
||||
/**
|
||||
* @deprecated Use `factory.createArrowFunction` or the factory supplied by your transformation context instead.
|
||||
*/
|
||||
function createArrowFunction(modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: ConciseBody): ArrowFunction;
|
||||
/**
|
||||
* @deprecated Use `factory.updateArrowFunction` or the factory supplied by your transformation context instead.
|
||||
*/
|
||||
function updateArrowFunction(node: ArrowFunction, modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, equalsGreaterThanToken: EqualsGreaterThanToken, body: ConciseBody): ArrowFunction;
|
||||
/**
|
||||
* @deprecated Use `factory.updateArrowFunction` or the factory supplied by your transformation context instead.
|
||||
*/
|
||||
function updateArrowFunction(node: ArrowFunction, modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: ConciseBody): ArrowFunction;
|
||||
/**
|
||||
* @deprecated Use `factory.createVariableDeclaration` or the factory supplied by your transformation context instead.
|
||||
*/
|
||||
@@ -10715,6 +10708,11 @@ declare namespace ts {
|
||||
* @deprecated Use `factory.createLogicalNot` or the factory supplied by your transformation context instead.
|
||||
*/
|
||||
function createLogicalNot(operand: Expression): PrefixUnaryExpression;
|
||||
/**
|
||||
* Creates a shallow, memberwise clone of a node for mutation.
|
||||
* @deprecated Use `factory.cloneNode` instead and set `pos`, `end`, and `parent` as needed.
|
||||
*/
|
||||
function getMutableClone<T extends Node>(node: T): T;
|
||||
/**
|
||||
* @deprecated Use `isTypeAssertionExpression` instead.
|
||||
*/
|
||||
|
||||
+25
-27
@@ -3106,9 +3106,7 @@ declare namespace ts {
|
||||
updateParen(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;
|
||||
updateFunctionExpression(node: FunctionExpression, modifiers: readonly Modifier[] | undefined, asteriskToken: AsteriskToken | undefined, name: Identifier | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: Block): FunctionExpression;
|
||||
createArrowFunction(modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: ConciseBody): ArrowFunction;
|
||||
createArrowFunction(modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, equalsGreaterThanToken: EqualsGreaterThanToken | undefined, body: ConciseBody): ArrowFunction;
|
||||
updateArrowFunction(node: ArrowFunction, modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: ConciseBody): ArrowFunction;
|
||||
updateArrowFunction(node: ArrowFunction, modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, equalsGreaterThanToken: EqualsGreaterThanToken, body: ConciseBody): ArrowFunction;
|
||||
createDelete(expression: Expression): DeleteExpression;
|
||||
updateDelete(node: DeleteExpression, expression: Expression): DeleteExpression;
|
||||
@@ -3124,9 +3122,7 @@ declare namespace ts {
|
||||
updatePostfix(node: PostfixUnaryExpression, operand: Expression): PostfixUnaryExpression;
|
||||
createBinary(left: Expression, operator: BinaryOperator | BinaryOperatorToken, right: Expression): BinaryExpression;
|
||||
updateBinary(node: BinaryExpression, left: Expression, right: Expression, operator?: BinaryOperator | BinaryOperatorToken): BinaryExpression;
|
||||
createConditional(condition: Expression, whenTrue: Expression, whenFalse: Expression): ConditionalExpression;
|
||||
createConditional(condition: Expression, questionToken: QuestionToken, whenTrue: Expression, colonToken: ColonToken, whenFalse: Expression): ConditionalExpression;
|
||||
updateConditional(node: ConditionalExpression, condition: Expression, whenTrue: Expression, whenFalse: Expression): ConditionalExpression;
|
||||
createConditional(condition: Expression, questionToken: QuestionToken | undefined, whenTrue: Expression, colonToken: ColonToken | undefined, whenFalse: Expression): ConditionalExpression;
|
||||
updateConditional(node: ConditionalExpression, condition: Expression, questionToken: QuestionToken, whenTrue: Expression, colonToken: ColonToken, whenFalse: Expression): ConditionalExpression;
|
||||
createTemplateExpression(head: TemplateHead, templateSpans: readonly TemplateSpan[]): TemplateExpression;
|
||||
updateTemplateExpression(node: TemplateExpression, head: TemplateHead, templateSpans: readonly TemplateSpan[]): TemplateExpression;
|
||||
@@ -3513,6 +3509,7 @@ declare namespace ts {
|
||||
newLength: number;
|
||||
}
|
||||
export interface SyntaxList extends Node {
|
||||
kind: SyntaxKind.SyntaxList;
|
||||
_children: Node[];
|
||||
}
|
||||
export enum ListFormat {
|
||||
@@ -3946,10 +3943,6 @@ declare namespace ts {
|
||||
}
|
||||
declare namespace ts {
|
||||
const factory: NodeFactory;
|
||||
/**
|
||||
* Creates a shallow, memberwise clone of a node for mutation.
|
||||
*/
|
||||
function getMutableClone<T extends Node>(node: T): T;
|
||||
function createUnparsedSourceFile(text: string): UnparsedSource;
|
||||
function createUnparsedSourceFile(inputFile: InputFiles, type: "js" | "dts", stripInternal?: boolean): UnparsedSource;
|
||||
function createUnparsedSourceFile(text: string, mapPath: string | undefined, map: string | undefined): UnparsedSource;
|
||||
@@ -4208,6 +4201,7 @@ declare namespace ts {
|
||||
function isJSDocPropertyTag(node: Node): node is JSDocPropertyTag;
|
||||
}
|
||||
declare namespace ts {
|
||||
/** @deprecated Use an appropriate `factory` method instead. */
|
||||
export function createNode(kind: SyntaxKind, pos?: number, end?: number): Node;
|
||||
/**
|
||||
* Invokes a callback for each child of the given node. The 'cbNode' callback is invoked for all child nodes
|
||||
@@ -6375,20 +6369,6 @@ declare namespace ts {
|
||||
* @deprecated Use `factory.updateFunctionExpression` or the factory supplied by your transformation context instead.
|
||||
*/
|
||||
updateFunctionExpression: (node: FunctionExpression, modifiers: readonly Modifier[] | undefined, asteriskToken: AsteriskToken | undefined, name: Identifier | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: Block) => FunctionExpression,
|
||||
/**
|
||||
* @deprecated Use `factory.createArrowFunction` or the factory supplied by your transformation context instead.
|
||||
*/
|
||||
createArrowFunction: {
|
||||
(modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: ConciseBody): ArrowFunction;
|
||||
(modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, equalsGreaterThanToken: EqualsGreaterThanToken | undefined, body: ConciseBody): ArrowFunction;
|
||||
},
|
||||
/**
|
||||
* @deprecated Use `factory.updateArrowFunction` or the factory supplied by your transformation context instead.
|
||||
*/
|
||||
updateArrowFunction: {
|
||||
(node: ArrowFunction, modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: ConciseBody): ArrowFunction;
|
||||
(node: ArrowFunction, modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, equalsGreaterThanToken: EqualsGreaterThanToken, body: ConciseBody): ArrowFunction;
|
||||
},
|
||||
/**
|
||||
* @deprecated Use `factory.createDelete` or the factory supplied by your transformation context instead.
|
||||
*/
|
||||
@@ -6448,10 +6428,7 @@ declare namespace ts {
|
||||
/**
|
||||
* @deprecated Use `factory.updateConditional` or the factory supplied by your transformation context instead.
|
||||
*/
|
||||
updateConditional: {
|
||||
(node: ConditionalExpression, condition: Expression, whenTrue: Expression, whenFalse: Expression): ConditionalExpression;
|
||||
(node: ConditionalExpression, condition: Expression, questionToken: QuestionToken, whenTrue: Expression, colonToken: ColonToken, whenFalse: Expression): ConditionalExpression;
|
||||
},
|
||||
updateConditional: (node: ConditionalExpression, condition: Expression, questionToken: QuestionToken, whenTrue: Expression, colonToken: ColonToken, whenFalse: Expression) => ConditionalExpression,
|
||||
/**
|
||||
* @deprecated Use `factory.createTemplateExpression` or the factory supplied by your transformation context instead.
|
||||
*/
|
||||
@@ -7195,6 +7172,22 @@ declare namespace ts {
|
||||
* @deprecated Use `factory.updateExpressionWithTypeArguments` or the factory supplied by your transformation context instead.
|
||||
*/
|
||||
function updateExpressionWithTypeArguments(node: ExpressionWithTypeArguments, typeArguments: readonly TypeNode[] | undefined, expression: Expression): ExpressionWithTypeArguments;
|
||||
/**
|
||||
* @deprecated Use `factory.createArrowFunction` or the factory supplied by your transformation context instead.
|
||||
*/
|
||||
function createArrowFunction(modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, equalsGreaterThanToken: EqualsGreaterThanToken | undefined, body: ConciseBody): ArrowFunction;
|
||||
/**
|
||||
* @deprecated Use `factory.createArrowFunction` or the factory supplied by your transformation context instead.
|
||||
*/
|
||||
function createArrowFunction(modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: ConciseBody): ArrowFunction;
|
||||
/**
|
||||
* @deprecated Use `factory.updateArrowFunction` or the factory supplied by your transformation context instead.
|
||||
*/
|
||||
function updateArrowFunction(node: ArrowFunction, modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, equalsGreaterThanToken: EqualsGreaterThanToken, body: ConciseBody): ArrowFunction;
|
||||
/**
|
||||
* @deprecated Use `factory.updateArrowFunction` or the factory supplied by your transformation context instead.
|
||||
*/
|
||||
function updateArrowFunction(node: ArrowFunction, modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: ConciseBody): ArrowFunction;
|
||||
/**
|
||||
* @deprecated Use `factory.createVariableDeclaration` or the factory supplied by your transformation context instead.
|
||||
*/
|
||||
@@ -7258,6 +7251,11 @@ declare namespace ts {
|
||||
* @deprecated Use `factory.createLogicalNot` or the factory supplied by your transformation context instead.
|
||||
*/
|
||||
function createLogicalNot(operand: Expression): PrefixUnaryExpression;
|
||||
/**
|
||||
* Creates a shallow, memberwise clone of a node for mutation.
|
||||
* @deprecated Use `factory.cloneNode` instead and set `pos`, `end`, and `parent` as needed.
|
||||
*/
|
||||
function getMutableClone<T extends Node>(node: T): T;
|
||||
/**
|
||||
* @deprecated Use `isTypeAssertionExpression` instead.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user