Skip to content

Commit d78452c

Browse files
committed
Merge branch 'main' into const-enum-value
2 parents 5637d02 + 97dc5f0 commit d78452c

File tree

209 files changed

+4753
-1537
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

209 files changed

+4753
-1537
lines changed

package-lock.json

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/compiler/checker.ts

Lines changed: 53 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -855,6 +855,7 @@ import {
855855
ModuleKind,
856856
ModuleResolutionKind,
857857
ModuleSpecifierResolutionHost,
858+
Mutable,
858859
NamedDeclaration,
859860
NamedExports,
860861
NamedImportsOrExports,
@@ -6469,6 +6470,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
64696470
typePredicateToTypePredicateNode: (typePredicate: TypePredicate, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) => withContext(enclosingDeclaration, flags, tracker, context => typePredicateToTypePredicateNodeHelper(typePredicate, context)),
64706471
expressionOrTypeToTypeNode: (expr: Expression | JsxAttributeValue | undefined, type: Type, addUndefined?: boolean, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) => withContext(enclosingDeclaration, flags, tracker, context => expressionOrTypeToTypeNode(context, expr, type, addUndefined)),
64716472
serializeTypeForDeclaration: (type: Type, symbol: Symbol, addUndefined?: boolean, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) => withContext(enclosingDeclaration, flags, tracker, context => serializeTypeForDeclaration(context, type, symbol, enclosingDeclaration, /*includePrivateSymbol*/ undefined, /*bundled*/ undefined, addUndefined)),
6473+
serializeReturnTypeForSignature: (signature: Signature, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) => withContext(enclosingDeclaration, flags, tracker, context => serializeReturnTypeForSignature(context, signature)),
64726474
indexInfoToIndexSignatureDeclaration: (indexInfo: IndexInfo, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) => withContext(enclosingDeclaration, flags, tracker, context => indexInfoToIndexSignatureDeclarationHelper(indexInfo, context, /*typeNode*/ undefined)),
64736475
signatureToSignatureDeclaration: (signature: Signature, kind: SignatureDeclaration["kind"], enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) => withContext(enclosingDeclaration, flags, tracker, context => signatureToSignatureDeclarationHelper(signature, kind, context)),
64746476
symbolToEntityName: (symbol: Symbol, meaning: SymbolFlags, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, tracker?: SymbolTracker) => withContext(enclosingDeclaration, flags, tracker, context => symbolToName(symbol, context, meaning, /*expectsIdentifier*/ false)),
@@ -7649,8 +7651,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
76497651
}
76507652

