Remove some properties from Identifier (#52170)

This commit is contained in:
Ron Buckton
2023-01-12 17:20:12 -05:00
committed by GitHub
parent 59e4e38d08
commit 9cdba994ac
45 changed files with 334 additions and 256 deletions
+9 -6
View File
@@ -114,6 +114,7 @@ import {
HasLocals,
hasSyntacticModifier,
Identifier,
identifierToKeywordKind,
idText,
IfStatement,
ImportClause,
@@ -413,7 +414,7 @@ function getModuleInstanceStateWorker(node: Node, visited: Map<number, ModuleIns
case SyntaxKind.Identifier:
// Only jsdoc typedef definition can exist in jsdoc namespace, and it should
// be considered the same as type alias
if ((node as Identifier).isInJSDocNamespace) {
if (node.flags & NodeFlags.IdentifierIsInJSDocNamespace) {
return ModuleInstanceState.NonInstantiated;
}
}
@@ -1030,6 +1031,7 @@ function createBinder(): (file: SourceFile, options: CompilerOptions) => void {
else if (containerFlags & ContainerFlags.IsInterface) {
seenThisKeyword = false;
bindChildren(node);
Debug.assertNotNode(node, isIdentifier); // ContainsThis cannot overlap with HasExtendedUnicodeEscape on Identifier
node.flags = seenThisKeyword ? node.flags | NodeFlags.ContainsThis : node.flags & ~NodeFlags.ContainsThis;
}
else {
@@ -2420,13 +2422,14 @@ function createBinder(): (file: SourceFile, options: CompilerOptions) => void {
!isIdentifierName(node)) {
// strict mode identifiers
const originalKeywordKind = identifierToKeywordKind(node);
if (inStrictMode &&
node.originalKeywordKind! >= SyntaxKind.FirstFutureReservedWord &&
node.originalKeywordKind! <= SyntaxKind.LastFutureReservedWord) {
originalKeywordKind! >= SyntaxKind.FirstFutureReservedWord &&
originalKeywordKind! <= SyntaxKind.LastFutureReservedWord) {
file.bindDiagnostics.push(createDiagnosticForNode(node,
getStrictModeIdentifierMessage(node), declarationNameToString(node)));
}
else if (node.originalKeywordKind === SyntaxKind.AwaitKeyword) {
else if (originalKeywordKind === SyntaxKind.AwaitKeyword) {
if (isExternalModule(file) && isInTopLevelContext(node)) {
file.bindDiagnostics.push(createDiagnosticForNode(node,
Diagnostics.Identifier_expected_0_is_a_reserved_word_at_the_top_level_of_a_module,
@@ -2438,7 +2441,7 @@ function createBinder(): (file: SourceFile, options: CompilerOptions) => void {
declarationNameToString(node)));
}
}
else if (node.originalKeywordKind === SyntaxKind.YieldKeyword && node.flags & NodeFlags.YieldContext) {
else if (originalKeywordKind === SyntaxKind.YieldKeyword && node.flags & NodeFlags.YieldContext) {
file.bindDiagnostics.push(createDiagnosticForNode(node,
Diagnostics.Identifier_expected_0_is_a_reserved_word_that_cannot_be_used_here,
declarationNameToString(node)));
@@ -2731,7 +2734,7 @@ function createBinder(): (file: SourceFile, options: CompilerOptions) => void {
// for typedef type names with namespaces, bind the new jsdoc type symbol here
// because it requires all containing namespaces to be in effect, namely the
// current "blockScopeContainer" needs to be set to its immediate namespace parent.
if ((node as Identifier).isInJSDocNamespace) {
if (node.flags & NodeFlags.IdentifierIsInJSDocNamespace) {
let parentNode = node.parent;
while (parentNode && !isJSDocTypeAlias(parentNode)) {
parentNode = parentNode.parent;
+58 -31
View File
@@ -272,6 +272,8 @@ import {
getFirstIdentifier,
getFunctionFlags,
getHostSignatureFromJSDoc,
getIdentifierGeneratedImportReference,
getIdentifierTypeArguments,
getImmediatelyInvokedFunctionExpression,
getInitializerOfBinaryExpression,
getInterfaceBaseTypeNodes,
@@ -375,6 +377,7 @@ import {
hasSyntacticModifiers,
HeritageClause,
Identifier,
identifierToKeywordKind,
IdentifierTypePredicate,
idText,
IfStatement,
@@ -890,11 +893,13 @@ import {
ReverseMappedType,
sameMap,
SatisfiesExpression,
scanTokenAtPosition,
ScriptKind,
ScriptTarget,
SetAccessorDeclaration,
setCommentRange,
setEmitFlags,
setIdentifierTypeArguments,
setNodeFlags,
setOriginalNode,
setParent,
@@ -6794,12 +6799,16 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
let qualifier = root.qualifier;
if (qualifier) {
if (isIdentifier(qualifier)) {
qualifier = factory.updateIdentifier(qualifier, typeArguments);
if (typeArguments !== getIdentifierTypeArguments(qualifier)) {
qualifier = setIdentifierTypeArguments(factory.cloneNode(qualifier), typeArguments);
}
}
else {
qualifier = factory.updateQualifiedName(qualifier,
qualifier.left,
factory.updateIdentifier(qualifier.right, typeArguments));
if (typeArguments !== getIdentifierTypeArguments(qualifier.right)) {
qualifier = factory.updateQualifiedName(qualifier,
qualifier.left,
setIdentifierTypeArguments(factory.cloneNode(qualifier.right), typeArguments));
}
}
}
typeArguments = ref.typeArguments;
@@ -6821,12 +6830,16 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
let typeArguments = root.typeArguments;
let typeName = root.typeName;
if (isIdentifier(typeName)) {
typeName = factory.updateIdentifier(typeName, typeArguments);
if (typeArguments !== getIdentifierTypeArguments(typeName)) {
typeName = setIdentifierTypeArguments(factory.cloneNode(typeName), typeArguments);
}
}
else {
typeName = factory.updateQualifiedName(typeName,
typeName.left,
factory.updateIdentifier(typeName.right, typeArguments));
if (typeArguments !== getIdentifierTypeArguments(typeName.right)) {
typeName = factory.updateQualifiedName(typeName,
typeName.left,
setIdentifierTypeArguments(factory.cloneNode(typeName.right), typeArguments));
}
}
typeArguments = ref.typeArguments;
// then move qualifiers
@@ -7544,7 +7557,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
if (!nonRootParts || isEntityName(nonRootParts)) {
if (nonRootParts) {
const lastId = isIdentifier(nonRootParts) ? nonRootParts : nonRootParts.right;
lastId.typeArguments = undefined;
setIdentifierTypeArguments(lastId, /*typeArguments*/ undefined);
}
return factory.createImportTypeNode(lit, assertion, nonRootParts as EntityName, typeParameterNodes as readonly TypeNode[], isTypeOf);
}
@@ -7564,8 +7577,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
}
else {
const lastId = isIdentifier(entityName) ? entityName : entityName.right;
const lastTypeArgs = lastId.typeArguments;
lastId.typeArguments = undefined;
const lastTypeArgs = getIdentifierTypeArguments(lastId);
setIdentifierTypeArguments(lastId, /*typeArguments*/ undefined);
return factory.createTypeReferenceNode(entityName, lastTypeArgs as NodeArray<TypeNode>);
}
@@ -7619,7 +7632,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
}
}
const identifier = setEmitFlags(factory.createIdentifier(symbolName, typeParameterNodes), EmitFlags.NoAsciiEscaping);
const identifier = setEmitFlags(factory.createIdentifier(symbolName), EmitFlags.NoAsciiEscaping);
if (typeParameterNodes) setIdentifierTypeArguments(identifier, factory.createNodeArray<TypeNode | TypeParameterDeclaration>(typeParameterNodes));
identifier.symbol = symbol;
if (index > stopper) {
@@ -7664,7 +7678,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
text = `${rawtext}_${i}`;
}
if (text !== rawtext) {
result = factory.createIdentifier(text, result.typeArguments);
const typeArguments = getIdentifierTypeArguments(result);
result = factory.createIdentifier(text);
setIdentifierTypeArguments(result, typeArguments);
}
// avoiding iterations of the above loop turns out to be worth it when `i` starts to get large, so we cache the max
// `i` we've used thus far, to save work later
@@ -7699,7 +7715,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
context.flags ^= NodeBuilderFlags.InInitialEntityName;
}
const identifier = setEmitFlags(factory.createIdentifier(symbolName, typeParameterNodes), EmitFlags.NoAsciiEscaping);
const identifier = setEmitFlags(factory.createIdentifier(symbolName), EmitFlags.NoAsciiEscaping);
if (typeParameterNodes) setIdentifierTypeArguments(identifier, factory.createNodeArray<TypeNode | TypeParameterDeclaration>(typeParameterNodes));
identifier.symbol = symbol;
return index > 0 ? factory.createQualifiedName(createEntityNameFromSymbolChain(chain, index - 1), identifier) : identifier;
@@ -7728,7 +7745,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
return factory.createStringLiteral(getSpecifierForModuleSymbol(symbol, context));
}
if (index === 0 || canUsePropertyAccess(symbolName, languageVersion)) {
const identifier = setEmitFlags(factory.createIdentifier(symbolName, typeParameterNodes), EmitFlags.NoAsciiEscaping);
const identifier = setEmitFlags(factory.createIdentifier(symbolName), EmitFlags.NoAsciiEscaping);
if (typeParameterNodes) setIdentifierTypeArguments(identifier, factory.createNodeArray<TypeNode | TypeParameterDeclaration>(typeParameterNodes));
identifier.symbol = symbol;
return index > 0 ? factory.createPropertyAccessExpression(createExpressionFromSymbolChain(chain, index - 1), identifier) : identifier;
@@ -7746,8 +7764,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
expression = factory.createNumericLiteral(+symbolName);
}
if (!expression) {
expression = setEmitFlags(factory.createIdentifier(symbolName, typeParameterNodes), EmitFlags.NoAsciiEscaping);
(expression as Identifier).symbol = symbol;
const identifier = setEmitFlags(factory.createIdentifier(symbolName), EmitFlags.NoAsciiEscaping);
if (typeParameterNodes) setIdentifierTypeArguments(identifier, factory.createNodeArray<TypeNode | TypeParameterDeclaration>(typeParameterNodes));
identifier.symbol = symbol;
expression = identifier;
}
return factory.createElementAccessExpression(createExpressionFromSymbolChain(chain, index - 1), expression);
}
@@ -23215,15 +23235,17 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
break;
case SyntaxKind.Parameter:
const param = declaration as ParameterDeclaration;
if (isIdentifier(param.name) &&
(isCallSignatureDeclaration(param.parent) || isMethodSignature(param.parent) || isFunctionTypeNode(param.parent)) &&
param.parent.parameters.indexOf(param) > -1 &&
(resolveName(param, param.name.escapedText, SymbolFlags.Type, undefined, param.name.escapedText, /*isUse*/ true) ||
param.name.originalKeywordKind && isTypeNodeKind(param.name.originalKeywordKind))) {
const newName = "arg" + param.parent.parameters.indexOf(param);
const typeName = declarationNameToString(param.name) + (param.dotDotDotToken ? "[]" : "");
errorOrSuggestion(noImplicitAny, declaration, Diagnostics.Parameter_has_a_name_but_no_type_Did_you_mean_0_Colon_1, newName, typeName);
return;
if (isIdentifier(param.name)) {
const originalKeywordKind = identifierToKeywordKind(param.name);
if ((isCallSignatureDeclaration(param.parent) || isMethodSignature(param.parent) || isFunctionTypeNode(param.parent)) &&
param.parent.parameters.indexOf(param) > -1 &&
(resolveName(param, param.name.escapedText, SymbolFlags.Type, undefined, param.name.escapedText, /*isUse*/ true) ||
originalKeywordKind && isTypeNodeKind(originalKeywordKind))) {
const newName = "arg" + param.parent.parameters.indexOf(param);
const typeName = declarationNameToString(param.name) + (param.dotDotDotToken ? "[]" : "");
errorOrSuggestion(noImplicitAny, declaration, Diagnostics.Parameter_has_a_name_but_no_type_Did_you_mean_0_Colon_1, newName, typeName);
return;
}
}
diagnostic = (declaration as ParameterDeclaration).dotDotDotToken ?
noImplicitAny ? Diagnostics.Rest_parameter_0_implicitly_has_an_any_type : Diagnostics.Rest_parameter_0_implicitly_has_an_any_type_but_a_better_type_may_be_inferred_from_usage :
@@ -37483,8 +37505,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
function checkTypeReferenceNode(node: TypeReferenceNode | ExpressionWithTypeArguments) {
checkGrammarTypeArguments(node, node.typeArguments);
if (node.kind === SyntaxKind.TypeReference && node.typeName.jsdocDotPos !== undefined && !isInJSFile(node) && !isInJSDoc(node)) {
grammarErrorAtPos(node, node.typeName.jsdocDotPos, 1, Diagnostics.JSDoc_types_can_only_be_used_inside_documentation_comments);
if (node.kind === SyntaxKind.TypeReference && !isInJSFile(node) && !isInJSDoc(node) && node.typeArguments && node.typeName.end !== node.typeArguments.pos) {
// If there was a token between the type name and the type arguments, check if it was a DotToken
const sourceFile = getSourceFileOfNode(node);
if (scanTokenAtPosition(sourceFile, node.typeName.end) === SyntaxKind.DotToken) {
grammarErrorAtPos(node, skipTrivia(sourceFile.text, node.typeName.end), 1, Diagnostics.JSDoc_types_can_only_be_used_inside_documentation_comments);
}
}
forEach(node.typeArguments, checkSourceElement);
const type = getTypeFromTypeReference(node);
@@ -44622,8 +44648,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
// When resolved as an expression identifier, if the given node references an import, return the declaration of
// that import. Otherwise, return undefined.
function getReferencedImportDeclaration(nodeIn: Identifier): Declaration | undefined {
if (nodeIn.generatedImportReference) {
return nodeIn.generatedImportReference;
const specifier = getIdentifierGeneratedImportReference(nodeIn);
if (specifier) {
return specifier;
}
const node = getParseTreeNode(nodeIn, isIdentifier);
if (node) {
@@ -46894,7 +46921,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
function checkGrammarNameInLetOrConstDeclarations(name: Identifier | BindingPattern): boolean {
if (name.kind === SyntaxKind.Identifier) {
if (name.originalKeywordKind === SyntaxKind.LetKeyword) {
if (name.escapedText === "let") {
return grammarErrorOnNode(name, Diagnostics.let_is_not_allowed_to_be_used_as_a_name_in_let_or_const_declarations);
}
}
+16 -13
View File
@@ -148,6 +148,7 @@ import {
getEmitModuleKind,
getExternalHelpersModuleName,
getExternalModuleName,
getIdentifierTypeArguments,
getLeadingCommentRanges,
getLineAndCharacterOfPosition,
getLinesBetweenPositionAndNextNonWhitespaceCharacter,
@@ -2478,7 +2479,7 @@ export function createPrinter(printerOptions: PrinterOptions = {}, handlers: Pri
function emitIdentifier(node: Identifier) {
const writeText = node.symbol ? writeSymbol : write;
writeText(getTextOfNode(node, /*includeTrivia*/ false), node.symbol);
emitList(node, node.typeArguments, ListFormat.TypeParameters); // Call emitList directly since it could be an array of TypeParameterDeclarations _or_ type arguments
emitList(node, getIdentifierTypeArguments(node), ListFormat.TypeParameters); // Call emitList directly since it could be an array of TypeParameterDeclarations _or_ type arguments
}
//
@@ -5680,15 +5681,16 @@ export function createPrinter(printerOptions: PrinterOptions = {}, handlers: Pri
* Generate the text for a generated identifier.
*/
function generateName(name: GeneratedIdentifier | GeneratedPrivateIdentifier) {
if ((name.autoGenerate.flags & GeneratedIdentifierFlags.KindMask) === GeneratedIdentifierFlags.Node) {
const autoGenerate = name.emitNode.autoGenerate;
if ((autoGenerate.flags & GeneratedIdentifierFlags.KindMask) === GeneratedIdentifierFlags.Node) {
// Node names generate unique names based on their original node
// and are cached based on that node's id.
return generateNameCached(getNodeForGeneratedName(name), isPrivateIdentifier(name), name.autoGenerate.flags, name.autoGenerate.prefix, name.autoGenerate.suffix);
return generateNameCached(getNodeForGeneratedName(name), isPrivateIdentifier(name), autoGenerate.flags, autoGenerate.prefix, autoGenerate.suffix);
}
else {
// Auto, Loop, and Unique names are cached based on their unique
// autoGenerateId.
const autoGenerateId = name.autoGenerate.id;
const autoGenerateId = autoGenerate.id;
return autoGeneratedIdToGeneratedName[autoGenerateId] || (autoGeneratedIdToGeneratedName[autoGenerateId] = makeName(name));
}
}
@@ -5960,27 +5962,28 @@ export function createPrinter(printerOptions: PrinterOptions = {}, handlers: Pri
* Generates a unique identifier for a node.
*/
function makeName(name: GeneratedIdentifier | GeneratedPrivateIdentifier) {
const prefix = formatGeneratedNamePart(name.autoGenerate.prefix, generateName);
const suffix = formatGeneratedNamePart (name.autoGenerate.suffix);
switch (name.autoGenerate.flags & GeneratedIdentifierFlags.KindMask) {
const autoGenerate = name.emitNode.autoGenerate;
const prefix = formatGeneratedNamePart(autoGenerate.prefix, generateName);
const suffix = formatGeneratedNamePart(autoGenerate.suffix);
switch (autoGenerate.flags & GeneratedIdentifierFlags.KindMask) {
case GeneratedIdentifierFlags.Auto:
return makeTempVariableName(TempFlags.Auto, !!(name.autoGenerate.flags & GeneratedIdentifierFlags.ReservedInNestedScopes), isPrivateIdentifier(name), prefix, suffix);
return makeTempVariableName(TempFlags.Auto, !!(autoGenerate.flags & GeneratedIdentifierFlags.ReservedInNestedScopes), isPrivateIdentifier(name), prefix, suffix);
case GeneratedIdentifierFlags.Loop:
Debug.assertNode(name, isIdentifier);
return makeTempVariableName(TempFlags._i, !!(name.autoGenerate.flags & GeneratedIdentifierFlags.ReservedInNestedScopes), /*privateName*/ false, prefix, suffix);
return makeTempVariableName(TempFlags._i, !!(autoGenerate.flags & GeneratedIdentifierFlags.ReservedInNestedScopes), /*privateName*/ false, prefix, suffix);
case GeneratedIdentifierFlags.Unique:
return makeUniqueName(
idText(name),
(name.autoGenerate.flags & GeneratedIdentifierFlags.FileLevel) ? isFileLevelUniqueName : isUniqueName,
!!(name.autoGenerate.flags & GeneratedIdentifierFlags.Optimistic),
!!(name.autoGenerate.flags & GeneratedIdentifierFlags.ReservedInNestedScopes),
(autoGenerate.flags & GeneratedIdentifierFlags.FileLevel) ? isFileLevelUniqueName : isUniqueName,
!!(autoGenerate.flags & GeneratedIdentifierFlags.Optimistic),
!!(autoGenerate.flags & GeneratedIdentifierFlags.ReservedInNestedScopes),
isPrivateIdentifier(name),
prefix,
suffix
);
}
return Debug.fail(`Unsupported GeneratedIdentifierKind: ${Debug.formatEnum(name.autoGenerate.flags & GeneratedIdentifierFlags.KindMask, (ts as any).GeneratedIdentifierFlags, /*isFlags*/ true)}.`);
return Debug.fail(`Unsupported GeneratedIdentifierKind: ${Debug.formatEnum(autoGenerate.flags & GeneratedIdentifierFlags.KindMask, (ts as any).GeneratedIdentifierFlags, /*isFlags*/ true)}.`);
}
// Comments
+39
View File
@@ -2,15 +2,20 @@ import {
AccessExpression,
append,
appendIfUnique,
AutoGenerateInfo,
Debug,
EmitFlags,
EmitHelper,
EmitNode,
getParseTreeNode,
getSourceFileOfNode,
Identifier,
ImportSpecifier,
isParseTreeNode,
Node,
NodeArray,
orderedRemoveItem,
PrivateIdentifier,
SnippetElement,
some,
SourceFile,
@@ -19,6 +24,7 @@ import {
SynthesizedComment,
TextRange,
TypeNode,
TypeParameterDeclaration,
} from "../_namespaces/ts";
/**
@@ -318,3 +324,36 @@ export function setTypeNode<T extends Node>(node: T, type: TypeNode): T {
export function getTypeNode<T extends Node>(node: T): TypeNode | undefined {
return node.emitNode?.typeNode;
}
/** @internal */
export function setIdentifierTypeArguments<T extends Identifier>(node: T, typeArguments: NodeArray<TypeNode | TypeParameterDeclaration> | undefined) {
getOrCreateEmitNode(node).identifierTypeArguments = typeArguments;
return node;
}
/** @internal */
export function getIdentifierTypeArguments(node: Identifier): NodeArray<TypeNode | TypeParameterDeclaration> | undefined {
return node.emitNode?.identifierTypeArguments;
}
/** @internal */
export function setIdentifierAutoGenerate<T extends Identifier | PrivateIdentifier>(node: T, autoGenerate: AutoGenerateInfo | undefined) {
getOrCreateEmitNode(node).autoGenerate = autoGenerate;
return node;
}
/** @internal */
export function getIdentifierAutoGenerate(node: Identifier | PrivateIdentifier): AutoGenerateInfo | undefined {
return node.emitNode?.autoGenerate;
}
/** @internal */
export function setIdentifierGeneratedImportReference<T extends Identifier | PrivateIdentifier>(node: T, value: ImportSpecifier | undefined) {
getOrCreateEmitNode(node).generatedImportReference = value;
return node;
}
/** @internal */
export function getIdentifierGeneratedImportReference(node: Identifier | PrivateIdentifier): ImportSpecifier | undefined {
return node.emitNode?.generatedImportReference;
}
+22 -98
View File
@@ -116,6 +116,7 @@ import {
getCommentRange,
getElementsOfBindingOrAssignmentPattern,
getEmitFlags,
getIdentifierTypeArguments,
getJSDocTypeAliasName,
getLineAndCharacterOfPosition,
getNameOfDeclaration,
@@ -390,6 +391,8 @@ import {
SetAccessorDeclaration,
setEachParent,
setEmitFlags,
setIdentifierAutoGenerate,
setIdentifierTypeArguments,
setParent,
setTextRange,
setTextRangePosWidth,
@@ -532,7 +535,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
createRegularExpressionLiteral,
createLiteralLikeNode,
createIdentifier,
updateIdentifier,
createTempVariable,
createLoopVariable,
createUniqueName,
@@ -1150,34 +1152,29 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
// Identifiers
//
function createBaseIdentifier(escapedText: __String, originalKeywordKind: SyntaxKind | undefined) {
function createBaseIdentifier(escapedText: __String) {
const node = baseFactory.createBaseIdentifierNode(SyntaxKind.Identifier) as Mutable<Identifier>;
node.originalKeywordKind = originalKeywordKind;
node.escapedText = escapedText;
node.autoGenerate = undefined;
node.typeArguments = undefined;
node.hasExtendedUnicodeEscape = undefined;
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.flowNode = undefined; // initialized by binder (FlowContainer)
node.symbol = undefined!; // initialized by checker
return node;
}
function createBaseGeneratedIdentifier(text: string, autoGenerateFlags: GeneratedIdentifierFlags, prefix: string | GeneratedNamePart | undefined, suffix: string | undefined) {
const node = createBaseIdentifier(escapeLeadingUnderscores(text), /*originalKeywordKind*/ undefined) as Mutable<GeneratedIdentifier>;
node.autoGenerate = {
const node = createBaseIdentifier(escapeLeadingUnderscores(text)) as Mutable<GeneratedIdentifier>;
setIdentifierAutoGenerate(node, {
flags: autoGenerateFlags,
id: nextAutoGenerateId,
prefix,
suffix
};
});
nextAutoGenerateId++;
return node;
}
// @api
function createIdentifier(text: string, typeArguments?: readonly (TypeNode | TypeParameterDeclaration)[], originalKeywordKind?: SyntaxKind, hasExtendedUnicodeEscape?: boolean): Identifier {
function createIdentifier(text: string, originalKeywordKind?: SyntaxKind, hasExtendedUnicodeEscape?: boolean): Identifier {
if (originalKeywordKind === undefined && text) {
originalKeywordKind = stringToToken(text);
}
@@ -1185,28 +1182,20 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
originalKeywordKind = undefined;
}
const node = createBaseIdentifier(escapeLeadingUnderscores(text), originalKeywordKind);
node.typeArguments = asNodeArray(typeArguments);
node.hasExtendedUnicodeEscape = hasExtendedUnicodeEscape;
const node = createBaseIdentifier(escapeLeadingUnderscores(text));
if (hasExtendedUnicodeEscape) node.flags |= NodeFlags.IdentifierHasExtendedUnicodeEscape;
// NOTE: we do not include transform flags of typeArguments in an identifier as they do not contribute to transformations
if (node.originalKeywordKind === SyntaxKind.AwaitKeyword) {
if (node.escapedText === "await") {
node.transformFlags |= TransformFlags.ContainsPossibleTopLevelAwait;
}
if (node.hasExtendedUnicodeEscape) {
if (node.flags & NodeFlags.IdentifierHasExtendedUnicodeEscape) {
node.transformFlags |= TransformFlags.ContainsES2015;
}
return node;
}
// @api
function updateIdentifier(node: Identifier, typeArguments?: NodeArray<TypeNode | TypeParameterDeclaration> | undefined): Identifier {
return node.typeArguments !== typeArguments
? update(createIdentifier(idText(node), typeArguments), node)
: node;
}
// @api
function createTempVariable(recordTempVariable: ((node: Identifier) => void) | undefined, reservedInNestedScopes?: boolean, prefix?: string | GeneratedNamePart, suffix?: string): GeneratedIdentifier {
let flags = GeneratedIdentifierFlags.Auto;
@@ -1250,7 +1239,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
function createBasePrivateIdentifier(escapedText: __String) {
const node = baseFactory.createBasePrivateIdentifierNode(SyntaxKind.PrivateIdentifier) as Mutable<PrivateIdentifier>;
node.escapedText = escapedText;
node.autoGenerate = undefined;
node.transformFlags |= TransformFlags.ContainsClassFields;
return node;
}
@@ -1263,12 +1251,12 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
function createBaseGeneratedPrivateIdentifier(text: string, autoGenerateFlags: GeneratedIdentifierFlags, prefix: string | GeneratedNamePart | undefined, suffix: string | undefined) {
const node = createBasePrivateIdentifier(escapeLeadingUnderscores(text));
node.autoGenerate = {
setIdentifierAutoGenerate(node, {
flags: autoGenerateFlags,
id: nextAutoGenerateId,
prefix,
suffix,
};
});
nextAutoGenerateId++;
return node;
}
@@ -1490,7 +1478,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.expression = undefined; // initialized by parser to report grammar errors
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
return node;
}
@@ -1537,7 +1524,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
}
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
return node;
}
@@ -1600,7 +1586,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.initializer = undefined; // initialized by parser to report grammar errors
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
return node;
}
@@ -1655,7 +1640,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
TransformFlags.ContainsClassFields;
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
return node;
}
@@ -1697,7 +1681,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.transformFlags = TransformFlags.ContainsTypeScript;
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.locals = undefined; // initialized by binder (LocalsContainer)
node.nextContainer = undefined; // initialized by binder (LocalsContainer)
node.typeArguments = undefined; // used in quick info
@@ -1773,7 +1756,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.typeArguments = undefined; // used in quick info
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.locals = undefined; // initialized by binder (LocalsContainer)
node.nextContainer = undefined; // initialized by binder (LocalsContainer)
node.flowNode = undefined; // initialized by binder (FlowContainer)
@@ -1824,7 +1806,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.illegalDecorators = undefined; // initialized by parser for grammar errors
node.modifiers = undefined; // initialized by parser for grammar errors
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.locals = undefined; // initialized by binder (LocalsContainer)
node.nextContainer = undefined; // initialized by binder (LocalsContainer)
node.endFlowNode = undefined;
@@ -1872,7 +1853,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.type = undefined; // initialized by parser for grammar errors
node.typeArguments = undefined; // used in quick info
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.locals = undefined; // initialized by binder (LocalsContainer)
node.nextContainer = undefined; // initialized by binder (LocalsContainer)
node.endFlowNode = undefined;
@@ -1934,7 +1914,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.typeArguments = undefined; // used in quick info
node.typeParameters = undefined; // initialized by parser for grammar errors
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.locals = undefined; // initialized by binder (LocalsContainer)
node.nextContainer = undefined; // initialized by binder (LocalsContainer)
node.flowNode = undefined; // initialized by binder (FlowContainer)
@@ -1997,7 +1976,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.typeParameters = undefined; // initialized by parser for grammar errors
node.type = undefined; // initialized by parser for grammar errors
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.locals = undefined; // initialized by binder (LocalsContainer)
node.nextContainer = undefined; // initialized by binder (LocalsContainer)
node.flowNode = undefined; // initialized by binder (FlowContainer)
@@ -2043,7 +2021,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.transformFlags = TransformFlags.ContainsTypeScript;
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.locals = undefined; // initialized by binder (LocalsContainer)
node.nextContainer = undefined; // initialized by binder (LocalsContainer)
node.typeArguments = undefined; // used in quick info
@@ -2077,7 +2054,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.transformFlags = TransformFlags.ContainsTypeScript;
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.locals = undefined; // initialized by binder (LocalsContainer)
node.nextContainer = undefined; // initialized by binder (LocalsContainer)
node.typeArguments = undefined; // used in quick info
@@ -2112,7 +2088,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.illegalDecorators = undefined; // initialized by parser to report grammar errors
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.locals = undefined; // initialized by binder (LocalsContainer)
node.nextContainer = undefined; // initialized by binder (LocalsContainer)
node.typeArguments = undefined; // used in quick info
@@ -2209,7 +2184,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.modifiers = undefined; // initialized by parser for grammar errors
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.locals = undefined; // initialized by binder (LocalsContainer)
node.nextContainer = undefined; // initialized by binder (LocalsContainer)
node.typeArguments = undefined; // used in quick info
@@ -2258,7 +2232,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.transformFlags = TransformFlags.ContainsTypeScript;
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.locals = undefined; // initialized by binder (LocalsContainer)
node.nextContainer = undefined; // initialized by binder (LocalsContainer)
node.typeArguments = undefined; // used in quick info
@@ -2378,7 +2351,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.transformFlags = TransformFlags.ContainsTypeScript;
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
return node;
}
@@ -2754,7 +2726,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.transformFlags |= propagateChildrenFlags(node.properties);
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
return node;
}
@@ -2778,7 +2749,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
propagateChildFlags(node.name) | TransformFlags.ContainsPrivateIdentifierInExpression);
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.flowNode = undefined; // initialized by binder (FlowContainer)
return node;
}
@@ -2846,7 +2816,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
propagateChildFlags(node.argumentExpression);
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.flowNode = undefined; // initialized by binder (FlowContainer)
return node;
}
@@ -3055,7 +3024,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.transformFlags = propagateChildFlags(node.expression);
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
return node;
}
@@ -3106,7 +3074,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.typeArguments = undefined; // used in quick info
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.locals = undefined; // initialized by binder (LocalsContainer)
node.nextContainer = undefined; // initialized by binder (LocalsContainer)
node.flowNode = undefined; // initialized by binder (FlowContainer)
@@ -3169,7 +3136,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.typeArguments = undefined; // used in quick info
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.locals = undefined; // initialized by binder (LocalsContainer)
node.nextContainer = undefined; // initialized by binder (LocalsContainer)
node.flowNode = undefined; // initialized by binder (FlowContainer)
@@ -3350,7 +3316,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
}
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
return node;
}
@@ -3588,7 +3553,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
TransformFlags.ContainsES2015;
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
return node;
}
@@ -3785,7 +3749,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.transformFlags |= propagateChildrenFlags(node.statements);
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.locals = undefined; // initialized by binder (LocalsContainer)
node.nextContainer = undefined; // initialized by binder (LocalsContainer)
return node;
@@ -3812,7 +3775,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.illegalDecorators = undefined; // initialized by parser for grammar errors
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.flowNode = undefined; // initialized by binder (FlowContainer)
return node;
}
@@ -3829,7 +3791,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
function createEmptyStatement() {
const node = createBaseNode<EmptyStatement>(SyntaxKind.EmptyStatement);
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
return node;
}
@@ -3840,7 +3801,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.transformFlags |= propagateChildFlags(node.expression);
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.flowNode = undefined; // initialized by binder (FlowContainer)
return node;
}
@@ -3864,7 +3824,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
propagateChildFlags(node.elseStatement);
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.flowNode = undefined; // initialized by binder (FlowContainer)
return node;
}
@@ -3888,7 +3847,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
propagateChildFlags(node.expression);
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.flowNode = undefined; // initialized by binder (FlowContainer)
return node;
}
@@ -3911,7 +3869,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
propagateChildFlags(node.statement);
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.flowNode = undefined; // initialized by binder (FlowContainer)
return node;
}
@@ -3938,7 +3895,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
propagateChildFlags(node.statement);
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.locals = undefined; // initialized by binder (LocalsContainer)
node.nextContainer = undefined; // initialized by binder (LocalsContainer)
node.flowNode = undefined; // initialized by binder (FlowContainer)
@@ -3967,7 +3923,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
propagateChildFlags(node.statement);
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.locals = undefined; // initialized by binder (LocalsContainer)
node.nextContainer = undefined; // initialized by binder (LocalsContainer)
node.flowNode = undefined; // initialized by binder (FlowContainer)
@@ -3999,7 +3954,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
if (awaitModifier) node.transformFlags |= TransformFlags.ContainsES2018;
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.locals = undefined; // initialized by binder (LocalsContainer)
node.nextContainer = undefined; // initialized by binder (LocalsContainer)
node.flowNode = undefined; // initialized by binder (FlowContainer)
@@ -4025,7 +3979,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
TransformFlags.ContainsHoistedDeclarationOrCompletion;
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.flowNode = undefined; // initialized by binder (FlowContainer)
return node;
}
@@ -4046,7 +3999,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
TransformFlags.ContainsHoistedDeclarationOrCompletion;
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.flowNode = undefined; // initialized by binder (FlowContainer)
return node;
}
@@ -4069,7 +4021,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
TransformFlags.ContainsHoistedDeclarationOrCompletion;
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.flowNode = undefined; // initialized by binder (FlowContainer)
return node;
}
@@ -4091,7 +4042,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
propagateChildFlags(node.statement);
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.flowNode = undefined; // initialized by binder (FlowContainer)
return node;
}
@@ -4114,7 +4064,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
propagateChildFlags(node.caseBlock);
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.flowNode = undefined; // initialized by binder (FlowContainer)
node.possiblyExhaustive = false; // initialized by binder
return node;
@@ -4138,7 +4087,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
propagateChildFlags(node.statement);
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.flowNode = undefined; // initialized by binder (FlowContainer)
return node;
}
@@ -4158,7 +4106,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.transformFlags |= propagateChildFlags(node.expression);
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.flowNode = undefined; // initialized by binder (FlowContainer)
return node;
}
@@ -4182,7 +4129,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
propagateChildFlags(node.finallyBlock);
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.flowNode = undefined; // initialized by binder (FlowContainer)
return node;
}
@@ -4201,7 +4147,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
const node = createBaseNode<DebuggerStatement>(SyntaxKind.DebuggerStatement);
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.flowNode = undefined; // initialized by binder (FlowContainer)
return node;
}
@@ -4219,7 +4164,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
(node.exclamationToken ?? node.type ? TransformFlags.ContainsTypeScript : TransformFlags.None);
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
return node;
}
@@ -4303,7 +4247,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.typeArguments = undefined; // used in quick info
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.locals = undefined; // initialized by binder (LocalsContainer)
node.nextContainer = undefined; // initialized by binder (LocalsContainer)
node.endFlowNode = undefined;
@@ -4374,7 +4317,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
}
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
return node;
}
@@ -4414,7 +4356,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.illegalDecorators = undefined; // initialized by parser for grammar errors
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
return node;
}
@@ -4459,7 +4400,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.illegalDecorators = undefined; // initialized by parser for grammar errors
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.locals = undefined; // initialized by binder (LocalsContainer)
node.nextContainer = undefined; // initialized by binder (LocalsContainer)
return node;
@@ -4507,7 +4447,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.illegalDecorators = undefined; // initialized by parser for grammar errors
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
return node;
}
@@ -4557,7 +4496,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.illegalDecorators = undefined; // initialized by parser for grammar errors
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.locals = undefined; // initialized by binder (LocalsContainer)
node.nextContainer = undefined; // initialized by binder (LocalsContainer)
return node;
@@ -4591,7 +4529,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.transformFlags |= propagateChildrenFlags(node.statements);
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
return node;
}
@@ -4631,7 +4568,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.illegalDecorators = undefined; // initialized by parser to report grammar errors
node.modifiers = undefined; // initialized by parser to report grammar errors
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
return node;
}
@@ -4675,7 +4611,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.illegalDecorators = undefined; // initialized by parser to report grammar errors
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
return node;
}
@@ -4721,7 +4656,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.illegalDecorators = undefined; // initialized by parser to report grammar errors
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
return node;
}
@@ -4912,7 +4846,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.illegalDecorators = undefined; // initialized by parser to report grammar errors
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
return node;
}
@@ -4957,7 +4890,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.illegalDecorators = undefined; // initialized by parser to report grammar errors
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
return node;
}
@@ -5014,7 +4946,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.transformFlags &= ~TransformFlags.ContainsPossibleTopLevelAwait; // always parsed in an Await context
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
return node;
}
@@ -5032,7 +4963,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
const node = createBaseDeclaration<MissingDeclaration>(SyntaxKind.MissingDeclaration);
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
return node;
}
@@ -5118,7 +5048,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
(node.type ? TransformFlags.ContainsTypeScript : TransformFlags.None);
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.locals = undefined; // initialized by binder (LocalsContainer)
node.nextContainer = undefined; // initialized by binder (LocalsContainer)
node.typeArguments = undefined; // used in quick info
@@ -5171,7 +5100,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.type = type;
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
node.locals = undefined; // initialized by binder (LocalsContainer)
node.nextContainer = undefined; // initialized by binder (LocalsContainer)
return node;
@@ -5808,7 +5736,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
propagateChildrenFlags(node.statements);
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
return node;
}
@@ -5903,7 +5830,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.questionToken = undefined; // initialized by parser to report grammar errors
node.exclamationToken = undefined; // initialized by parser to report grammar errors
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
return node;
}
@@ -5942,7 +5868,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
node.questionToken = undefined; // initialized by parser to report grammar errors
node.exclamationToken = undefined; // initialized by parser to report grammar errors
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
return node;
}
@@ -5976,7 +5901,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
TransformFlags.ContainsObjectRestOrSpread;
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
return node;
}
@@ -6002,7 +5926,6 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
TransformFlags.ContainsTypeScript;
node.jsDoc = undefined; // initialized by parser (JsDocContainer)
node.jsDocCache = undefined; // initialized by parser (JsDocContainer)
return node;
}
@@ -6378,34 +6301,35 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
}
function cloneGeneratedIdentifier(node: GeneratedIdentifier): GeneratedIdentifier {
const clone = createBaseIdentifier(node.escapedText, /*originalKeywordKind*/ undefined) as Mutable<GeneratedIdentifier>;
const clone = createBaseIdentifier(node.escapedText) as Mutable<GeneratedIdentifier>;
clone.flags |= node.flags & ~NodeFlags.Synthesized;
clone.autoGenerate = { ...node.autoGenerate };
clone.transformFlags = node.transformFlags;
setOriginalNode(clone, node);
setIdentifierAutoGenerate(clone, { ...node.emitNode.autoGenerate });
return clone;
}
function cloneIdentifier(node: Identifier): Identifier {
const clone = createBaseIdentifier(node.escapedText, node.originalKeywordKind);
const clone = createBaseIdentifier(node.escapedText);
clone.flags |= node.flags & ~NodeFlags.Synthesized;
clone.typeArguments = node.typeArguments;
clone.hasExtendedUnicodeEscape = node.hasExtendedUnicodeEscape;
clone.jsDoc = node.jsDoc;
clone.jsDocCache = node.jsDocCache;
clone.flowNode = node.flowNode;
clone.symbol = node.symbol;
clone.transformFlags = node.transformFlags;
setOriginalNode(clone, node);
// clone type arguments for emitter/typeWriter
const typeArguments = getIdentifierTypeArguments(node);
if (typeArguments) setIdentifierTypeArguments(clone, typeArguments);
return clone;
}
function cloneGeneratedPrivateIdentifier(node: GeneratedPrivateIdentifier): GeneratedPrivateIdentifier {
const clone = createBasePrivateIdentifier(node.escapedText) as Mutable<GeneratedPrivateIdentifier>;
clone.flags |= node.flags & ~NodeFlags.Synthesized;
clone.autoGenerate = { ...node.autoGenerate };
clone.transformFlags = node.transformFlags;
setOriginalNode(clone, node);
setIdentifierAutoGenerate(clone, { ...node.emitNode.autoGenerate });
return clone;
}
+7 -6
View File
@@ -1489,18 +1489,19 @@ export function elideNodes<T extends Node>(factory: NodeFactory, nodes: NodeArra
* @internal
*/
export function getNodeForGeneratedName(name: GeneratedIdentifier | GeneratedPrivateIdentifier) {
if (name.autoGenerate.flags & GeneratedIdentifierFlags.Node) {
const autoGenerateId = name.autoGenerate.id;
const autoGenerate = name.emitNode.autoGenerate;
if (autoGenerate.flags & GeneratedIdentifierFlags.Node) {
const autoGenerateId = autoGenerate.id;
let node = name as Node;
let original = node.original;
while (original) {
node = original;
const autoGenerate = node.emitNode?.autoGenerate;
// if "node" is a different generated name (having a different "autoGenerateId"), use it and stop traversing.
if (isMemberName(node) && (
node.autoGenerate === undefined ||
!!(node.autoGenerate.flags & GeneratedIdentifierFlags.Node) &&
node.autoGenerate.id !== autoGenerateId)) {
autoGenerate === undefined ||
!!(autoGenerate.flags & GeneratedIdentifierFlags.Node) &&
autoGenerate.id !== autoGenerateId)) {
break;
}
+9 -11
View File
@@ -2551,7 +2551,7 @@ namespace Parser {
const pos = getNodePos();
const result =
kind === SyntaxKind.Identifier ? factory.createIdentifier("", /*typeArguments*/ undefined, /*originalKeywordKind*/ undefined) :
kind === SyntaxKind.Identifier ? factory.createIdentifier("", /*originalKeywordKind*/ undefined) :
isTemplateLiteralKind(kind) ? factory.createTemplateLiteralLikeNode(kind, "", "", /*templateFlags*/ undefined) :
kind === SyntaxKind.NumericLiteral ? factory.createNumericLiteral("", /*numericLiteralFlags*/ undefined) :
kind === SyntaxKind.StringLiteral ? factory.createStringLiteral("", /*isSingleQuote*/ undefined) :
@@ -2580,7 +2580,7 @@ namespace Parser {
const text = internIdentifier(scanner.getTokenValue());
const hasExtendedUnicodeEscape = scanner.hasExtendedUnicodeEscape();
nextTokenWithoutCheck();
return finishNode(factory.createIdentifier(text, /*typeArguments*/ undefined, originalKeywordKind, hasExtendedUnicodeEscape), pos);
return finishNode(factory.createIdentifier(text, originalKeywordKind, hasExtendedUnicodeEscape), pos);
}
if (token() === SyntaxKind.PrivateIdentifier) {
@@ -3062,9 +3062,9 @@ namespace Parser {
return undefined;
}
if (canHaveJSDoc(node) && node.jsDocCache) {
if (canHaveJSDoc(node) && node.jsDoc?.jsDocCache) {
// jsDocCache may include tags from parent nodes, which might have been modified.
node.jsDocCache = undefined;
node.jsDoc.jsDocCache = undefined;
}
return node;
@@ -3189,7 +3189,7 @@ namespace Parser {
// into an actual .ConstructorDeclaration.
const methodDeclaration = node as MethodDeclaration;
const nameIsConstructor = methodDeclaration.name.kind === SyntaxKind.Identifier &&
methodDeclaration.name.originalKeywordKind === SyntaxKind.ConstructorKeyword;
methodDeclaration.name.escapedText === "constructor";
return !nameIsConstructor;
}
@@ -3456,14 +3456,12 @@ namespace Parser {
function parseEntityName(allowReservedWords: boolean, diagnosticMessage?: DiagnosticMessage): EntityName {
const pos = getNodePos();
let entity: EntityName = allowReservedWords ? parseIdentifierName(diagnosticMessage) : parseIdentifier(diagnosticMessage);
let dotPos = getNodePos();
while (parseOptional(SyntaxKind.DotToken)) {
if (token() === SyntaxKind.LessThanToken) {
// the entity is part of a JSDoc-style generic, so record the trailing dot for later error reporting
entity.jsdocDotPos = dotPos;
// The entity is part of a JSDoc-style generic. We will use the gap between `typeName` and
// `typeArguments` to report it as a grammar error in the checker.
break;
}
dotPos = getNodePos();
entity = finishNode(
factory.createQualifiedName(
entity,
@@ -9258,7 +9256,7 @@ namespace Parser {
}
if (nested) {
typeNameOrNamespaceName.isInJSDocNamespace = true;
(typeNameOrNamespaceName as Mutable<Identifier>).flags |= NodeFlags.IdentifierIsInJSDocNamespace;
}
return typeNameOrNamespaceName;
}
@@ -9481,7 +9479,7 @@ namespace Parser {
const end = scanner.getTextPos();
const originalKeywordKind = token();
const text = internIdentifier(scanner.getTokenValue());
const result = finishNode(factory.createIdentifier(text, /*typeArguments*/ undefined, originalKeywordKind), pos, end);
const result = finishNode(factory.createIdentifier(text, originalKeywordKind), pos, end);
nextTokenJSDoc();
return result;
}
+1 -1
View File
@@ -1553,7 +1553,7 @@ export function transformClassFields(context: TransformationContext): (x: Source
// record an alias as the class name is not in scope for statics.
enableSubstitutionForClassAliases();
const alias = factory.cloneNode(temp) as GeneratedIdentifier;
alias.autoGenerate.flags &= ~GeneratedIdentifierFlags.ReservedInNestedScopes;
alias.emitNode.autoGenerate.flags &= ~GeneratedIdentifierFlags.ReservedInNestedScopes;
classAliases[getOriginalNodeId(node)] = alias;
}
+1 -1
View File
@@ -856,7 +856,7 @@ export function transformES2015(context: TransformationContext): (x: SourceFile
return convertedLoopState.argumentsName || (convertedLoopState.argumentsName = factory.createUniqueName("arguments"));
}
}
if (node.hasExtendedUnicodeEscape) {
if (node.flags & NodeFlags.IdentifierHasExtendedUnicodeEscape) {
return setOriginalNode(setTextRange(
factory.createIdentifier(unescapeLeadingUnderscores(node.escapedText)),
node
+2 -4
View File
@@ -5,7 +5,7 @@ import {
Expression,
getOriginalNodeId,
Identifier,
idText,
identifierToKeywordKind,
isIdentifier,
isPrivateIdentifier,
isPropertyAccessExpression,
@@ -15,12 +15,10 @@ import {
JsxOpeningElement,
JsxSelfClosingElement,
Node,
nodeIsSynthesized,
PropertyAccessExpression,
PropertyAssignment,
setTextRange,
SourceFile,
stringToToken,
SyntaxKind,
TransformationContext,
} from "../_namespaces/ts";
@@ -139,7 +137,7 @@ export function transformES5(context: TransformationContext): (x: SourceFile | B
* @param name An Identifier
*/
function trySubstituteReservedName(name: Identifier) {
const token = name.originalKeywordKind || (nodeIsSynthesized(name) ? stringToToken(idText(name)) : undefined);
const token = identifierToKeywordKind(name);
if (token !== undefined && token >= SyntaxKind.FirstReservedWord && token <= SyntaxKind.LastReservedWord) {
return setTextRange(factory.createStringLiteralFromNode(name), name);
}
+2 -1
View File
@@ -57,6 +57,7 @@ import {
NodeFlags,
PropertyAssignment,
ScriptTarget,
setIdentifierGeneratedImportReference,
setParentRecursive,
setTextRange,
singleOrUndefined,
@@ -135,7 +136,7 @@ export function transformJsx(context: TransformationContext): (x: SourceFile | B
}
const generatedName = factory.createUniqueName(`_${name}`, GeneratedIdentifierFlags.Optimistic | GeneratedIdentifierFlags.FileLevel | GeneratedIdentifierFlags.AllowNameSubstitution);
const specifier = factory.createImportSpecifier(/*isTypeOnly*/ false, factory.createIdentifier(name), generatedName);
generatedName.generatedImportReference = specifier;
setIdentifierGeneratedImportReference(generatedName, specifier);
specifierSourceImports.set(name, specifier);
return generatedName;
}
+1 -1
View File
@@ -2064,7 +2064,7 @@ export function transformModule(context: TransformationContext): (x: SourceFile
}
return node;
}
else if (!(isGeneratedIdentifier(node) && !(node.autoGenerate.flags & GeneratedIdentifierFlags.AllowNameSubstitution)) && !isLocalName(node)) {
else if (!(isGeneratedIdentifier(node) && !(node.emitNode.autoGenerate.flags & GeneratedIdentifierFlags.AllowNameSubstitution)) && !isLocalName(node)) {
const exportContainer = resolver.getReferencedExportContainer(node, isExportName(node));
if (exportContainer && exportContainer.kind === SyntaxKind.SourceFile) {
return setTextRange(
+16 -21
View File
@@ -831,6 +831,10 @@ export const enum NodeFlags {
// never cleared on SourceFiles which get re-used in between incremental parses.
// See the comment above on `PossiblyContainsDynamicImport` and `PossiblyContainsImportMeta`.
/** @internal */ PermanentlySetIncrementalFlags = PossiblyContainsDynamicImport | PossiblyContainsImportMeta,
// The following flags repurpose other NodeFlags as different meanings for Identifier nodes
/** @internal */ IdentifierHasExtendedUnicodeEscape = ContainsThis, // Indicates whether the identifier contains an extended unicode escape sequence
/** @internal */ IdentifierIsInJSDocNamespace = HasAsyncFunctions, // Indicates whether the identifier is part of a JSDoc namespace
}
export const enum ModifierFlags {
@@ -908,8 +912,12 @@ export interface Node extends ReadonlyTextRange {
export interface JSDocContainer extends Node {
_jsdocContainerBrand: any;
/** @internal */ jsDoc?: JSDoc[]; // JSDoc that directly precedes this node
/** @internal */ jsDocCache?: readonly JSDocTag[]; // Cache for getJSDocTags
/** @internal */ jsDoc?: JSDocArray; // JSDoc that directly precedes this node
}
/** @internal */
export interface JSDocArray extends Array<JSDoc> {
jsDocCache?: readonly JSDocTag[]; // Cache for getJSDocTags
}
export interface LocalsContainer extends Node {
@@ -1005,12 +1013,6 @@ export type ForEachChildNodes =
| JSDocOverloadTag
;
/** @internal */
export type VisitEachChildNodes =
| HasChildren
| Identifier
;
/** @internal */
export type HasChildren =
| QualifiedName
@@ -1678,13 +1680,6 @@ export interface Identifier extends PrimaryExpression, Declaration, JSDocContain
* Text of identifier, but if the identifier begins with two underscores, this will begin with three.
*/
readonly escapedText: __String;
readonly originalKeywordKind?: SyntaxKind; // Original syntaxKind which get set so that we can report an error later
/** @internal */ readonly autoGenerate: AutoGenerateInfo | undefined; // Used for auto-generated identifiers.
/** @internal */ generatedImportReference?: ImportSpecifier; // Reference to the generated import specifier this identifier refers to
isInJSDocNamespace?: boolean; // if the node is a member in a JSDoc namespace
/** @internal */ typeArguments?: NodeArray<TypeNode | TypeParameterDeclaration>; // Only defined on synthesized nodes. Though not syntactically valid, used in emitting diagnostics, quickinfo, and signature help.
/** @internal */ jsdocDotPos?: number; // Identifier occurs in JSDoc-style generic: Id.<T>
/**@internal*/ hasExtendedUnicodeEscape?: boolean;
}
// Transient identifier node (marked by id === -1)
@@ -1702,14 +1697,13 @@ export interface AutoGenerateInfo {
/** @internal */
export interface GeneratedIdentifier extends Identifier {
readonly autoGenerate: AutoGenerateInfo;
readonly emitNode: EmitNode & { autoGenerate: AutoGenerateInfo; };
}
export interface QualifiedName extends Node, FlowContainer {
readonly kind: SyntaxKind.QualifiedName;
readonly left: EntityName;
readonly right: Identifier;
/** @internal */ jsdocDotPos?: number; // QualifiedName occurs in JSDoc-style generic: Id1.Id2.<T>
}
export type EntityName = Identifier | QualifiedName;
@@ -1780,12 +1774,11 @@ export interface PrivateIdentifier extends PrimaryExpression {
// escaping not strictly necessary
// avoids gotchas in transforms and utils
readonly escapedText: __String;
/** @internal */ readonly autoGenerate: AutoGenerateInfo | undefined; // Used for auto-generated identifiers.
}
/** @internal */
export interface GeneratedPrivateIdentifier extends PrivateIdentifier {
readonly autoGenerate: AutoGenerateInfo;
readonly emitNode: EmitNode & { autoGenerate: AutoGenerateInfo };
}
/** @internal */
@@ -7829,6 +7822,9 @@ export interface EmitNode {
startsOnNewLine?: boolean; // If the node should begin on a new line
snippetElement?: SnippetElement; // Snippet element of the node
typeNode?: TypeNode; // VariableDeclaration type
identifierTypeArguments?: NodeArray<TypeNode | TypeParameterDeclaration>; // Only defined on synthesized identifiers. Though not syntactically valid, used in emitting diagnostics, quickinfo, and signature help.
autoGenerate: AutoGenerateInfo | undefined; // Used for auto-generated identifiers and private identifiers.
generatedImportReference?: ImportSpecifier; // Reference to the generated import specifier this identifier refers to
}
/** @internal */
@@ -8127,8 +8123,7 @@ export interface NodeFactory {
//
createIdentifier(text: string): Identifier;
/** @internal */ createIdentifier(text: string, typeArguments?: readonly (TypeNode | TypeParameterDeclaration)[], originalKeywordKind?: SyntaxKind, hasExtendedUnicodeEscape?: boolean): Identifier; // eslint-disable-line @typescript-eslint/unified-signatures
/** @internal */ updateIdentifier(node: Identifier, typeArguments: NodeArray<TypeNode | TypeParameterDeclaration> | undefined): Identifier;
/** @internal */ createIdentifier(text: string, originalKeywordKind?: SyntaxKind, hasExtendedUnicodeEscape?: boolean): Identifier; // eslint-disable-line @typescript-eslint/unified-signatures
/**
* Create a unique temporary variable.
+25 -5
View File
@@ -204,6 +204,7 @@ import {
HasTypeArguments,
HeritageClause,
Identifier,
identifierToKeywordKind,
IdentifierTypePredicate,
identity,
idText,
@@ -1651,7 +1652,7 @@ export function tryGetTextOfPropertyName(name: PropertyName | NoSubstitutionTemp
switch (name.kind) {
case SyntaxKind.Identifier:
case SyntaxKind.PrivateIdentifier:
return name.autoGenerate ? undefined : name.escapedText;
return name.emitNode?.autoGenerate ? undefined : name.escapedText;
case SyntaxKind.StringLiteral:
case SyntaxKind.NumericLiteral:
case SyntaxKind.NoSubstitutionTemplateLiteral:
@@ -1785,6 +1786,13 @@ export function getSpanOfTokenAtPosition(sourceFile: SourceFile, pos: number): T
return createTextSpanFromBounds(start, scanner.getTextPos());
}
/** @internal */
export function scanTokenAtPosition(sourceFile: SourceFile, pos: number) {
const scanner = createScanner(sourceFile.languageVersion, /*skipTrivia*/ true, sourceFile.languageVariant, sourceFile.text, /*onError:*/ undefined, pos);
scanner.scan();
return scanner.getToken();
}
function getErrorSpanForArrowFunction(sourceFile: SourceFile, node: ArrowFunction): TextSpan {
const pos = skipTrivia(sourceFile.text, node.pos);
if (node.body && node.body.kind === SyntaxKind.Block) {
@@ -4341,7 +4349,8 @@ export function isStringAKeyword(name: string) {
}
/** @internal */
export function isIdentifierANonContextualKeyword({ originalKeywordKind }: Identifier): boolean {
export function isIdentifierANonContextualKeyword(node: Identifier): boolean {
const originalKeywordKind = identifierToKeywordKind(node);
return !!originalKeywordKind && !isContextualKeyword(originalKeywordKind);
}
@@ -5709,7 +5718,7 @@ export function isThisInTypeQuery(node: Node): boolean {
/** @internal */
export function identifierIsThisKeyword(id: Identifier): boolean {
return id.originalKeywordKind === SyntaxKind.ThisKeyword;
return id.escapedText === "this";
}
/** @internal */
@@ -6194,7 +6203,7 @@ export function getEffectiveModifierFlagsNoCache(node: Node): ModifierFlags {
*/
export function getSyntacticModifierFlagsNoCache(node: Node): ModifierFlags {
let flags = canHaveModifiers(node) ? modifiersToFlags(node.modifiers) : ModifierFlags.None;
if (node.flags & NodeFlags.NestedNamespace || (node.kind === SyntaxKind.Identifier && (node as Identifier).isInJSDocNamespace)) {
if (node.flags & NodeFlags.NestedNamespace || node.kind === SyntaxKind.Identifier && node.flags & NodeFlags.IdentifierIsInJSDocNamespace) {
flags |= ModifierFlags.Export;
}
return flags;
@@ -7327,7 +7336,6 @@ function Identifier(this: Mutable<Node>, kind: SyntaxKind, pos: number, end: num
this.parent = undefined!;
this.original = undefined;
this.emitNode = undefined;
(this as Identifier).flowNode = undefined;
}
function SourceMapSource(this: SourceMapSource, fileName: string, text: string, skipTrivia?: (pos: number) => number) {
@@ -7350,9 +7358,21 @@ export const objectAllocator: ObjectAllocator = {
getSourceMapSourceConstructor: () => SourceMapSource as any,
};
const objectAllocatorPatchers: ((objectAllocator: ObjectAllocator) => void)[] = [];
/**
* Used by `deprecatedCompat` to patch the object allocator to apply deprecations.
* @internal
*/
export function addObjectAllocatorPatcher(fn: (objectAllocator: ObjectAllocator) => void) {
objectAllocatorPatchers.push(fn);
fn(objectAllocator);
}
/** @internal */
export function setObjectAllocator(alloc: ObjectAllocator) {
Object.assign(objectAllocator, alloc);
forEach(objectAllocatorPatchers, fn => fn(objectAllocator));
}
/** @internal */
+19 -4
View File
@@ -138,6 +138,7 @@ import {
isJSDocTypeAlias,
isJSDocTypeLiteral,
isJSDocTypeTag,
isKeyword,
isModuleBlock,
isNonNullExpression,
isNotEmittedStatement,
@@ -189,6 +190,7 @@ import {
JsxExpression,
JsxOpeningLikeElement,
JsxTagNameExpression,
KeywordSyntaxKind,
LabeledStatement,
lastOrUndefined,
LeftHandSideExpression,
@@ -249,6 +251,7 @@ import {
Statement,
StringLiteral,
StringLiteralLike,
stringToToken,
Symbol,
SyntaxKind,
TemplateLiteral,
@@ -258,6 +261,7 @@ import {
TextChangeRange,
TextRange,
TextSpan,
tryCast,
TypeElement,
TypeNode,
TypeOnlyAliasDeclaration,
@@ -761,6 +765,16 @@ export function unescapeLeadingUnderscores(identifier: __String): string {
export function idText(identifierOrPrivateName: Identifier | PrivateIdentifier): string {
return unescapeLeadingUnderscores(identifierOrPrivateName.escapedText);
}
/**
* If the text of an Identifier matches a keyword (including contextual and TypeScript-specific keywords), returns the
* SyntaxKind for the matching keyword.
*/
export function identifierToKeywordKind(node: Identifier): KeywordSyntaxKind | undefined {
const token = stringToToken(node.escapedText as string);
return token ? tryCast(token, isKeyword) : undefined;
}
export function symbolName(symbol: Symbol): string {
if (symbol.valueDeclaration && isPrivateIdentifierClassElementDeclaration(symbol.valueDeclaration)) {
return idText(symbol.valueDeclaration.name);
@@ -1147,14 +1161,15 @@ export function getJSDocReturnType(node: Node): TypeNode | undefined {
function getJSDocTagsWorker(node: Node, noCache?: boolean): readonly JSDocTag[] {
if (!canHaveJSDoc(node)) return emptyArray;
let tags = node.jsDocCache;
let tags = node.jsDoc?.jsDocCache;
// If cache is 'null', that means we did the work of searching for JSDoc tags and came up with nothing.
if (tags === undefined || noCache) {
const comments = getJSDocCommentsAndTags(node, noCache);
Debug.assert(comments.length < 2 || comments[0] !== comments[1]);
tags = flatMap(comments, j => isJSDoc(j) ? j.tags : j);
if (!noCache) {
node.jsDocCache = tags;
node.jsDoc ??= [];
node.jsDoc.jsDocCache = tags;
}
}
return tags;
@@ -1475,12 +1490,12 @@ export function isStringTextContainingNode(node: Node): node is StringLiteral |
/** @internal */
export function isGeneratedIdentifier(node: Node): node is GeneratedIdentifier {
return isIdentifier(node) && node.autoGenerate !== undefined;
return isIdentifier(node) && node.emitNode?.autoGenerate !== undefined;
}
/** @internal */
export function isGeneratedPrivateIdentifier(node: Node): node is GeneratedPrivateIdentifier {
return isPrivateIdentifier(node) && node.autoGenerate !== undefined;
return isPrivateIdentifier(node) && node.emitNode?.autoGenerate !== undefined;
}
// Private Identifiers
+2 -9
View File
@@ -7,6 +7,7 @@ import {
FunctionBody,
getEmitFlags,
getEmitScriptTarget,
HasChildren,
Identifier,
isArray,
isArrayBindingElement,
@@ -80,7 +81,6 @@ import {
isToken,
isTypeElement,
isTypeNode,
isTypeNodeOrTypeParameterDeclaration,
isTypeParameterDeclaration,
isVariableDeclaration,
isVariableDeclarationList,
@@ -99,7 +99,6 @@ import {
Statement,
SyntaxKind,
TransformationContext,
VisitEachChildNodes,
Visitor,
} from "./_namespaces/ts";
@@ -513,23 +512,17 @@ type VisitEachChildFunction<T extends Node> = (node: T, visitor: Visitor, contex
// This looks something like:
//
// {
// [SyntaxKind.Identifier]: VisitEachChildFunction<Identifier>;
// [SyntaxKind.QualifiedName]: VisitEachChildFunction<QualifiedName>;
// [SyntaxKind.ComputedPropertyName]: VisitEachChildFunction<ComputedPropertyName>;
// ...
// }
//
// This is then used as the expected type for `visitEachChildTable`.
type VisitEachChildTable = { [TNode in VisitEachChildNodes as TNode["kind"]]: VisitEachChildFunction<TNode> };
type VisitEachChildTable = { [TNode in HasChildren as TNode["kind"]]: VisitEachChildFunction<TNode> };
// NOTE: Before you can add a new method to `visitEachChildTable`, you must first ensure the `Node` subtype you
// wish to add is defined in the `HasChildren` union in types.ts.
const visitEachChildTable: VisitEachChildTable = {
[SyntaxKind.Identifier]: function visitEachChildOfIdentifier(node, visitor, context, nodesVisitor, _nodeVisitor, _tokenVisitor) {
return context.factory.updateIdentifier(node,
nodesVisitor(node.typeArguments, visitor, isTypeNodeOrTypeParameterDeclaration));
},
[SyntaxKind.QualifiedName]: function visitEachChildOfQualifiedName(node, visitor, context, _nodesVisitor, nodeVisitor, _tokenVisitor) {
return context.factory.updateQualifiedName(node,
nodeVisitor(node.left, visitor, isEntityName),
@@ -988,7 +988,7 @@ export const createToken = deprecate(function createToken<TKind extends SyntaxKi
/** @deprecated Use `factory.createIdentifier` or the factory supplied by your transformation context instead. */
export const createIdentifier = deprecate(function createIdentifier(text: string) {
return factory.createIdentifier(text, /*typeArguments*/ undefined, /*originalKeywordKind*/ undefined);
return factory.createIdentifier(text, /*originalKeywordKind*/ undefined);
}, factoryDeprecation);
/** @deprecated Use `factory.createTempVariable` or the factory supplied by your transformation context instead. */
@@ -0,0 +1,51 @@
import {
addObjectAllocatorPatcher,
hasProperty,
Identifier,
identifierToKeywordKind,
NodeFlags,
} from "../_namespaces/ts";
import { deprecate } from "../deprecate";
declare module "../../compiler/types" {
export interface Identifier {
/** @deprecated Use `idKeyword(identifier)` instead. */
readonly originalKeywordKind?: SyntaxKind;
/** @deprecated Use `.parent` or the surrounding context to determine this instead. */
readonly isInJSDocNamespace?: boolean;
}
}
addObjectAllocatorPatcher(objectAllocator => {
const Identifier = objectAllocator.getIdentifierConstructor();
if (!hasProperty(Identifier.prototype, "originalKeywordKind")) {
Object.defineProperty(Identifier.prototype, "originalKeywordKind", {
get: deprecate(function (this: Identifier) {
return identifierToKeywordKind(this);
}, {
name: "originalKeywordKind",
since: "5.0",
warnAfter: "5.1",
errorAfter: "5.2",
message: "Use 'identifierToKeywordKind(identifier)' instead."
})
});
}
if (!hasProperty(Identifier.prototype, "isInJSDocNamespace")) {
Object.defineProperty(Identifier.prototype, "isInJSDocNamespace", {
get: deprecate(function (this: Identifier) {
// NOTE: Returns `true` or `undefined` to match previous possible values.
return this.flags & NodeFlags.IdentifierIsInJSDocNamespace ? true : undefined;
}, {
name: "isInJSDocNamespace",
since: "5.0",
warnAfter: "5.1",
errorAfter: "5.2",
message: "Use '.parent' or the surrounding context to determine this instead."
})
});
}
});
+1
View File
@@ -9,3 +9,4 @@ export * from "../4.2/abstractConstructorTypes";
export * from "../4.6/importTypeAssertions";
export * from "../4.7/typeParameterModifiers";
export * from "../4.8/mergeDecoratorsAndModifiers";
export * from "../5.0/identifierProperties";
+1 -1
View File
@@ -52,7 +52,7 @@ export function createDeprecation(name: string, options: DeprecationOptions = {}
const errorAfter = typeof options.errorAfter === "string" ? new Version(options.errorAfter) : options.errorAfter;
const warnAfter = typeof options.warnAfter === "string" ? new Version(options.warnAfter) : options.warnAfter;
const since = typeof options.since === "string" ? new Version(options.since) : options.since ?? warnAfter;
const error = options.error || errorAfter && version.compareTo(errorAfter) <= 0;
const error = options.error || errorAfter && version.compareTo(errorAfter) >= 0;
const warn = !warnAfter || version.compareTo(warnAfter) >= 0;
return error ? createErrorDeprecation(name, errorAfter, since, options.message) :
warn ? createWarningDeprecation(name, errorAfter, since, options.message) :
+9 -3
View File
@@ -189,7 +189,7 @@ export function sourceFileToJSON(file: ts.Node): string {
o.containsParseError = true;
}
for (const propertyName of Object.getOwnPropertyNames(n) as readonly (keyof ts.SourceFile | keyof ts.Identifier)[]) {
for (const propertyName of Object.getOwnPropertyNames(n) as readonly (keyof ts.SourceFile | keyof ts.Identifier | keyof ts.StringLiteral)[]) {
switch (propertyName) {
case "parent":
case "symbol":
@@ -201,7 +201,7 @@ export function sourceFileToJSON(file: ts.Node): string {
case "symbolCount":
case "identifierCount":
case "scriptSnapshot":
case "autoGenerate":
case "emitNode":
// Blocklist of items we never put in the baseline file.
break;
@@ -219,7 +219,13 @@ export function sourceFileToJSON(file: ts.Node): string {
// Clear the flags that are produced by aggregating child values. That is ephemeral
// data we don't care about in the dump. We only care what the parser set directly
// on the AST.
const flags = n.flags & ~(ts.NodeFlags.JavaScriptFile | ts.NodeFlags.HasAggregatedChildData);
let flags = n.flags & ~(ts.NodeFlags.JavaScriptFile | ts.NodeFlags.HasAggregatedChildData);
if (ts.isIdentifier(n)) {
if (flags & ts.NodeFlags.IdentifierHasExtendedUnicodeEscape) {
o.hasExtendedUnicodeEscape = true;
flags &= ~ts.NodeFlags.IdentifierHasExtendedUnicodeEscape;
}
}
if (flags) {
o[propertyName] = getNodeFlagName(flags);
}
+3 -3
View File
@@ -50,7 +50,7 @@ import {
isExportsOrModuleExportsOrAlias,
isFunctionExpression,
isIdentifier,
isNonContextualKeyword,
isIdentifierANonContextualKeyword,
isObjectLiteralExpression,
isPropertyAccessExpression,
isRequireCall,
@@ -161,8 +161,8 @@ type ExportRenames = ReadonlyMap<string, string>;
function collectExportRenames(sourceFile: SourceFile, checker: TypeChecker, identifiers: Identifiers): ExportRenames {
const res = new Map<string, string>();
forEachExportReference(sourceFile, node => {
const { text, originalKeywordKind } = node.name;
if (!res.has(text) && (originalKeywordKind !== undefined && isNonContextualKeyword(originalKeywordKind)
const { text } = node.name;
if (!res.has(text) && (isIdentifierANonContextualKeyword(node.name)
|| checker.resolveName(text, node, SymbolFlags.Value, /*excludeGlobals*/ true))) {
// Unconditionally add an underscore in case `text` is a keyword.
res.set(text, makeUniqueName(`_${text}`, identifiers));
+10 -6
View File
@@ -107,6 +107,7 @@ import {
hasInitializer,
hasType,
Identifier,
identifierToKeywordKind,
ImportDeclaration,
ImportEqualsDeclaration,
ImportKind,
@@ -1690,8 +1691,11 @@ function isModifierLike(node: Node): ModifierSyntaxKind | undefined {
if (isModifier(node)) {
return node.kind;
}
if (isIdentifier(node) && node.originalKeywordKind && isModifierKind(node.originalKeywordKind)) {
return node.originalKeywordKind;
if (isIdentifier(node)) {
const originalKeywordKind = identifierToKeywordKind(node);
if (originalKeywordKind && isModifierKind(originalKeywordKind)) {
return originalKeywordKind;
}
}
return undefined;
}
@@ -4722,7 +4726,7 @@ function isFunctionLikeBodyKeyword(kind: SyntaxKind) {
}
function keywordForNode(node: Node): SyntaxKind {
return isIdentifier(node) ? node.originalKeywordKind || SyntaxKind.Unknown : node.kind;
return isIdentifier(node) ? identifierToKeywordKind(node) ?? SyntaxKind.Unknown : node.kind;
}
function getContextualKeywords(
@@ -4826,8 +4830,8 @@ function tryGetObjectTypeDeclarationCompletionContainer(sourceFile: SourceFile,
}
break;
case SyntaxKind.Identifier: {
const originalKeywordKind = (location as Identifier).originalKeywordKind;
if (originalKeywordKind && isKeyword(originalKeywordKind)) {
const originalKeywordKind = identifierToKeywordKind(location as Identifier);
if (originalKeywordKind) {
return undefined;
}
// class c { public prop = c| }
@@ -4872,7 +4876,7 @@ function tryGetObjectTypeDeclarationCompletionContainer(sourceFile: SourceFile,
return undefined;
}
const isValidKeyword = isClassLike(contextToken.parent.parent) ? isClassMemberCompletionKeyword : isInterfaceOrTypeLiteralCompletionKeyword;
return (isValidKeyword(contextToken.kind) || contextToken.kind === SyntaxKind.AsteriskToken || isIdentifier(contextToken) && isValidKeyword(stringToToken(contextToken.text)!)) // TODO: GH#18217
return (isValidKeyword(contextToken.kind) || contextToken.kind === SyntaxKind.AsteriskToken || isIdentifier(contextToken) && isValidKeyword(identifierToKeywordKind(contextToken) ?? SyntaxKind.Unknown))
? contextToken.parent.parent as ObjectTypeDeclaration : undefined;
}
}
+2 -2
View File
@@ -1940,8 +1940,8 @@ export namespace Core {
// For `export { foo as bar }`, rename `foo`, but not `bar`.
if (!isForRenameWithPrefixAndSuffixText(state.options) || alwaysGetReferences) {
const isDefaultExport = referenceLocation.originalKeywordKind === SyntaxKind.DefaultKeyword
|| exportSpecifier.name.originalKeywordKind === SyntaxKind.DefaultKeyword;
const isDefaultExport = referenceLocation.escapedText === "default"
|| exportSpecifier.name.escapedText === "default";
const exportKind = isDefaultExport ? ExportKind.Default : ExportKind.Named;
const exportSymbol = Debug.checkDefined(exportSpecifier.symbol);
const exportInfo = getExportInfo(exportSymbol, exportKind, state.checker);
+2 -2
View File
@@ -61,6 +61,7 @@ import {
hasEffectiveModifier,
hasSyntacticModifier,
Identifier,
identifierToKeywordKind,
isArray,
isArrowFunction,
isAssignmentExpression,
@@ -87,7 +88,6 @@ import {
isJsxElement,
isJsxFragment,
isJsxSelfClosingElement,
isKeyword,
isModuleBlock,
isParenthesizedTypeNode,
isPartOfTypeNode,
@@ -1351,7 +1351,7 @@ function extractConstantInScope(
// Make a unique name for the extracted variable
const file = scope.getSourceFile();
const localNameText = isPropertyAccessExpression(node) && !isClassLike(scope) && !checker.resolveName(node.name.text, node, SymbolFlags.Value, /*excludeGlobals*/ false) && !isPrivateIdentifier(node.name) && !isKeyword(node.name.originalKeywordKind!)
const localNameText = isPropertyAccessExpression(node) && !isClassLike(scope) && !checker.resolveName(node.name.text, node, SymbolFlags.Value, /*excludeGlobals*/ false) && !isPrivateIdentifier(node.name) && !identifierToKeywordKind(node.name)
? node.name.text
: getUniqueName(isClassLike(scope) ? "newProperty" : "newLocal", file);
const isJS = isInJSFile(scope);
+1 -1
View File
@@ -97,7 +97,7 @@ function getRenameInfoForNode(
}
// Cannot rename `default` as in `import { default as foo } from "./someModule";
if (isIdentifier(node) && node.originalKeywordKind === SyntaxKind.DefaultKeyword && symbol.parent && symbol.parent.flags & SymbolFlags.Module) {
if (isIdentifier(node) && node.escapedText === "default" && symbol.parent && symbol.parent.flags & SymbolFlags.Module) {
return undefined;
}
-3
View File
@@ -6,7 +6,6 @@ import {
ApplicableRefactorInfo,
ApplyCodeActionCommandResult,
AssignmentDeclarationKind,
AutoGenerateInfo,
BaseType,
BinaryExpression,
BreakpointResolver,
@@ -734,7 +733,6 @@ class TokenObject<TKind extends SyntaxKind> extends TokenOrIdentifierObject impl
class IdentifierObject extends TokenOrIdentifierObject implements Identifier {
public kind: SyntaxKind.Identifier = SyntaxKind.Identifier;
public escapedText!: __String;
public autoGenerate: AutoGenerateInfo | undefined;
declare _primaryExpressionBrand: any;
declare _memberExpressionBrand: any;
declare _leftHandSideExpressionBrand: any;
@@ -757,7 +755,6 @@ IdentifierObject.prototype.kind = SyntaxKind.Identifier;
class PrivateIdentifierObject extends TokenOrIdentifierObject implements PrivateIdentifier {
public kind: SyntaxKind.PrivateIdentifier = SyntaxKind.PrivateIdentifier;
public escapedText!: __String;
public autoGenerate: AutoGenerateInfo | undefined;
declare _primaryExpressionBrand: any;
declare _memberExpressionBrand: any;
declare _leftHandSideExpressionBrand: any;
-1
View File
@@ -1147,7 +1147,6 @@ function updateJSDocHost(parent: HasJSDoc): HasJSDoc {
parent.parent as HasJSDoc :
parent.parent.parent as HasJSDoc;
jsDocNode.jsDoc = parent.jsDoc;
jsDocNode.jsDocCache = parent.jsDocCache;
return jsDocNode;
}
@@ -27,7 +27,6 @@
"end": 18,
"modifierFlagsCache": 0,
"transformFlags": 0,
"originalKeywordKind": "ThisKeyword",
"escapedText": "this"
},
"isNameFirst": true,
@@ -18,7 +18,6 @@
"end": 13,
"modifierFlagsCache": 0,
"transformFlags": 0,
"originalKeywordKind": "TypeKeyword",
"escapedText": "type"
},
"typeExpression": {
@@ -27,7 +27,6 @@
"end": 18,
"modifierFlagsCache": 0,
"transformFlags": 0,
"originalKeywordKind": "ThisKeyword",
"escapedText": "this"
},
"isNameFirst": true,
@@ -18,7 +18,6 @@
"end": 13,
"modifierFlagsCache": 0,
"transformFlags": 0,
"originalKeywordKind": "TypeKeyword",
"escapedText": "type"
},
"typeExpression": {
@@ -18,7 +18,6 @@
"end": 15,
"modifierFlagsCache": 0,
"transformFlags": 0,
"originalKeywordKind": "ReturnKeyword",
"escapedText": "return"
}
},
@@ -18,7 +18,6 @@
"end": 15,
"modifierFlagsCache": 0,
"transformFlags": 0,
"originalKeywordKind": "ReturnKeyword",
"escapedText": "return"
},
"typeExpression": {
@@ -18,7 +18,6 @@
"end": 15,
"modifierFlagsCache": 0,
"transformFlags": 0,
"originalKeywordKind": "ReturnKeyword",
"escapedText": "return"
},
"comment": "Description text follows",
@@ -18,7 +18,6 @@
"end": 13,
"modifierFlagsCache": 0,
"transformFlags": 0,
"originalKeywordKind": "TypeKeyword",
"escapedText": "type"
},
"typeExpression": {
@@ -12,7 +12,6 @@
"flags": "JSDoc",
"modifierFlagsCache": 0,
"transformFlags": 0,
"originalKeywordKind": "VarKeyword",
"escapedText": "var"
}
}
@@ -20,7 +20,6 @@
"flags": "JSDoc",
"modifierFlagsCache": 0,
"transformFlags": 0,
"originalKeywordKind": "NewKeyword",
"escapedText": "new"
},
"type": {
@@ -20,7 +20,6 @@
"flags": "JSDoc",
"modifierFlagsCache": 0,
"transformFlags": 0,
"originalKeywordKind": "FunctionKeyword",
"escapedText": "function"
}
},
@@ -20,7 +20,6 @@
"flags": "JSDoc",
"modifierFlagsCache": 0,
"transformFlags": 0,
"originalKeywordKind": "ThisKeyword",
"escapedText": "this"
},
"type": {
@@ -12,8 +12,7 @@
"flags": "JSDoc",
"modifierFlagsCache": 0,
"transformFlags": 0,
"escapedText": "a",
"jsdocDotPos": 2
"escapedText": "a"
},
"typeArguments": {
"0": {
@@ -12,8 +12,7 @@
"flags": "JSDoc",
"modifierFlagsCache": 0,
"transformFlags": 0,
"escapedText": "a",
"jsdocDotPos": 2
"escapedText": "a"
},
"typeArguments": {
"0": {
@@ -28,7 +28,6 @@
"flags": "JSDoc",
"modifierFlagsCache": 0,
"transformFlags": 0,
"originalKeywordKind": "FunctionKeyword",
"escapedText": "function"
}
}
+11 -2
View File
@@ -4584,12 +4584,16 @@ declare namespace ts {
* Text of identifier, but if the identifier begins with two underscores, this will begin with three.
*/
readonly escapedText: __String;
readonly originalKeywordKind?: SyntaxKind;
isInJSDocNamespace?: boolean;
}
interface Identifier {
readonly text: string;
}
interface Identifier {
/** @deprecated Use `idKeyword(identifier)` instead. */
readonly originalKeywordKind?: SyntaxKind;
/** @deprecated Use `.parent` or the surrounding context to determine this instead. */
readonly isInJSDocNamespace?: boolean;
}
interface TransientIdentifier extends Identifier {
resolvedSymbol: Symbol;
}
@@ -8599,6 +8603,11 @@ declare namespace ts {
*/
function unescapeLeadingUnderscores(identifier: __String): string;
function idText(identifierOrPrivateName: Identifier | PrivateIdentifier): string;
/**
* If the text of an Identifier matches a keyword (including contextual and TypeScript-specific keywords), returns the
* SyntaxKind for the matching keyword.
*/
function identifierToKeywordKind(node: Identifier): KeywordSyntaxKind | undefined;
function symbolName(symbol: Symbol): string;
function getNameOfJSDocTypedef(declaration: JSDocTypedefTag): Identifier | PrivateIdentifier | undefined;
function getNameOfDeclaration(declaration: Declaration | Expression | undefined): DeclarationName | undefined;
+11 -2
View File
@@ -649,12 +649,16 @@ declare namespace ts {
* Text of identifier, but if the identifier begins with two underscores, this will begin with three.
*/
readonly escapedText: __String;
readonly originalKeywordKind?: SyntaxKind;
isInJSDocNamespace?: boolean;
}
interface Identifier {
readonly text: string;
}
interface Identifier {
/** @deprecated Use `idKeyword(identifier)` instead. */
readonly originalKeywordKind?: SyntaxKind;
/** @deprecated Use `.parent` or the surrounding context to determine this instead. */
readonly isInJSDocNamespace?: boolean;
}
interface TransientIdentifier extends Identifier {
resolvedSymbol: Symbol;
}
@@ -4664,6 +4668,11 @@ declare namespace ts {
*/
function unescapeLeadingUnderscores(identifier: __String): string;
function idText(identifierOrPrivateName: Identifier | PrivateIdentifier): string;
/**
* If the text of an Identifier matches a keyword (including contextual and TypeScript-specific keywords), returns the
* SyntaxKind for the matching keyword.
*/
function identifierToKeywordKind(node: Identifier): KeywordSyntaxKind | undefined;
function symbolName(symbol: Symbol): string;
function getNameOfJSDocTypedef(declaration: JSDocTypedefTag): Identifier | PrivateIdentifier | undefined;
function getNameOfDeclaration(declaration: Declaration | Expression | undefined): DeclarationName | undefined;