Skip to content

Commit afaec96

Browse files
Merge remote-tracking branch 'remotes/origin/main' into isolated-declarations
2 parents e18d2e8 + 7694530 commit afaec96

File tree

110 files changed

+4669
-977
lines changed

Some content is hidden

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

110 files changed

+4669
-977
lines changed

.github/ISSUE_TEMPLATE/lib_change.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: 'Library change'
2-
description: 'Fix or improve issues with built-in type definitions like `lib.dom.d.ts`, `lib.es6.d.ts`, etc.'
2+
description: 'Fix or improve issues with built-in type definitions like `lib.es6.d.ts`, etc.'
33
body:
44
- type: markdown
55
attributes:

package-lock.json

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

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@
7878
"playwright": "^1.38.0",
7979
"source-map-support": "^0.5.21",
8080
"tslib": "^2.5.0",
81-
"typescript": "^5.3.2",
81+
"typescript": "5.4.0-dev.20231206",
8282
"which": "^2.0.2"
8383
},
8484
"overrides": {

src/compiler/checker.ts

Lines changed: 52 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,7 @@ import {
309309
getJSDocDeprecatedTag,
310310
getJSDocEnumTag,
311311
getJSDocHost,
312+
getJSDocOverloadTags,
312313
getJSDocParameterTags,
313314
getJSDocRoot,
314315
getJSDocSatisfiesExpressionType,
@@ -602,6 +603,7 @@ import {
602603
isJSDocSatisfiesTag,
603604
isJSDocSignature,
604605
isJSDocTemplateTag,
606+
isJSDocThisTag,
605607
isJSDocTypeAlias,
606608
isJSDocTypeAssertion,
607609
isJSDocTypedefTag,
@@ -970,6 +972,7 @@ import {
970972
skipParentheses,
971973
skipTrivia,
972974
skipTypeChecking,
975+
skipTypeParentheses,
973976
some,
974977
SourceFile,
975978
SpreadAssignment,
@@ -2851,7 +2854,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
28512854
// still might be illegal if usage is in the initializer of the variable declaration (eg var a = a)
28522855
return !isImmediatelyUsedInInitializerOfBlockScopedVariable(declaration as VariableDeclaration, usage);
28532856
}
2854-
else if (isClassDeclaration(declaration)) {
2857+
else if (isClassLike(declaration)) {
28552858
// still might be illegal if the usage is within a computed property name in the class (eg class A { static p = "a"; [A.p]() {} })
28562859
return !findAncestor(usage, n => isComputedPropertyName(n) && n.parent.parent === declaration);
28572860
}
@@ -8257,7 +8260,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
82578260
return factory.createStringLiteral(name, !!singleQuote);
82588261
}
82598262
if (isNumericLiteralName(name) && startsWith(name, "-")) {
8260-
return factory.createComputedPropertyName(factory.createNumericLiteral(+name));
8263+
return factory.createComputedPropertyName(factory.createPrefixUnaryExpression(SyntaxKind.MinusToken, factory.createNumericLiteral(-name)));
82618264
}
82628265
return createPropertyNameNodeForIdentifierOrLiteral(name, getEmitScriptTarget(compilerOptions), singleQuote, stringNamed, isMethod);
82638266
}
@@ -12859,12 +12862,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1285912862
const baseTypes = getBaseTypes(source);
1286012863
if (baseTypes.length) {
1286112864
if (source.symbol && members === getMembersOfSymbol(source.symbol)) {
12862-
const symbolTable = createSymbolTable();
12863-
// copy all symbols (except type parameters), including the ones with internal names like `InternalSymbolName.Index`
12864-
for (const symbol of members.values()) {
12865-
if (!(symbol.flags & SymbolFlags.TypeParameter)) {
12866-
symbolTable.set(symbol.escapedName, symbol);
12867-
}
12865+
const symbolTable = createSymbolTable(source.declaredProperties);
12866+
// copy index signature symbol as well (for quickinfo)
12867+
const sourceIndex = getIndexSymbol(source.symbol);
12868+
if (sourceIndex) {
12869+
symbolTable.set(InternalSymbolName.Index, sourceIndex);
1286812870
}
1286912871
members = symbolTable;
1287012872
}
@@ -14880,6 +14882,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1488014882
let flags = SignatureFlags.None;
1488114883
let minArgumentCount = 0;
1488214884
let thisParameter: Symbol | undefined;
14885+
let thisTag: JSDocThisTag | undefined = isInJSFile(declaration) ? getJSDocThisTag(declaration) : undefined;
1488314886
let hasThisParameter = false;
1488414887
const iife = getImmediatelyInvokedFunctionExpression(declaration);
1488514888
const isJSConstructSignature = isJSDocConstructSignature(declaration);
@@ -14897,6 +14900,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1489714900
// signature.
1489814901
for (let i = isJSConstructSignature ? 1 : 0; i < declaration.parameters.length; i++) {
1489914902
const param = declaration.parameters[i];
14903+
if (isInJSFile(param) && isJSDocThisTag(param)) {
14904+
thisTag = param;
14905+
continue;
14906+
}
1490014907

1490114908
let paramSymbol = param.symbol;
1490214909
const type = isJSDocParameterTag(param) ? (param.typeExpression && param.typeExpression.type) : param.type;
@@ -14940,11 +14947,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1494014947
}
1494114948
}
1494214949

14943-
if (isInJSFile(declaration)) {
14944-
const thisTag = getJSDocThisTag(declaration);
14945-
if (thisTag && thisTag.typeExpression) {
14946-
thisParameter = createSymbolWithType(createSymbol(SymbolFlags.FunctionScopedVariable, InternalSymbolName.This), getTypeFromTypeNode(thisTag.typeExpression));
14947-
}
14950+
if (thisTag && thisTag.typeExpression) {
14951+
thisParameter = createSymbolWithType(createSymbol(SymbolFlags.FunctionScopedVariable, InternalSymbolName.This), getTypeFromTypeNode(thisTag.typeExpression));
1494814952
}
1494914953

1495014954
const hostDeclaration = isJSDocSignature(declaration) ? getEffectiveJSDocHost(declaration) : declaration;
@@ -15075,22 +15079,15 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1507515079
}
1507615080
}
1507715081
if (isInJSFile(decl) && decl.jsDoc) {
15078-
let hasJSDocOverloads = false;
15079-
for (const node of decl.jsDoc) {
15080-
if (node.tags) {
15081-
for (const tag of node.tags) {
15082-
if (isJSDocOverloadTag(tag)) {
15083-
const jsDocSignature = tag.typeExpression;
15084-
if (jsDocSignature.type === undefined && !isConstructorDeclaration(decl)) {
15085-
reportImplicitAny(jsDocSignature, anyType);
15086-
}
15087-
result.push(getSignatureFromDeclaration(jsDocSignature));
15088-
hasJSDocOverloads = true;
15089-
}
15082+
const tags = getJSDocOverloadTags(decl);
15083+
if (length(tags)) {
15084+
for (const tag of tags) {
15085+
const jsDocSignature = tag.typeExpression;
15086+
if (jsDocSignature.type === undefined && !isConstructorDeclaration(decl)) {
15087+
reportImplicitAny(jsDocSignature, anyType);
1509015088
}
15089+
result.push(getSignatureFromDeclaration(jsDocSignature));
1509115090
}
15092-
}
15093-
if (hasJSDocOverloads) {
1509415091
continue;
1509515092
}
1509615093
}
@@ -18295,7 +18292,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1829518292
return constraint && (isGenericObjectType(constraint) || isGenericIndexType(constraint)) ? cloneTypeParameter(p) : p;
1829618293
}
1829718294

18298-
function isSimpleTupleType(node: TypeNode) {
18295+
function isSimpleTupleType(node: TypeNode): boolean {
1829918296
return isTupleTypeNode(node) && length(node.elements) > 0 &&
1830018297
!some(node.elements, e => isOptionalTypeNode(e) || isRestTypeNode(e) || isNamedTupleMember(e) && !!(e.questionToken || e.dotDotDotToken));
1830118298
}
@@ -18326,11 +18323,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1832618323
if (checkType === wildcardType || extendsType === wildcardType) {
1832718324
return wildcardType;
1832818325
}
18326+
const checkTypeNode = skipTypeParentheses(root.node.checkType);
18327+
const extendsTypeNode = skipTypeParentheses(root.node.extendsType);
1832918328
// When the check and extends types are simple tuple types of the same arity, we defer resolution of the
1833018329
// conditional type when any tuple elements are generic. This is such that non-distributable conditional
1833118330
// types can be written `[X] extends [Y] ? ...` and be deferred similarly to `X extends Y ? ...`.
18332-
const checkTuples = isSimpleTupleType(root.node.checkType) && isSimpleTupleType(root.node.extendsType) &&
18333-
length((root.node.checkType as TupleTypeNode).elements) === length((root.node.extendsType as TupleTypeNode).elements);
18331+
const checkTuples = isSimpleTupleType(checkTypeNode) && isSimpleTupleType(extendsTypeNode) &&
18332+
length((checkTypeNode as TupleTypeNode).elements) === length((extendsTypeNode as TupleTypeNode).elements);
1833418333
const checkTypeDeferred = isDeferredType(checkType, checkTuples);
1833518334
let combinedMapper: TypeMapper | undefined;
1833618335
if (root.inferTypeParameters) {
@@ -20492,8 +20491,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2049220491
// similar to return values, callback parameters are output positions. This means that a Promise<T>,
2049320492
// where T is used only in callback parameter positions, will be co-variant (as opposed to bi-variant)
2049420493
// with respect to T.
20495-
const sourceSig = checkMode & SignatureCheckMode.Callback ? undefined : getSingleCallSignature(getNonNullableType(sourceType));
20496-
const targetSig = checkMode & SignatureCheckMode.Callback ? undefined : getSingleCallSignature(getNonNullableType(targetType));
20494+
const sourceSig = checkMode & SignatureCheckMode.Callback || isInstantiatedGenericParameter(source, i) ? undefined : getSingleCallSignature(getNonNullableType(sourceType));
20495+
const targetSig = checkMode & SignatureCheckMode.Callback || isInstantiatedGenericParameter(target, i) ? undefined : getSingleCallSignature(getNonNullableType(targetType));
2049720496
const callbacks = sourceSig && targetSig && !getTypePredicateOfSignature(sourceSig) && !getTypePredicateOfSignature(targetSig) &&
2049820497
getTypeFacts(sourceType, TypeFacts.IsUndefinedOrNull) === getTypeFacts(targetType, TypeFacts.IsUndefinedOrNull);
2049920498
let related = callbacks ?
@@ -25155,7 +25154,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2515525154
target = getIntersectionType(targets);
2515625155
}
2515725156
}
25158-
else if (target.flags & (TypeFlags.IndexedAccess | TypeFlags.Substitution)) {
25157+
if (target.flags & (TypeFlags.IndexedAccess | TypeFlags.Substitution)) {
2515925158
target = getActualTypeVariable(target);
2516025159
}
2516125160
if (target.flags & TypeFlags.TypeVariable) {
@@ -33287,6 +33286,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3328733286
(typeArguments.length >= minTypeArgumentCount && typeArguments.length <= numTypeParameters);
3328833287
}
3328933288

33289+
function isInstantiatedGenericParameter(signature: Signature, pos: number) {
33290+
let type;
33291+
return !!(signature.target && (type = tryGetTypeAtPosition(signature.target, pos)) && isGenericType(type));
33292+
}
33293+
3329033294
// If type has a single call signature and no other members, return that signature. Otherwise, return undefined.
3329133295
function getSingleCallSignature(type: Type): Signature | undefined {
3329233296
return getSingleSignature(type, SignatureKind.Call, /*allowMembers*/ false);
@@ -36014,9 +36018,16 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3601436018
const len = signature.parameters.length - (signatureHasRestParameter(signature) ? 1 : 0);
3601536019
for (let i = 0; i < len; i++) {
3601636020
const parameter = signature.parameters[i];
36017-
if (!getEffectiveTypeAnnotationNode(parameter.valueDeclaration as ParameterDeclaration)) {
36018-
const contextualParameterType = tryGetTypeAtPosition(context, i);
36019-
assignParameterType(parameter, contextualParameterType);
36021+
const declaration = parameter.valueDeclaration as ParameterDeclaration;
36022+
if (!getEffectiveTypeAnnotationNode(declaration)) {
36023+
let type = tryGetTypeAtPosition(context, i);
36024+
if (type && declaration.initializer) {
36025+
let initializerType = checkDeclarationInitializer(declaration, CheckMode.Normal);
36026+
if (!isTypeAssignableTo(initializerType, type) && isTypeAssignableTo(type, initializerType = widenTypeInferredFromInitializer(declaration, initializerType))) {
36027+
type = initializerType;
36028+
}
36029+
}
36030+
assignParameterType(parameter, type);
3602036031
}
3602136032
}
3602236033
if (signatureHasRestParameter(signature)) {
@@ -40300,15 +40311,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4030040311
}
4030140312
}
4030240313
if (isInJSFile(current) && isFunctionLike(current) && current.jsDoc) {
40303-
for (const node of current.jsDoc) {
40304-
if (node.tags) {
40305-
for (const tag of node.tags) {
40306-
if (isJSDocOverloadTag(tag)) {
40307-
hasOverloads = true;
40308-
}
40309-
}
40310-
}
40311-
}
40314+
hasOverloads = length(getJSDocOverloadTags(current)) > 0;
4031240315
}
4031340316
}
4031440317
}
@@ -44822,7 +44825,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4482244825
}
4482344826
else {
4482444827
const text = getTextOfPropertyName(member.name);
44825-
if (isNumericLiteralName(text) && !isInfinityOrNaNString(text)) {
44828+
if (isNumericLiteralName(text)) {
4482644829
error(member.name, Diagnostics.An_enum_member_cannot_have_a_numeric_name);
4482744830
}
4482844831
}
@@ -47922,8 +47925,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4792247925
if (enumResult) return enumResult;
4792347926
const literalValue = (type as LiteralType).value;
4792447927
return typeof literalValue === "object" ? factory.createBigIntLiteral(literalValue) :
47925-
typeof literalValue === "number" ? factory.createNumericLiteral(literalValue) :
47926-
factory.createStringLiteral(literalValue);
47928+
typeof literalValue === "string" ? factory.createStringLiteral(literalValue) :
47929+
literalValue < 0 ? factory.createPrefixUnaryExpression(SyntaxKind.MinusToken, factory.createNumericLiteral(-literalValue)) :
47930+
factory.createNumericLiteral(literalValue);
4792747931
}
4792847932

4792947933
function createLiteralConstValue(node: VariableDeclaration | PropertyDeclaration | PropertySignature | ParameterDeclaration, tracker: SymbolTracker) {

src/compiler/commandLineParser.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
CommandLineOptionOfListType,
1616
CompilerOptions,
1717
CompilerOptionsValue,
18+
computedOptions,
1819
ConfigFileSpecs,
1920
containsPath,
2021
convertToRelativePath,
@@ -103,6 +104,7 @@ import {
103104
removeTrailingDirectorySeparator,
104105
returnTrue,
105106
ScriptTarget,
107+
some,
106108
startsWith,
107109
StringLiteral,
108110
SyntaxKind,
@@ -2483,9 +2485,10 @@ export function convertToTSConfig(configParseResult: ParsedCommandLine, configFi
24832485
),
24842486
f => getRelativePathFromFile(getNormalizedAbsolutePath(configFileName, host.getCurrentDirectory()), getNormalizedAbsolutePath(f, host.getCurrentDirectory()), getCanonicalFileName),
24852487
);
2486-
const optionMap = serializeCompilerOptions(configParseResult.options, { configFilePath: getNormalizedAbsolutePath(configFileName, host.getCurrentDirectory()), useCaseSensitiveFileNames: host.useCaseSensitiveFileNames });
2488+
const pathOptions = { configFilePath: getNormalizedAbsolutePath(configFileName, host.getCurrentDirectory()), useCaseSensitiveFileNames: host.useCaseSensitiveFileNames };
2489+
const optionMap = serializeCompilerOptions(configParseResult.options, pathOptions);
24872490
const watchOptionMap = configParseResult.watchOptions && serializeWatchOptions(configParseResult.watchOptions);
2488-
const config = {
2491+
const config: TSConfig & { watchOptions?: object; } = {
24892492
compilerOptions: {
24902493
...optionMapToObject(optionMap),
24912494
showConfig: undefined,
@@ -2508,6 +2511,19 @@ export function convertToTSConfig(configParseResult: ParsedCommandLine, configFi
25082511
} : {}),
25092512
compileOnSave: !!configParseResult.compileOnSave ? true : undefined,
25102513
};
2514+
2515+
const providedKeys = new Set(optionMap.keys());
2516+
const impliedCompilerOptions: Record<string, CompilerOptionsValue> = {};
2517+
for (const option in computedOptions) {
2518+
if (!providedKeys.has(option) && some(computedOptions[option as keyof typeof computedOptions].dependencies, dep => providedKeys.has(dep))) {
2519+
const implied = computedOptions[option as keyof typeof computedOptions].computeValue(configParseResult.options);
2520+
const defaultValue = computedOptions[option as keyof typeof computedOptions].computeValue({});
2521+
if (implied !== defaultValue) {
2522+
impliedCompilerOptions[option] = computedOptions[option as keyof typeof computedOptions].computeValue(configParseResult.options);
2523+
}
2524+
}
2525+
}
2526+
assign(config.compilerOptions, optionMapToObject(serializeCompilerOptions(impliedCompilerOptions, pathOptions)));
25112527
return config;
25122528
}
25132529

0 commit comments

Comments
 (0)