76517653
function signatureToSignatureDeclarationHelper(signature: Signature, kind: SignatureDeclaration["kind"], context: NodeBuilderContext, options?: SignatureToSignatureDeclarationOptions): SignatureDeclaration {
7652-
const suppressAny = context.flags & NodeBuilderFlags.SuppressAnyReturnType;
7653-
if (suppressAny) context.flags &= ~NodeBuilderFlags.SuppressAnyReturnType; // suppress only toplevel `any`s
7654+
const flags = context.flags;
7655+
context.flags &= ~NodeBuilderFlags.SuppressAnyReturnType; // SuppressAnyReturnType should only apply to the signature `return` position
76547656
context.approximateLength += 3; // Usually a signature contributes a few more characters than this, but 3 is the minimum
76557657
let typeParameters: TypeParameterDeclaration[] | undefined;
76567658
let typeArguments: TypeNode[] | undefined;
@@ -7780,21 +7782,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
77807782
if (thisParameter) {
77817783
parameters.unshift(thisParameter);
77827784
}
7785+
context.flags = flags;
7786+
7787+
const returnTypeNode = serializeReturnTypeForSignature(context, signature, options?.privateSymbolVisitor, options?.bundledImports);
77837788

7784-
let returnTypeNode: TypeNode | undefined;
7785-
const typePredicate = getTypePredicateOfSignature(signature);
7786-
if (typePredicate) {
7787-
returnTypeNode = typePredicateToTypePredicateNodeHelper(typePredicate, context);
7788-
}
7789-
else {
7790-
const returnType = getReturnTypeOfSignature(signature);
7791-
if (returnType && !(suppressAny && isTypeAny(returnType))) {
7792-
returnTypeNode = serializeReturnTypeForSignature(context, returnType, signature, options?.privateSymbolVisitor, options?.bundledImports);
7793-
}
7794-
else if (!suppressAny) {
7795-
returnTypeNode = factory.createKeywordTypeNode(SyntaxKind.AnyKeyword);
7796-
}
7797-
}
77987789
let modifiers = options?.modifiers;
77997790
if ((kind === SyntaxKind.ConstructorType) && signature.flags & SignatureFlags.Abstract) {
78007791
const flags = modifiersToFlags(modifiers);
@@ -8572,7 +8563,25 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
85728563
return false;
85738564
}
85748565

8575-
function serializeReturnTypeForSignature(context: NodeBuilderContext, type: Type, signature: Signature, includePrivateSymbol?: (s: Symbol) => void, bundled?: boolean) {
8566+
function serializeReturnTypeForSignature(context: NodeBuilderContext, signature: Signature, includePrivateSymbol?: (s: Symbol) => void, bundled?: boolean) {
8567+
const suppressAny = context.flags & NodeBuilderFlags.SuppressAnyReturnType;
8568+
const flags = context.flags;
8569+
if (suppressAny) context.flags &= ~NodeBuilderFlags.SuppressAnyReturnType; // suppress only toplevel `any`s
8570+
let returnTypeNode: TypeNode | undefined;
8571+
const returnType = getReturnTypeOfSignature(signature);
8572+
if (returnType && !(suppressAny && isTypeAny(returnType))) {
8573+
returnTypeNode = serializeReturnTypeForSignatureWorker(context, signature, includePrivateSymbol, bundled);
8574+
}
8575+
else if (!suppressAny) {
8576+
returnTypeNode = factory.createKeywordTypeNode(SyntaxKind.AnyKeyword);
8577+
}
8578+
context.flags = flags;
8579+
return returnTypeNode;
8580+
}
8581+
8582+
function serializeReturnTypeForSignatureWorker(context: NodeBuilderContext, signature: Signature, includePrivateSymbol?: (s: Symbol) => void, bundled?: boolean) {
8583+
const typePredicate = getTypePredicateOfSignature(signature);
8584+
const type = getReturnTypeOfSignature(signature);
85768585
if (!isErrorType(type) && context.enclosingDeclaration) {
85778586
const annotation = signature.declaration && getEffectiveReturnTypeNode(signature.declaration);
85788587
const enclosingDeclarationIgnoringFakeScope = getEnclosingDeclarationIgnoringFakeScope(context.enclosingDeclaration);
@@ -8585,7 +8594,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
85858594
}
85868595
}
85878596
}
8588-
return typeToTypeNodeHelper(type, context);
8597+
if (typePredicate) {
8598+
return typePredicateToTypePredicateNodeHelper(typePredicate, context);
8599+
}
8600+
const expr = signature.declaration && getPossibleTypeNodeReuseExpression(signature.declaration);
8601+
return expressionOrTypeToTypeNode(context, expr, type);
85898602
}
85908603

85918604
function trackExistingEntityName<T extends EntityNameOrEntityNameExpression>(node: T, context: NodeBuilderContext, includePrivateSymbol?: (s: Symbol) => void) {
@@ -8633,7 +8646,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
86338646
}
86348647
return transformed === existing ? setTextRange(factory.cloneNode(existing), existing) : transformed;
86358648

