Skip to content

Commit 5f79e16

Browse files
Armando AguirreArmando Aguirre Sepulveda
Armando Aguirre
and
Armando Aguirre Sepulveda
authored
Refactored node builder flags and tests (#59440)
Co-authored-by: Armando Aguirre Sepulveda <[email protected]>
1 parent aa8a2c0 commit 5f79e16

14 files changed

+156
-120
lines changed

src/compiler/checker.ts

Lines changed: 83 additions & 67 deletions
Large diffs are not rendered by default.

src/compiler/transformers/declarations.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ import {
8787
ImportTypeNode,
8888
IndexSignatureDeclaration,
8989
InterfaceDeclaration,
90+
InternalNodeBuilderFlags,
9091
isAmbientModule,
9192
isArray,
9293
isArrayBindingElement,
@@ -239,10 +240,11 @@ const declarationEmitNodeBuilderFlags = NodeBuilderFlags.MultilineObjectLiterals
239240
NodeBuilderFlags.UseTypeOfFunction |
240241
NodeBuilderFlags.UseStructuralFallback |
241242
NodeBuilderFlags.AllowEmptyTuple |
242-
NodeBuilderFlags.AllowUnresolvedNames |
243243
NodeBuilderFlags.GenerateNamesForShadowedTypeParams |
244244
NodeBuilderFlags.NoTruncation;
245245

246+
const declarationEmitInternalNodeBuilderFlags = InternalNodeBuilderFlags.AllowUnresolvedNames;
247+
246248
/**
247249
* Transforms a ts file into a .d.ts file
248250
* This process requires type information, which is retrieved through the emit resolver. Because of this,
@@ -429,7 +431,7 @@ export function transformDeclarations(context: TransformationContext) {
429431
: Diagnostics.Declaration_emit_for_this_file_requires_using_private_name_0_An_explicit_type_annotation_may_unblock_declaration_emit,
430432
errorNode: s.errorNode || sourceFile,
431433
}));
432-
const result = resolver.getDeclarationStatementsForSourceFile(sourceFile, declarationEmitNodeBuilderFlags, symbolTracker);
434+
const result = resolver.getDeclarationStatementsForSourceFile(sourceFile, declarationEmitNodeBuilderFlags, declarationEmitInternalNodeBuilderFlags, symbolTracker);
433435
getSymbolAccessibilityDiagnostic = oldDiag;
434436
return result;
435437
}
@@ -696,15 +698,15 @@ export function transformDeclarations(context: TransformationContext) {
696698
case SyntaxKind.PropertyDeclaration:
697699
case SyntaxKind.BindingElement:
698700
case SyntaxKind.VariableDeclaration:
699-
typeNode = resolver.createTypeOfDeclaration(node, enclosingDeclaration, declarationEmitNodeBuilderFlags, symbolTracker);
701+
typeNode = resolver.createTypeOfDeclaration(node, enclosingDeclaration, declarationEmitNodeBuilderFlags, declarationEmitInternalNodeBuilderFlags, symbolTracker);
700702
break;
701703
case SyntaxKind.FunctionDeclaration:
702704
case SyntaxKind.ConstructSignature:
703705
case SyntaxKind.MethodSignature:
704706
case SyntaxKind.MethodDeclaration:
705707
case SyntaxKind.GetAccessor:
706708
case SyntaxKind.CallSignature:
707-
typeNode = resolver.createReturnTypeOfSignatureDeclaration(node, enclosingDeclaration, declarationEmitNodeBuilderFlags, symbolTracker);
709+
typeNode = resolver.createReturnTypeOfSignatureDeclaration(node, enclosingDeclaration, declarationEmitNodeBuilderFlags, declarationEmitInternalNodeBuilderFlags, symbolTracker);
708710
break;
709711
default:
710712
Debug.assertNever(node);
@@ -1329,7 +1331,7 @@ export function transformDeclarations(context: TransformationContext) {
13291331
errorNode: input,
13301332
});
13311333
errorFallbackNode = input;
1332-
const varDecl = factory.createVariableDeclaration(newId, /*exclamationToken*/ undefined, resolver.createTypeOfExpression(input.expression, input, declarationEmitNodeBuilderFlags, symbolTracker), /*initializer*/ undefined);
1334+
const varDecl = factory.createVariableDeclaration(newId, /*exclamationToken*/ undefined, resolver.createTypeOfExpression(input.expression, input, declarationEmitNodeBuilderFlags, declarationEmitInternalNodeBuilderFlags, symbolTracker), /*initializer*/ undefined);
13331335
errorFallbackNode = undefined;
13341336
const statement = factory.createVariableStatement(needsDeclare ? [factory.createModifier(SyntaxKind.DeclareKeyword)] : [], factory.createVariableDeclarationList([varDecl], NodeFlags.Const));
13351337

@@ -1471,7 +1473,7 @@ export function transformDeclarations(context: TransformationContext) {
14711473
return undefined; // unique symbol or non-identifier name - omit, since there's no syntax that can preserve it
14721474
}
14731475
getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(p.valueDeclaration);
1474-
const type = resolver.createTypeOfDeclaration(p.valueDeclaration, fakespace, declarationEmitNodeBuilderFlags | NodeBuilderFlags.NoSyntacticPrinter, symbolTracker);
1476+
const type = resolver.createTypeOfDeclaration(p.valueDeclaration, fakespace, declarationEmitNodeBuilderFlags, declarationEmitInternalNodeBuilderFlags | InternalNodeBuilderFlags.NoSyntacticPrinter, symbolTracker);
14751477
getSymbolAccessibilityDiagnostic = oldDiag;
14761478
const isNonContextualKeywordName = isStringANonContextualKeyword(nameStr);
14771479
const name = isNonContextualKeywordName ? factory.getGeneratedNameForNode(p.valueDeclaration) : factory.createIdentifier(nameStr);
@@ -1666,7 +1668,7 @@ export function transformDeclarations(context: TransformationContext) {
16661668
errorNode: extendsClause,
16671669
typeName: input.name,
16681670
});
1669-
const varDecl = factory.createVariableDeclaration(newId, /*exclamationToken*/ undefined, resolver.createTypeOfExpression(extendsClause.expression, input, declarationEmitNodeBuilderFlags, symbolTracker), /*initializer*/ undefined);
1671+
const varDecl = factory.createVariableDeclaration(newId, /*exclamationToken*/ undefined, resolver.createTypeOfExpression(extendsClause.expression, input, declarationEmitNodeBuilderFlags, declarationEmitInternalNodeBuilderFlags, symbolTracker), /*initializer*/ undefined);
16701672
const statement = factory.createVariableStatement(needsDeclare ? [factory.createModifier(SyntaxKind.DeclareKeyword)] : [], factory.createVariableDeclarationList([varDecl], NodeFlags.Const));
16711673
const heritageClauses = factory.createNodeArray(map(input.heritageClauses, clause => {
16721674
if (clause.token === SyntaxKind.ExtendsKeyword) {

src/compiler/types.ts

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5073,14 +5073,14 @@ export interface TypeChecker {
50735073
// TODO: GH#18217 `xToDeclaration` calls are frequently asserted as defined.
50745074
/** Note that the resulting nodes cannot be checked. */
50755075
typeToTypeNode(type: Type, enclosingDeclaration: Node | undefined, flags: NodeBuilderFlags | undefined): TypeNode | undefined;
5076-
/** @internal */ typeToTypeNode(type: Type, enclosingDeclaration: Node | undefined, flags: NodeBuilderFlags | undefined, tracker?: SymbolTracker): TypeNode | undefined; // eslint-disable-line @typescript-eslint/unified-signatures
5077-
/** @internal */ typePredicateToTypePredicateNode(typePredicate: TypePredicate, enclosingDeclaration: Node | undefined, flags: NodeBuilderFlags | undefined, tracker?: SymbolTracker): TypePredicateNode | undefined;
5076+
/** @internal */ typeToTypeNode(type: Type, enclosingDeclaration: Node | undefined, flags: NodeBuilderFlags | undefined, internalFlags?: InternalNodeBuilderFlags | undefined, tracker?: SymbolTracker): TypeNode | undefined; // eslint-disable-line @typescript-eslint/unified-signatures
5077+
/** @internal */ typePredicateToTypePredicateNode(typePredicate: TypePredicate, enclosingDeclaration: Node | undefined, flags: NodeBuilderFlags | undefined, internalFlags?: InternalNodeBuilderFlags | undefined, tracker?: SymbolTracker): TypePredicateNode | undefined;
50785078
/** Note that the resulting nodes cannot be checked. */
50795079
signatureToSignatureDeclaration(signature: Signature, kind: SyntaxKind, enclosingDeclaration: Node | undefined, flags: NodeBuilderFlags | undefined): SignatureDeclaration & { typeArguments?: NodeArray<TypeNode>; } | undefined;
5080-
/** @internal */ signatureToSignatureDeclaration(signature: Signature, kind: SyntaxKind, enclosingDeclaration: Node | undefined, flags: NodeBuilderFlags | undefined, tracker?: SymbolTracker): SignatureDeclaration & { typeArguments?: NodeArray<TypeNode>; } | undefined; // eslint-disable-line @typescript-eslint/unified-signatures
5080+
/** @internal */ signatureToSignatureDeclaration(signature: Signature, kind: SyntaxKind, enclosingDeclaration: Node | undefined, flags: NodeBuilderFlags | undefined, internalFlags?: InternalNodeBuilderFlags | undefined, tracker?: SymbolTracker): SignatureDeclaration & { typeArguments?: NodeArray<TypeNode>; } | undefined; // eslint-disable-line @typescript-eslint/unified-signatures
50815081
/** Note that the resulting nodes cannot be checked. */
50825082
indexInfoToIndexSignatureDeclaration(indexInfo: IndexInfo, enclosingDeclaration: Node | undefined, flags: NodeBuilderFlags | undefined): IndexSignatureDeclaration | undefined;
5083-
/** @internal */ indexInfoToIndexSignatureDeclaration(indexInfo: IndexInfo, enclosingDeclaration: Node | undefined, flags: NodeBuilderFlags | undefined, tracker?: SymbolTracker): IndexSignatureDeclaration | undefined; // eslint-disable-line @typescript-eslint/unified-signatures
5083+
/** @internal */ indexInfoToIndexSignatureDeclaration(indexInfo: IndexInfo, enclosingDeclaration: Node | undefined, flags: NodeBuilderFlags | undefined, internalFlags?: InternalNodeBuilderFlags | undefined, tracker?: SymbolTracker): IndexSignatureDeclaration | undefined; // eslint-disable-line @typescript-eslint/unified-signatures
50845084
/** Note that the resulting nodes cannot be checked. */
50855085
symbolToEntityName(symbol: Symbol, meaning: SymbolFlags, enclosingDeclaration: Node | undefined, flags: NodeBuilderFlags | undefined): EntityName | undefined;
50865086
/** Note that the resulting nodes cannot be checked. */
@@ -5090,7 +5090,7 @@ export interface TypeChecker {
50905090
*
50915091
* @internal
50925092
*/
5093-
symbolToNode(symbol: Symbol, meaning: SymbolFlags, enclosingDeclaration: Node | undefined, flags: NodeBuilderFlags | undefined): Node | undefined;
5093+
symbolToNode(symbol: Symbol, meaning: SymbolFlags, enclosingDeclaration: Node | undefined, flags: NodeBuilderFlags | undefined, internalFlags: InternalNodeBuilderFlags | undefined): Node | undefined;
50945094
/** Note that the resulting nodes cannot be checked. */
50955095
symbolToTypeParameterDeclarations(symbol: Symbol, enclosingDeclaration: Node | undefined, flags: NodeBuilderFlags | undefined): NodeArray<TypeParameterDeclaration> | undefined;
50965096
/** Note that the resulting nodes cannot be checked. */
@@ -5459,12 +5459,9 @@ export const enum NodeBuilderFlags {
54595459
AllowEmptyTuple = 1 << 19,
54605460
AllowUniqueESSymbolType = 1 << 20,
54615461
AllowEmptyIndexInfoType = 1 << 21,
5462-
/** @internal */ WriteComputedProps = 1 << 30, // { [E.A]: 1 }
5463-
/** @internal */ NoSyntacticPrinter = 1 << 31,
54645462
// Errors (cont.)
54655463
AllowNodeModulesRelativePaths = 1 << 26,
5466-
/** @internal */ DoNotIncludeSymbolChain = 1 << 27, // Skip looking up and printing an accessible symbol chain
5467-
/** @internal */ AllowUnresolvedNames = 1 << 32,
5464+
54685465

54695466
IgnoreErrors = AllowThisInObjectLiteral | AllowQualifiedNameInPlaceOfIdentifier | AllowAnonymousIdentifier | AllowEmptyUnionOrIntersection | AllowEmptyTuple | AllowEmptyIndexInfoType | AllowNodeModulesRelativePaths,
54705467

@@ -5474,6 +5471,16 @@ export const enum NodeBuilderFlags {
54745471
InInitialEntityName = 1 << 24, // Set when writing the LHS of an entity name or entity name expression
54755472
}
54765473

5474+
/** @internal */
5475+
// dprint-ignore
5476+
export const enum InternalNodeBuilderFlags {
5477+
None = 0,
5478+
WriteComputedProps = 1 << 0, // { [E.A]: 1 }
5479+
NoSyntacticPrinter = 1 << 1,
5480+
DoNotIncludeSymbolChain = 1 << 2, // Skip looking up and printing an accessible symbol chain
5481+
AllowUnresolvedNames = 1 << 3,
5482+
}
5483+
54775484
// Ensure the shared flags between this and `NodeBuilderFlags` stay in alignment
54785485
// dprint-ignore
54795486
export const enum TypeFormatFlags {
@@ -5810,9 +5817,9 @@ export interface EmitResolver {
58105817
requiresAddingImplicitUndefined(node: ParameterDeclaration): boolean;
58115818
isExpandoFunctionDeclaration(node: FunctionDeclaration | VariableDeclaration): boolean;
58125819
getPropertiesOfContainerFunction(node: Declaration): Symbol[];
5813-
createTypeOfDeclaration(declaration: AccessorDeclaration | VariableLikeDeclaration | PropertyAccessExpression | ElementAccessExpression | BinaryExpression, enclosingDeclaration: Node, flags: NodeBuilderFlags, tracker: SymbolTracker): TypeNode | undefined;
5814-
createReturnTypeOfSignatureDeclaration(signatureDeclaration: SignatureDeclaration, enclosingDeclaration: Node, flags: NodeBuilderFlags, tracker: SymbolTracker): TypeNode | undefined;
5815-
createTypeOfExpression(expr: Expression, enclosingDeclaration: Node, flags: NodeBuilderFlags, tracker: SymbolTracker): TypeNode | undefined;
5820+
createTypeOfDeclaration(declaration: AccessorDeclaration | VariableLikeDeclaration | PropertyAccessExpression | ElementAccessExpression | BinaryExpression, enclosingDeclaration: Node, flags: NodeBuilderFlags, internalFlags: InternalNodeBuilderFlags, tracker: SymbolTracker): TypeNode | undefined;
5821+
createReturnTypeOfSignatureDeclaration(signatureDeclaration: SignatureDeclaration, enclosingDeclaration: Node, flags: NodeBuilderFlags, internalFlags: InternalNodeBuilderFlags, tracker: SymbolTracker): TypeNode | undefined;
5822+
createTypeOfExpression(expr: Expression, enclosingDeclaration: Node, flags: NodeBuilderFlags, internalFlags: InternalNodeBuilderFlags, tracker: SymbolTracker): TypeNode | undefined;
58165823
createLiteralConstValue(node: VariableDeclaration | PropertyDeclaration | PropertySignature | ParameterDeclaration, tracker: SymbolTracker): Expression;
58175824
isSymbolAccessible(symbol: Symbol, enclosingDeclaration: Node | undefined, meaning: SymbolFlags | undefined, shouldComputeAliasToMarkVisible: boolean): SymbolAccessibilityResult;
58185825
isEntityNameVisible(entityName: EntityNameOrEntityNameExpression, enclosingDeclaration: Node): SymbolVisibilityResult;
@@ -5829,7 +5836,7 @@ export interface EmitResolver {
58295836
getJsxFactoryEntity(location?: Node): EntityName | undefined;
58305837
getJsxFragmentFactoryEntity(location?: Node): EntityName | undefined;
58315838
isBindingCapturedByNode(node: Node, decl: VariableDeclaration | BindingElement): boolean;
5832-
getDeclarationStatementsForSourceFile(node: SourceFile, flags: NodeBuilderFlags, tracker: SymbolTracker): Statement[] | undefined;
5839+
getDeclarationStatementsForSourceFile(node: SourceFile, flags: NodeBuilderFlags, internalFlags: InternalNodeBuilderFlags, tracker: SymbolTracker): Statement[] | undefined;
58335840
isImportRequiredByAugmentation(decl: ImportDeclaration): boolean;
58345841
isDefinitelyReferenceToGlobalSymbolObject(node: Node): boolean;
58355842
}

src/harness/typeWriter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ export class TypeWriterWalker {
279279
}
280280
else {
281281
const typeFormatFlags = ts.TypeFormatFlags.NoTruncation | ts.TypeFormatFlags.AllowUniqueESSymbolType | ts.TypeFormatFlags.GenerateNamesForShadowedTypeParams;
282-
let typeNode = this.checker.typeToTypeNode(type, node.parent, (typeFormatFlags & ts.TypeFormatFlags.NodeBuilderFlagsMask) | ts.NodeBuilderFlags.IgnoreErrors)!;
282+
let typeNode = this.checker.typeToTypeNode(type, node.parent, (typeFormatFlags & ts.TypeFormatFlags.NodeBuilderFlagsMask) | ts.NodeBuilderFlags.IgnoreErrors, ts.InternalNodeBuilderFlags.AllowUnresolvedNames)!;
283283
if (ts.isIdentifier(node) && ts.isTypeAliasDeclaration(node.parent) && node.parent.name === node && ts.isIdentifier(typeNode) && ts.idText(typeNode) === ts.idText(node)) {
284284
// for a complex type alias `type T = ...`, showing "T : T" isn't very helpful for type tests. When the type produced is the same as
285285
// the name of the type alias, recreate the type string without reusing the alias name

src/services/codefixes/fixAddMissingConstraint.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ function addMissingConstraint(changes: textChanges.ChangeTracker, program: Progr
123123
const scriptTarget = getEmitScriptTarget(program.getCompilerOptions());
124124
const tracker = getNoopSymbolTrackerWithResolver({ program, host });
125125
const importAdder = createImportAdder(sourceFile, program, preferences, host);
126-
const typeNode = typeToAutoImportableTypeNode(checker, importAdder, constraint, /*contextNode*/ undefined, scriptTarget, /*flags*/ undefined, tracker);
126+
const typeNode = typeToAutoImportableTypeNode(checker, importAdder, constraint, /*contextNode*/ undefined, scriptTarget, /*flags*/ undefined, /*internalFlags*/ undefined, tracker);
127127
if (typeNode) {
128128
changes.replaceNode(sourceFile, declaration, factory.updateTypeParameterDeclaration(declaration, /*modifiers*/ undefined, declaration.name, typeNode, declaration.default));
129129
importAdder.writeFixes(changes);

src/services/codefixes/fixAddMissingMember.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ import {
5555
Identifier,
5656
idText,
5757
InterfaceDeclaration,
58+
InternalNodeBuilderFlags,
5859
isCallExpression,
5960
isClassLike,
6061
isComputedPropertyName,
@@ -493,11 +494,11 @@ function getTypeNode(checker: TypeChecker, node: ClassLikeDeclaration | Interfac
493494
const binaryExpression = token.parent.parent as BinaryExpression;
494495
const otherExpression = token.parent === binaryExpression.left ? binaryExpression.right : binaryExpression.left;
495496
const widenedType = checker.getWidenedType(checker.getBaseTypeOfLiteralType(checker.getTypeAtLocation(otherExpression)));
496-
typeNode = checker.typeToTypeNode(widenedType, node, NodeBuilderFlags.NoTruncation);
497+
typeNode = checker.typeToTypeNode(widenedType, node, NodeBuilderFlags.NoTruncation, InternalNodeBuilderFlags.AllowUnresolvedNames);
497498
}
498499
else {
499500
const contextualType = checker.getContextualType(token.parent as Expression);
500-
typeNode = contextualType ? checker.typeToTypeNode(contextualType, /*enclosingDeclaration*/ undefined, NodeBuilderFlags.NoTruncation) : undefined;
501+
typeNode = contextualType ? checker.typeToTypeNode(contextualType, /*enclosingDeclaration*/ undefined, NodeBuilderFlags.NoTruncation, InternalNodeBuilderFlags.AllowUnresolvedNames) : undefined;
501502
}
502503
return typeNode || factory.createKeywordTypeNode(SyntaxKind.AnyKeyword);
503504
}
@@ -775,7 +776,7 @@ function tryGetContainingMethodDeclaration(node: ClassLikeDeclaration | Interfac
775776

776777
function createPropertyNameFromSymbol(symbol: Symbol, target: ScriptTarget, quotePreference: QuotePreference, checker: TypeChecker) {
777778
if (isTransientSymbol(symbol)) {
778-
const prop = checker.symbolToNode(symbol, SymbolFlags.Value, /*enclosingDeclaration*/ undefined, NodeBuilderFlags.WriteComputedProps);
779+
const prop = checker.symbolToNode(symbol, SymbolFlags.Value, /*enclosingDeclaration*/ undefined, /*flags*/ undefined, InternalNodeBuilderFlags.WriteComputedProps);
779780
if (prop && isComputedPropertyName(prop)) return prop;
780781
}
781782
// We're using these nodes as property names in an object literal; no need to quote names when not needed.

src/services/codefixes/fixAddMissingParam.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import {
2626
getNameOfDeclaration,
2727
getSourceFileOfNode,
2828
getTokenAtPosition,
29+
InternalNodeBuilderFlags,
2930
isAccessExpression,
3031
isCallExpression,
3132
isIdentifier,
@@ -221,7 +222,7 @@ function tryGetName(node: FunctionLikeDeclaration) {
221222
}
222223

223224
function typeToTypeNode(checker: TypeChecker, type: Type, enclosingDeclaration: Node) {
224-
return checker.typeToTypeNode(checker.getWidenedType(type), enclosingDeclaration, NodeBuilderFlags.NoTruncation)
225+
return checker.typeToTypeNode(checker.getWidenedType(type), enclosingDeclaration, NodeBuilderFlags.NoTruncation, InternalNodeBuilderFlags.AllowUnresolvedNames)
225226
?? factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);
226227
}
227228

0 commit comments

Comments
 (0)