Skip to content

Commit e67193d

Browse files
committed
Merge branch 'main' into fix54167
2 parents fda0a8f + 215fe6e commit e67193d

File tree

1,234 files changed

+20730
-19227
lines changed

Some content is hidden

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

1,234 files changed

+20730
-19227
lines changed

.github/ISSUE_TEMPLATE/Bug_report.md

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,18 +43,16 @@ Please keep and fill in the line that best applies:
4343
### ⏯ Playground Link
4444

4545
<!--
46-
A link to a TypeScript Playground "Share" link which shows this behavior
47-
48-
The TypeScript Workbench can be used for more complex setups, try
49-
https://www.typescriptlang.org/dev/bug-workbench/
46+
A link to a TypeScript Playground "Share" link which shows this behavior.
47+
This should have the same code as the code snippet below, and use whichever settings are relevant to your report.
5048
5149
As a last resort, you can link to a repo, but these will be slower for us to investigate.
5250
-->
5351
[Playground link with relevant code](https://www.typescriptlang.org/play?#code/PTAEFkE9QYwewCYFNQHM5IM6gBZIE5JA)
5452

5553
### 💻 Code
5654

57-
<!-- Please post the relevant code sample here as well-->
55+
<!-- Please post the relevant code sample here as well. This code and the Playground code should be the same, do not use separate examples -->
5856
```ts
5957
// We can quickly address your report if:
6058
// - The code sample is short. Nearly all TypeScript bugs can be demonstrated in 20-30 lines of code!

package-lock.json

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

package.json

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "typescript",
33
"author": "Microsoft Corp.",
44
"homepage": "https://www.typescriptlang.org/",
5-
"version": "5.1.0",
5+
"version": "5.2.0",
66
"license": "Apache-2.0",
77
"description": "TypeScript is a language for application scale JavaScript development",
88
"keywords": [
@@ -83,9 +83,7 @@
8383
"which": "^2.0.2"
8484
},
8585
"overrides": {
86-
"typescript@*": "$typescript",
87-
"@octokit/types": "9.0.0",
88-
"@octokit/openapi-types": "16.0.0"
86+
"typescript@*": "$typescript"
8987
},
9088
"scripts": {
9189
"test": "hereby runtests-parallel --light=false",

src/compiler/checker.ts

Lines changed: 63 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -14262,7 +14262,36 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1426214262
* maps primitive types and type parameters are to their apparent types.
1426314263
*/
1426414264
function getSignaturesOfType(type: Type, kind: SignatureKind): readonly Signature[] {
14265-
return getSignaturesOfStructuredType(getReducedApparentType(type), kind);
14265+
const result = getSignaturesOfStructuredType(getReducedApparentType(type), kind);
14266+
if (kind === SignatureKind.Call && !length(result) && type.flags & TypeFlags.Union) {
14267+
if ((type as UnionType).arrayFallbackSignatures) {
14268+
return (type as UnionType).arrayFallbackSignatures!;
14269+
}
14270+
// If the union is all different instantiations of a member of the global array type...
14271+
let memberName: __String;
14272+
if (everyType(type, t => !!t.symbol?.parent && isArrayOrTupleSymbol(t.symbol.parent) && (!memberName ? (memberName = t.symbol.escapedName, true) : memberName === t.symbol.escapedName))) {
14273+
// Transform the type from `(A[] | B[])["member"]` to `(A | B)[]["member"]` (since we pretend array is covariant anyway)
14274+
const arrayArg = mapType(type, t => getMappedType((isReadonlyArraySymbol(t.symbol.parent) ? globalReadonlyArrayType : globalArrayType).typeParameters![0], (t as AnonymousType).mapper!));
14275+
const arrayType = createArrayType(arrayArg, someType(type, t => isReadonlyArraySymbol(t.symbol.parent)));
14276+
return (type as UnionType).arrayFallbackSignatures = getSignaturesOfType(getTypeOfPropertyOfType(arrayType, memberName!)!, kind);
14277+
}
14278+
(type as UnionType).arrayFallbackSignatures = result;
14279+
}
14280+
return result;
14281+
}
14282+
14283+
function isArrayOrTupleSymbol(symbol: Symbol | undefined) {
14284+
if (!symbol || !globalArrayType.symbol || !globalReadonlyArrayType.symbol) {
14285+
return false;
14286+
}
14287+
return !!getSymbolIfSameReference(symbol, globalArrayType.symbol) || !!getSymbolIfSameReference(symbol, globalReadonlyArrayType.symbol);
14288+
}
14289+
14290+
function isReadonlyArraySymbol(symbol: Symbol | undefined) {
14291+
if (!symbol || !globalReadonlyArrayType.symbol) {
14292+
return false;
14293+
}
14294+
return !!getSymbolIfSameReference(symbol, globalReadonlyArrayType.symbol);
1426614295
}
1426714296

1426814297
function findIndexInfo(indexInfos: readonly IndexInfo[], keyType: Type) {
@@ -16486,36 +16515,31 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1648616515
}
1648716516

1648816517
function getUnionOrIntersectionTypePredicate(signatures: readonly Signature[], kind: TypeFlags | undefined): TypePredicate | undefined {
16489-
let first: TypePredicate | undefined;
16518+
let last: TypePredicate | undefined;
1649016519
const types: Type[] = [];
1649116520
for (const sig of signatures) {
1649216521
const pred = getTypePredicateOfSignature(sig);
16493-
if (!pred || pred.kind === TypePredicateKind.AssertsThis || pred.kind === TypePredicateKind.AssertsIdentifier) {
16494-
if (kind !== TypeFlags.Intersection) {
16495-
continue;
16496-
}
16497-
else {
16498-
return; // intersections demand all members be type predicates for the result to have a predicate
16499-
}
16500-
}
16501-
16502-
if (first) {
16503-
if (!typePredicateKindsMatch(first, pred)) {
16504-
// No common type predicate.
16522+
if (pred) {
16523+
// Constituent type predicates must all have matching kinds. We don't create composite type predicates for assertions.
16524+
if (pred.kind !== TypePredicateKind.This && pred.kind !== TypePredicateKind.Identifier || last && !typePredicateKindsMatch(last, pred)) {
1650516525
return undefined;
1650616526
}
16527+
last = pred;
16528+
types.push(pred.type);
1650716529
}
1650816530
else {
16509-
first = pred;
16531+
// In composite union signatures we permit and ignore signatures with a return type `false`.
16532+
const returnType = kind !== TypeFlags.Intersection ? getReturnTypeOfSignature(sig) : undefined;
16533+
if (returnType !== falseType && returnType !== regularFalseType) {
16534+
return undefined;
16535+
}
1651016536
}
16511-
types.push(pred.type);
1651216537
}
16513-
if (!first) {
16514-
// No signatures had a type predicate.
16538+
if (!last) {
1651516539
return undefined;
1651616540
}
1651716541
const compositeType = getUnionOrIntersectionType(types, kind);
16518-
return createTypePredicate(first.kind, first.parameterName, first.parameterIndex, compositeType);
16542+
return createTypePredicate(last.kind, last.parameterName, last.parameterIndex, compositeType);
1651916543
}
1652016544

1652116545
function typePredicateKindsMatch(a: TypePredicate, b: TypePredicate): boolean {
@@ -29294,6 +29318,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2929429318
case SyntaxKind.NumericLiteral:
2929529319
case SyntaxKind.BigIntLiteral:
2929629320
case SyntaxKind.NoSubstitutionTemplateLiteral:
29321+
case SyntaxKind.TemplateExpression:
2929729322
case SyntaxKind.TrueKeyword:
2929829323
case SyntaxKind.FalseKeyword:
2929929324
case SyntaxKind.NullKeyword:
@@ -32590,8 +32615,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3259032615
// can be specified by users through attributes property.
3259132616
const paramType = getEffectiveFirstArgumentForJsxSignature(signature, node);
3259232617
const attributesType = checkExpressionWithContextualType(node.attributes, paramType, /*inferenceContext*/ undefined, checkMode);
32618+
const checkAttributesType = checkMode & CheckMode.SkipContextSensitive ? getRegularTypeOfObjectLiteral(attributesType) : attributesType;
3259332619
return checkTagNameDoesNotExpectTooManyArguments() && checkTypeRelatedToAndOptionallyElaborate(
32594-
attributesType,
32620+
checkAttributesType,
3259532621
paramType,
3259632622
relation,
3259732623
reportErrors ? node.tagName : undefined,
@@ -34514,6 +34540,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3451434540
}
3451534541
return getRegularTypeOfLiteralType(exprType);
3451634542
}
34543+
const links = getNodeLinks(node);
34544+
links.assertionExpressionType = exprType;
3451734545
checkSourceElement(type);
3451834546
checkNodeDeferred(node);
3451934547
return getTypeFromTypeNode(type);
@@ -34538,9 +34566,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3453834566
}
3453934567

3454034568
function checkAssertionDeferred(node: JSDocTypeAssertion | AssertionExpression) {
34541-
const { type, expression } = getAssertionTypeAndExpression(node);
34569+
const { type } = getAssertionTypeAndExpression(node);
3454234570
const errNode = isParenthesizedExpression(node) ? type : node;
34543-
const exprType = getRegularTypeOfObjectLiteral(getBaseTypeOfLiteralType(checkExpression(expression)));
34571+
const links = getNodeLinks(node);
34572+
Debug.assertIsDefined(links.assertionExpressionType);
34573+
const exprType = getRegularTypeOfObjectLiteral(getBaseTypeOfLiteralType(links.assertionExpressionType));
3454434574
const targetType = getTypeFromTypeNode(type);
3454534575
if (!isErrorType(targetType)) {
3454634576
addLazyDiagnostic(() => {
@@ -37342,7 +37372,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3734237372
texts.push(span.literal.text);
3734337373
types.push(isTypeAssignableTo(type, templateConstraintType) ? type : stringType);
3734437374
}
37345-
return isConstContext(node) || isTemplateLiteralContext(node) || someType(getContextualType(node, /*contextFlags*/ undefined) || unknownType, isTemplateLiteralContextualType) ? getTemplateLiteralType(texts, types) : stringType;
37375+
if (isConstContext(node) || isTemplateLiteralContext(node) || someType(getContextualType(node, /*contextFlags*/ undefined) || unknownType, isTemplateLiteralContextualType)) {
37376+
return getTemplateLiteralType(texts, types);
37377+
}
37378+
const evaluated = node.parent.kind !== SyntaxKind.TaggedTemplateExpression && evaluateTemplateExpression(node);
37379+
return evaluated ? getFreshTypeOfLiteralType(getStringLiteralType(evaluated)) : stringType;
3734637380
}
3734737381

3734837382
function isTemplateLiteralContextualType(type: Type): boolean {
@@ -43619,7 +43653,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4361943653
return value;
4362043654
}
4362143655

43622-
function evaluate(expr: Expression, location: Declaration): string | number | undefined {
43656+
function evaluate(expr: Expression, location?: Declaration): string | number | undefined {
4362343657
switch (expr.kind) {
4362443658
case SyntaxKind.PrefixUnaryExpression:
4362543659
const value = evaluate((expr as PrefixUnaryExpression).operand, location);
@@ -43676,11 +43710,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4367643710
const symbol = resolveEntityName(expr, SymbolFlags.Value, /*ignoreErrors*/ true);
4367743711
if (symbol) {
4367843712
if (symbol.flags & SymbolFlags.EnumMember) {
43679-
return evaluateEnumMember(expr, symbol, location);
43713+
return location ? evaluateEnumMember(expr, symbol, location) : getEnumMemberValue(symbol.valueDeclaration as EnumMember);
4368043714
}
4368143715
if (isConstVariable(symbol)) {
4368243716
const declaration = symbol.valueDeclaration as VariableDeclaration | undefined;
43683-
if (declaration && !declaration.type && declaration.initializer && declaration !== location && isBlockScopedNameDeclaredBeforeUse(declaration, location)) {
43717+
if (declaration && !declaration.type && declaration.initializer && (!location || declaration !== location && isBlockScopedNameDeclaredBeforeUse(declaration, location))) {
4368443718
return evaluate(declaration.initializer, declaration);
4368543719
}
4368643720
}
@@ -43695,7 +43729,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4369543729
const name = escapeLeadingUnderscores(((expr as ElementAccessExpression).argumentExpression as StringLiteralLike).text);
4369643730
const member = rootSymbol.exports!.get(name);
4369743731
if (member) {
43698-
return evaluateEnumMember(expr, member, location);
43732+
return location ? evaluateEnumMember(expr, member, location) : getEnumMemberValue(member.valueDeclaration as EnumMember);
4369943733
}
4370043734
}
4370143735
}
@@ -43717,7 +43751,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4371743751
return getEnumMemberValue(declaration as EnumMember);
4371843752
}
4371943753

43720-
function evaluateTemplateExpression(expr: TemplateExpression, location: Declaration) {
43754+
function evaluateTemplateExpression(expr: TemplateExpression, location?: Declaration) {
4372143755
let result = expr.head.text;
4372243756
for (const span of expr.templateSpans) {
4372343757
const value = evaluate(span.expression, location);
@@ -46985,7 +47019,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4698547019
if (requestedExternalEmitHelperNames.has(name)) continue;
4698647020
requestedExternalEmitHelperNames.add(name);
4698747021

46988-
const symbol = getSymbol(helpersModule.exports!, escapeLeadingUnderscores(name), SymbolFlags.Value);
47022+
const symbol = getSymbol(getExportsOfModule(helpersModule), escapeLeadingUnderscores(name), SymbolFlags.Value);
4698947023
if (!symbol) {
4699047024
error(location, Diagnostics.This_syntax_requires_an_imported_helper_named_1_which_does_not_exist_in_0_Consider_upgrading_your_version_of_0, externalHelpersModuleNameText, name);
4699147025
}

src/compiler/corePublic.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// WARNING: The script `configurePrerelease.ts` uses a regexp to parse out these values.
22
// If changing the text in this section, be sure to test `configurePrerelease` too.
3-
export const versionMajorMinor = "5.1";
3+
export const versionMajorMinor = "5.2";
44
// The following is baselined as a literal template type without intervention
55
/** The version of the TypeScript compiler release */
66
// eslint-disable-next-line @typescript-eslint/no-inferrable-types

src/compiler/diagnosticMessages.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4917,6 +4917,10 @@
49174917
"category": "Message",
49184918
"code": 6163
49194919
},
4920+
"Skipping module '{0}' that looks like an absolute URI, target file types: {1}.": {
4921+
"category": "Message",
4922+
"code": 6164
4923+
},
49204924
"Do not truncate error messages.": {
49214925
"category": "Message",
49224926
"code": 6165
@@ -7608,6 +7612,10 @@
76087612
"category": "Message",
76097613
"code": 95178
76107614
},
7615+
"Cannot move to file, selected file is invalid": {
7616+
"category": "Message",
7617+
"code": 95179
7618+
},
76117619

76127620
"No value exists in scope for the shorthand property '{0}'. Either declare one or provide an initializer.": {
76137621
"category": "Error",

src/compiler/factory/emitHelpers.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -761,10 +761,10 @@ export const esDecorateHelper: UnscopedEmitHelper = {
761761
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
762762
if (_ = accept(result.get)) descriptor.get = _;
763763
if (_ = accept(result.set)) descriptor.set = _;
764-
if (_ = accept(result.init)) initializers.push(_);
764+
if (_ = accept(result.init)) initializers.unshift(_);
765765
}
766766
else if (_ = accept(result)) {
767-
if (kind === "field") initializers.push(_);
767+
if (kind === "field") initializers.unshift(_);
768768
else descriptor[key] = _;
769769
}
770770
}

src/compiler/factory/nodeFactory.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ import {
125125
getSyntheticLeadingComments,
126126
getSyntheticTrailingComments,
127127
getTextOfIdentifierOrLiteral,
128+
HasDecorators,
128129
hasInvalidEscape,
129130
HasModifiers,
130131
hasProperty,
@@ -1023,6 +1024,7 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
10231024
liftToBlock,
10241025
mergeLexicalEnvironment,
10251026
updateModifiers,
1027+
updateModifierLike,
10261028
};
10271029

10281030
forEach(nodeFactoryPatchers, fn => fn(factory));
@@ -6989,6 +6991,18 @@ export function createNodeFactory(flags: NodeFactoryFlags, baseFactory: BaseNode
69896991
Debug.assertNever(node);
69906992
}
69916993

6994+
function updateModifierLike<T extends HasModifiers & HasDecorators>(node: T, modifiers: readonly ModifierLike[]): T;
6995+
function updateModifierLike(node: HasModifiers & HasDecorators, modifierArray: readonly ModifierLike[]) {
6996+
return isParameter(node) ? updateParameterDeclaration(node, modifierArray, node.dotDotDotToken, node.name, node.questionToken, node.type, node.initializer) :
6997+
isPropertyDeclaration(node) ? updatePropertyDeclaration(node, modifierArray, node.name, node.questionToken ?? node.exclamationToken, node.type, node.initializer) :
6998+
isMethodDeclaration(node) ? updateMethodDeclaration(node, modifierArray, node.asteriskToken, node.name, node.questionToken, node.typeParameters, node.parameters, node.type, node.body) :
6999+
isGetAccessorDeclaration(node) ? updateGetAccessorDeclaration(node, modifierArray, node.name, node.parameters, node.type, node.body) :
7000+
isSetAccessorDeclaration(node) ? updateSetAccessorDeclaration(node, modifierArray, node.name, node.parameters, node.body) :
7001+
isClassExpression(node) ? updateClassExpression(node, modifierArray, node.name, node.typeParameters, node.heritageClauses, node.members) :
7002+
isClassDeclaration(node) ? updateClassDeclaration(node, modifierArray, node.name, node.typeParameters, node.heritageClauses, node.members) :
7003+
Debug.assertNever(node);
7004+
}
7005+
69927006
function asNodeArray<T extends Node>(array: readonly T[]): NodeArray<T>;
69937007
function asNodeArray<T extends Node>(array: readonly T[] | undefined): NodeArray<T> | undefined;
69947008
function asNodeArray<T extends Node>(array: readonly T[] | undefined): NodeArray<T> | undefined {

src/compiler/moduleNameResolver.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1793,6 +1793,12 @@ function nodeModuleNameResolverWorker(features: NodeResolutionFeatures, moduleNa
17931793
resolved = loadModuleFromSelfNameReference(extensions, moduleName, containingDirectory, state, cache, redirectedReference);
17941794
}
17951795
if (!resolved) {
1796+
if (moduleName.indexOf(":") > -1) {
1797+
if (traceEnabled) {
1798+
trace(host, Diagnostics.Skipping_module_0_that_looks_like_an_absolute_URI_target_file_types_Colon_1, moduleName, formatExtensions(extensions));
1799+
}
1800+
return undefined;
1801+
}
17961802
if (traceEnabled) {
17971803
trace(host, Diagnostics.Loading_module_0_from_node_modules_folder_target_file_types_Colon_1, moduleName, formatExtensions(extensions));
17981804
}
@@ -2894,7 +2900,7 @@ function loadModuleFromSpecificNodeModulesDirectory(extensions: Extensions, modu
28942900

28952901
const loader: ResolutionKindSpecificLoader = (extensions, candidate, onlyRecordFailures, state) => {
28962902
let pathAndExtension =
2897-
loadModuleFromFile(extensions, candidate, onlyRecordFailures, state) ||
2903+
(rest || !(state.features & NodeResolutionFeatures.EsmMode)) && loadModuleFromFile(extensions, candidate, onlyRecordFailures, state) ||
28982904
loadNodeModuleFromDirectoryWorker(
28992905
extensions,
29002906
candidate,
@@ -2935,7 +2941,6 @@ function loadModuleFromSpecificNodeModulesDirectory(extensions: Extensions, modu
29352941
return fromPaths.value;
29362942
}
29372943
}
2938-
29392944
return loader(extensions, candidate, !nodeModulesDirectoryExists, state);
29402945
}
29412946

0 commit comments

Comments
 (0)