8636-
function visitExistingNodeTreeSymbols(node: Node): Node {
8649+
function visitExistingNodeTreeSymbols(node: Node): Node | undefined {
86378650
// We don't _actually_ support jsdoc namepath types, emit `any` instead
86388651
if (isJSDocAllType(node) || node.kind === SyntaxKind.JSDocNamepathType) {
86398652
return factory.createKeywordTypeNode(SyntaxKind.AnyKeyword);
@@ -8642,16 +8655,16 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
86428655
return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);
86438656
}
86448657
if (isJSDocNullableType(node)) {
8645-
return factory.createUnionTypeNode([visitNode(node.type, visitExistingNodeTreeSymbols, isTypeNode), factory.createLiteralTypeNode(factory.createNull())]);
8658+
return factory.createUnionTypeNode([visitNode(node.type, visitExistingNodeTreeSymbols, isTypeNode)!, factory.createLiteralTypeNode(factory.createNull())]);
86468659
}
86478660
if (isJSDocOptionalType(node)) {
8648-
return factory.createUnionTypeNode([visitNode(node.type, visitExistingNodeTreeSymbols, isTypeNode), factory.createKeywordTypeNode(SyntaxKind.UndefinedKeyword)]);
8661+
return factory.createUnionTypeNode([visitNode(node.type, visitExistingNodeTreeSymbols, isTypeNode)!, factory.createKeywordTypeNode(SyntaxKind.UndefinedKeyword)]);
86498662
}
86508663
if (isJSDocNonNullableType(node)) {
86518664
return visitNode(node.type, visitExistingNodeTreeSymbols);
86528665
}
86538666
if (isJSDocVariadicType(node)) {
8654-
return factory.createArrayTypeNode(visitNode(node.type, visitExistingNodeTreeSymbols, isTypeNode));
8667+
return factory.createArrayTypeNode(visitNode(node.type, visitExistingNodeTreeSymbols, isTypeNode)!);
86558668
}
86568669
if (isJSDocTypeLiteral(node)) {
86578670
return factory.createTypeLiteralNode(map(node.jsDocPropertyTags, t => {
@@ -8743,15 +8756,24 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
87438756
node.isTypeOf,
87448757
);
87458758
}
8746-
if (isParameter(node)) {
8747-
if (!node.type && !node.initializer) {
8748-
return factory.updateParameterDeclaration(node, /*modifiers*/ undefined, node.dotDotDotToken, visitEachChild(node.name, visitExistingNodeTreeSymbols, /*context*/ undefined), node.questionToken, factory.createKeywordTypeNode(SyntaxKind.AnyKeyword), /*initializer*/ undefined);
8749-
}
8759+
if (isNamedDeclaration(node) && node.name.kind === SyntaxKind.ComputedPropertyName && !isLateBindableName(node.name)) {
8760+
return undefined;
87508761
}
8751-
if (isPropertySignature(node)) {
8752-
if (!node.type && !node.initializer) {
8753-
return factory.updatePropertySignature(node, node.modifiers, node.name, node.questionToken, factory.createKeywordTypeNode(SyntaxKind.AnyKeyword));
8762+
if (
8763+
(isFunctionLike(node) && !node.type)
8764+
|| (isPropertyDeclaration(node) && !node.type && !node.initializer)
8765+
|| (isPropertySignature(node) && !node.type && !node.initializer)
8766+
|| (isParameter(node) && !node.type && !node.initializer)
8767+
) {
8768+
let visited = visitEachChild(node, visitExistingNodeTreeSymbols, /*context*/ undefined);
8769+
if (visited === node) {
8770+
visited = setTextRange(factory.cloneNode(node), node);
87548771
}
8772+
(visited as Mutable<typeof visited>).type = factory.createKeywordTypeNode(SyntaxKind.AnyKeyword);
8773+
if (isParameter(node)) {
8774+
(visited as Mutable<ParameterDeclaration>).modifiers = undefined;
8775+
}
8776+
return visited;
87558777
}
87568778

87578779
if (isEntityName(node) || isEntityNameExpression(node)) {
@@ -48676,6 +48698,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4867648698

4867748699
type DeclarationWithPotentialInnerNodeReuse =
4867848700
| SignatureDeclaration
48701+
| JSDocSignature
4867948702
| AccessorDeclaration
4868048703
| VariableLikeDeclaration
4868148704
| PropertyAccessExpression
@@ -48724,13 +48747,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4872448747
if (!signatureDeclaration) {
4872548748
return factory.createToken(SyntaxKind.AnyKeyword) as KeywordTypeNode;
4872648749
}
48727-
const signature = getSignatureFromDeclaration(signatureDeclaration);
48728-
const typePredicate = getTypePredicateOfSignature(signature);
48729-
if (typePredicate) {
48730-
// Inferred type predicates
48731-
return nodeBuilder.typePredicateToTypePredicateNode(typePredicate, enclosingDeclaration, flags | NodeBuilderFlags.MultilineObjectLiterals, tracker);
48732-
}
48733-
return nodeBuilder.expressionOrTypeToTypeNode(getPossibleTypeNodeReuseExpression(signatureDeclaration), getReturnTypeOfSignature(signature), /*addUndefined*/ undefined, enclosingDeclaration, flags | NodeBuilderFlags.MultilineObjectLiterals, tracker);
48750+
return nodeBuilder.serializeReturnTypeForSignature(getSignatureFromDeclaration(signatureDeclaration), enclosingDeclaration, flags | NodeBuilderFlags.MultilineObjectLiterals, tracker);
4873448751
}
4873548752

4873648753
function createTypeOfExpression(exprIn: Expression, enclosingDeclaration: Node, flags: NodeBuilderFlags, tracker: SymbolTracker) {

src/compiler/moduleSpecifiers.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -550,7 +550,8 @@ function getLocalModuleSpecifier(moduleFileName: string, info: Info, compilerOpt
550550

551551
const nearestTargetPackageJson = getNearestAncestorDirectoryWithPackageJson(host, getDirectoryPath(modulePath));
552552
const nearestSourcePackageJson = getNearestAncestorDirectoryWithPackageJson(host, sourceDirectory);
553-
if (nearestSourcePackageJson !== nearestTargetPackageJson) {
553+
const ignoreCase = !hostUsesCaseSensitiveFileNames(host);
554+
if (!packageJsonPathsAreEqual(nearestTargetPackageJson, nearestSourcePackageJson, ignoreCase)) {
554555
// 2. The importing and imported files are part of different packages.
555556
//
556557
// packages/a/
@@ -570,6 +571,12 @@ function getLocalModuleSpecifier(moduleFileName: string, info: Info, compilerOpt
570571
return isPathRelativeToParent(maybeNonRelative) || countPathComponents(relativePath) < countPathComponents(maybeNonRelative) ? relativePath : maybeNonRelative;
571572
}
572573

574+
function packageJsonPathsAreEqual(a: string | undefined, b: string | undefined, ignoreCase?: boolean) {
575+
if (a === b) return true;
576+
if (a === undefined || b === undefined) return false;
577+
return comparePaths(a, b, ignoreCase) === Comparison.EqualTo;
578+
}
579+
573580
/** @internal */
574581
export function countPathComponents(path: string): number {
575582
let count = 0;

src/compiler/resolutionCache.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -750,7 +750,8 @@ export function createResolutionCache(resolutionHost: ResolutionCacheHost, rootD
750750
else impliedFormatPackageJsons.delete(newFile.resolvedPath);
751751
});
752752
impliedFormatPackageJsons.forEach((existing, path) => {
753-
if (!newProgram?.getSourceFileByPath(path)) {
753+
const newFile = newProgram?.getSourceFileByPath(path);
754+
if (!newFile || newFile.resolvedPath !== path) {
754755
existing.forEach(location => fileWatchesOfAffectingLocations.get(location)!.files--);
755756
impliedFormatPackageJsons.delete(path);
756757
}

src/services/completions.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3161,8 +3161,7 @@ function getContextualType(previousToken: Node, position: number, sourceFile: So
31613161
default:
31623162
const argInfo = SignatureHelp.getArgumentInfoForCompletions(previousToken, position, sourceFile, checker);
31633163
return argInfo ?
3164-
// At `,`, treat this as the next argument after the comma.
3165-
checker.getContextualTypeForArgumentAtIndex(argInfo.invocation, argInfo.argumentIndex + (previousToken.kind === SyntaxKind.CommaToken ? 1 : 0)) :
3164+
checker.getContextualTypeForArgumentAtIndex(argInfo.invocation, argInfo.argumentIndex) :
31663165
isEqualityOperatorKind(previousToken.kind) && isBinaryExpression(parent) && isEqualityOperatorKind(parent.operatorToken.kind) ?
31673166
// completion at `x ===/**/` should be for the right side
31683167
checker.getTypeAtLocation(parent.left) :

0 commit comments

Comments
 (0)