Skip to content

Commit 7234457

Browse files
Merge remote-tracking branch 'origin/master' into release-4.3
2 parents 1625bfb + 62f3ccd commit 7234457

File tree

105 files changed

+853
-460
lines changed

Some content is hidden

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

105 files changed

+853
-460
lines changed

package-lock.json

Lines changed: 6 additions & 6 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: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18274,6 +18274,11 @@ namespace ts {
1827418274
}
1827518275
}
1827618276
else if (target.flags & TypeFlags.TemplateLiteral) {
18277+
if (source.flags & TypeFlags.TemplateLiteral) {
18278+
// Report unreliable variance for type variables referenced in template literal type placeholders.
18279+
// For example, `foo-${number}` is related to `foo-${string}` even though number isn't related to string.
18280+
instantiateType(source, makeFunctionTypeMapper(reportUnreliableMarkers));
18281+
}
1827718282
const result = inferTypesFromTemplateLiteralType(source, target as TemplateLiteralType);
1827818283
if (result && every(result, (r, i) => isValidTypeForTemplateLiteralPlaceholder(r, (target as TemplateLiteralType).types[i]))) {
1827918284
return Ternary.True;
@@ -18318,20 +18323,6 @@ namespace ts {
1831818323
return result;
1831918324
}
1832018325
}
18321-
else if (source.flags & TypeFlags.TemplateLiteral) {
18322-
if (target.flags & TypeFlags.TemplateLiteral &&
18323-
(source as TemplateLiteralType).texts.length === (target as TemplateLiteralType).texts.length &&
18324-
(source as TemplateLiteralType).types.length === (target as TemplateLiteralType).types.length &&
18325-
every((source as TemplateLiteralType).texts, (t, i) => t === (target as TemplateLiteralType).texts[i]) &&
18326-
every((instantiateType(source, makeFunctionTypeMapper(reportUnreliableMarkers)) as TemplateLiteralType).types, (t, i) => !!((target as TemplateLiteralType).types[i].flags & (TypeFlags.Any | TypeFlags.String)) || !!isRelatedTo(t, (target as TemplateLiteralType).types[i], /*reportErrors*/ false))) {
18327-
return Ternary.True;
18328-
}
18329-
const constraint = getBaseConstraintOfType(source);
18330-
if (constraint && constraint !== source && (result = isRelatedTo(constraint, target, reportErrors))) {
18331-
resetErrorInfo(saveErrorInfo);
18332-
return result;
18333-
}
18334-
}
1833518326
else if (source.flags & TypeFlags.StringMapping) {
1833618327
if (target.flags & TypeFlags.StringMapping && (<StringMappingType>source).symbol === (<StringMappingType>target).symbol) {
1833718328
if (result = isRelatedTo((<StringMappingType>source).type, (<StringMappingType>target).type, reportErrors)) {
@@ -27125,7 +27116,7 @@ namespace ts {
2712527116
if (isInPropertyInitializer(node)
2712627117
&& !(isAccessExpression(node) && isAccessExpression(node.expression))
2712727118
&& !isBlockScopedNameDeclaredBeforeUse(valueDeclaration, right)
27128-
&& !isPropertyDeclaredInAncestorClass(prop)) {
27119+
&& (compilerOptions.useDefineForClassFields || !isPropertyDeclaredInAncestorClass(prop))) {
2712927120
diagnosticMessage = error(right, Diagnostics.Property_0_is_used_before_its_initialization, declarationName);
2713027121
}
2713127122
else if (valueDeclaration.kind === SyntaxKind.ClassDeclaration &&
@@ -35254,8 +35245,8 @@ namespace ts {
3525435245
errorAndMaybeSuggestAwait(
3525535246
condExpr,
3525635247
/*maybeMissingAwait*/ true,
35257-
Diagnostics.This_condition_will_always_return_0_since_the_types_1_and_2_have_no_overlap,
35258-
"true", getTypeNameForErrorDisplay(type), "false");
35248+
Diagnostics.This_condition_will_always_return_true_since_this_0_appears_to_always_be_defined,
35249+
getTypeNameForErrorDisplay(type));
3525935250
return;
3526035251
}
3526135252

@@ -35288,7 +35279,7 @@ namespace ts {
3528835279
const isUsed = isBinaryExpression(condExpr.parent) && isFunctionUsedInBinaryExpressionChain(condExpr.parent, testedSymbol)
3528935280
|| body && isFunctionUsedInConditionBody(condExpr, body, testedNode, testedSymbol);
3529035281
if (!isUsed) {
35291-
error(location, Diagnostics.This_condition_will_always_return_true_since_the_function_is_always_defined_Did_you_mean_to_call_it_instead);
35282+
error(location, Diagnostics.This_condition_will_always_return_true_since_this_function_appears_to_always_be_defined_Did_you_mean_to_call_it_instead);
3529235283
}
3529335284
}
3529435285

@@ -36572,6 +36563,7 @@ namespace ts {
3657236563
switch (name.escapedText) {
3657336564
case "any":
3657436565
case "unknown":
36566+
case "never":
3657536567
case "number":
3657636568
case "bigint":
3657736569
case "boolean":

src/compiler/diagnosticMessages.json

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"category": "Error",
1616
"code": 1006
1717
},
18-
"The parser expected to find a '}' to match the '{' token here.": {
18+
"The parser expected to find a '{1}' to match the '{0}' token here.": {
1919
"category": "Error",
2020
"code": 1007
2121
},
@@ -3168,7 +3168,7 @@
31683168
"category": "Error",
31693169
"code": 2773
31703170
},
3171-
"This condition will always return true since the function is always defined. Did you mean to call it instead?": {
3171+
"This condition will always return true since this function appears to always be defined. Did you mean to call it instead?": {
31723172
"category": "Error",
31733173
"code": 2774
31743174
},
@@ -3276,7 +3276,7 @@
32763276
"category": "Error",
32773277
"code": 2800
32783278
},
3279-
"This condition will always return true since the Promise is always truthy.": {
3279+
"This condition will always return true since this '{0}' appears to always be defined.": {
32803280
"category": "Error",
32813281
"code": 2801
32823282
},
@@ -3308,6 +3308,10 @@
33083308
"category": "Error",
33093309
"code": 2808
33103310
},
3311+
"Declaration or statement expected. This '=' follows a block of statements, so if you intended to write a destructuring assignment, you might need to wrap the the whole assignment in parentheses.": {
3312+
"category": "Error",
3313+
"code": 2809
3314+
},
33113315

33123316
"Import declaration '{0}' is using private name '{1}'.": {
33133317
"category": "Error",

src/compiler/parser.ts

Lines changed: 45 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1335,24 +1335,27 @@ namespace ts {
13351335
return inContext(NodeFlags.AwaitContext);
13361336
}
13371337

1338-
function parseErrorAtCurrentToken(message: DiagnosticMessage, arg0?: any): void {
1339-
parseErrorAt(scanner.getTokenPos(), scanner.getTextPos(), message, arg0);
1338+
function parseErrorAtCurrentToken(message: DiagnosticMessage, arg0?: any): DiagnosticWithDetachedLocation | undefined {
1339+
return parseErrorAt(scanner.getTokenPos(), scanner.getTextPos(), message, arg0);
13401340
}
13411341

1342-
function parseErrorAtPosition(start: number, length: number, message: DiagnosticMessage, arg0?: any): void {
1342+
function parseErrorAtPosition(start: number, length: number, message: DiagnosticMessage, arg0?: any): DiagnosticWithDetachedLocation | undefined {
13431343
// Don't report another error if it would just be at the same position as the last error.
13441344
const lastError = lastOrUndefined(parseDiagnostics);
1345+
let result: DiagnosticWithDetachedLocation | undefined;
13451346
if (!lastError || start !== lastError.start) {
1346-
parseDiagnostics.push(createDetachedDiagnostic(fileName, start, length, message, arg0));
1347+
result = createDetachedDiagnostic(fileName, start, length, message, arg0);
1348+
parseDiagnostics.push(result);
13471349
}
13481350

13491351
// Mark that we've encountered an error. We'll set an appropriate bit on the next
13501352
// node we finish so that it can't be reused incrementally.
13511353
parseErrorBeforeNextFinishedNode = true;
1354+
return result;
13521355
}
13531356

1354-
function parseErrorAt(start: number, end: number, message: DiagnosticMessage, arg0?: any): void {
1355-
parseErrorAtPosition(start, end - start, message, arg0);
1357+
function parseErrorAt(start: number, end: number, message: DiagnosticMessage, arg0?: any): DiagnosticWithDetachedLocation | undefined {
1358+
return parseErrorAtPosition(start, end - start, message, arg0);
13561359
}
13571360

13581361
function parseErrorAtRange(range: TextRange, message: DiagnosticMessage, arg0?: any): void {
@@ -1542,6 +1545,20 @@ namespace ts {
15421545
return false;
15431546
}
15441547

1548+
function parseExpectedMatchingBrackets(openKind: SyntaxKind, closeKind: SyntaxKind, openPosition: number) {
1549+
if (token() === closeKind) {
1550+
nextToken();
1551+
return;
1552+
}
1553+
const lastError = parseErrorAtCurrentToken(Diagnostics._0_expected, tokenToString(closeKind));
1554+
if (lastError) {
1555+
addRelatedInfo(
1556+
lastError,
1557+
createDetachedDiagnostic(fileName, openPosition, 1, Diagnostics.The_parser_expected_to_find_a_1_to_match_the_0_token_here, tokenToString(openKind), tokenToString(closeKind))
1558+
);
1559+
}
1560+
}
1561+
15451562
function parseOptional(t: SyntaxKind): boolean {
15461563
if (token() === t) {
15471564
nextToken();
@@ -2092,8 +2109,7 @@ namespace ts {
20922109

20932110
while (!isListTerminator(kind)) {
20942111
if (isListElement(kind, /*inErrorRecovery*/ false)) {
2095-
const element = parseListElement(kind, parseElement);
2096-
list.push(element);
2112+
list.push(parseListElement(kind, parseElement));
20972113

20982114
continue;
20992115
}
@@ -5426,10 +5442,11 @@ namespace ts {
54265442

54275443
function parseArrayLiteralExpression(): ArrayLiteralExpression {
54285444
const pos = getNodePos();
5445+
const openBracketPosition = scanner.getTokenPos();
54295446
parseExpected(SyntaxKind.OpenBracketToken);
54305447
const multiLine = scanner.hasPrecedingLineBreak();
54315448
const elements = parseDelimitedList(ParsingContext.ArrayLiteralMembers, parseArgumentOrArrayLiteralElement);
5432-
parseExpected(SyntaxKind.CloseBracketToken);
5449+
parseExpectedMatchingBrackets(SyntaxKind.OpenBracketToken, SyntaxKind.CloseBracketToken, openBracketPosition);
54335450
return finishNode(factory.createArrayLiteralExpression(elements, multiLine), pos);
54345451
}
54355452

@@ -5498,15 +5515,7 @@ namespace ts {
54985515
parseExpected(SyntaxKind.OpenBraceToken);
54995516
const multiLine = scanner.hasPrecedingLineBreak();
55005517
const properties = parseDelimitedList(ParsingContext.ObjectLiteralMembers, parseObjectLiteralElement, /*considerSemicolonAsDelimiter*/ true);
5501-
if (!parseExpected(SyntaxKind.CloseBraceToken)) {
5502-
const lastError = lastOrUndefined(parseDiagnostics);
5503-
if (lastError && lastError.code === Diagnostics._0_expected.code) {
5504-
addRelatedInfo(
5505-
lastError,
5506-
createDetachedDiagnostic(fileName, openBracePosition, 1, Diagnostics.The_parser_expected_to_find_a_to_match_the_token_here)
5507-
);
5508-
}
5509-
}
5518+
parseExpectedMatchingBrackets(SyntaxKind.OpenBraceToken, SyntaxKind.CloseBraceToken, openBracePosition);
55105519
return finishNode(factory.createObjectLiteralExpression(properties, multiLine), pos);
55115520
}
55125521

@@ -5591,16 +5600,14 @@ namespace ts {
55915600
if (parseExpected(SyntaxKind.OpenBraceToken, diagnosticMessage) || ignoreMissingOpenBrace) {
55925601
const multiLine = scanner.hasPrecedingLineBreak();
55935602
const statements = parseList(ParsingContext.BlockStatements, parseStatement);
5594-
if (!parseExpected(SyntaxKind.CloseBraceToken)) {
5595-
const lastError = lastOrUndefined(parseDiagnostics);
5596-
if (lastError && lastError.code === Diagnostics._0_expected.code) {
5597-
addRelatedInfo(
5598-
lastError,
5599-
createDetachedDiagnostic(fileName, openBracePosition, 1, Diagnostics.The_parser_expected_to_find_a_to_match_the_token_here)
5600-
);
5601-
}
5603+
parseExpectedMatchingBrackets(SyntaxKind.OpenBraceToken, SyntaxKind.CloseBraceToken, openBracePosition);
5604+
const result = finishNode(factory.createBlock(statements, multiLine), pos);
5605+
if (token() === SyntaxKind.EqualsToken) {
5606+
parseErrorAtCurrentToken(Diagnostics.Declaration_or_statement_expected_This_follows_a_block_of_statements_so_if_you_intended_to_write_a_destructuring_assignment_you_might_need_to_wrap_the_the_whole_assignment_in_parentheses);
5607+
nextToken();
56025608
}
5603-
return finishNode(factory.createBlock(statements, multiLine), pos);
5609+
5610+
return result;
56045611
}
56055612
else {
56065613
const statements = createMissingList<Statement>();
@@ -5647,9 +5654,10 @@ namespace ts {
56475654
function parseIfStatement(): IfStatement {
56485655
const pos = getNodePos();
56495656
parseExpected(SyntaxKind.IfKeyword);
5657+
const openParenPosition = scanner.getTokenPos();
56505658
parseExpected(SyntaxKind.OpenParenToken);
56515659
const expression = allowInAnd(parseExpression);
5652-
parseExpected(SyntaxKind.CloseParenToken);
5660+
parseExpectedMatchingBrackets(SyntaxKind.OpenParenToken, SyntaxKind.CloseParenToken, openParenPosition);
56535661
const thenStatement = parseStatement();
56545662
const elseStatement = parseOptional(SyntaxKind.ElseKeyword) ? parseStatement() : undefined;
56555663
return finishNode(factory.createIfStatement(expression, thenStatement, elseStatement), pos);
@@ -5660,9 +5668,10 @@ namespace ts {
56605668
parseExpected(SyntaxKind.DoKeyword);
56615669
const statement = parseStatement();
56625670
parseExpected(SyntaxKind.WhileKeyword);
5671+
const openParenPosition = scanner.getTokenPos();
56635672
parseExpected(SyntaxKind.OpenParenToken);
56645673
const expression = allowInAnd(parseExpression);
5665-
parseExpected(SyntaxKind.CloseParenToken);
5674+
parseExpectedMatchingBrackets(SyntaxKind.OpenParenToken, SyntaxKind.CloseParenToken, openParenPosition);
56665675

56675676
// From: https://mail.mozilla.org/pipermail/es-discuss/2011-August/016188.html
56685677
// 157 min --- All allen at wirfs-brock.com CONF --- "do{;}while(false)false" prohibited in
@@ -5675,9 +5684,10 @@ namespace ts {
56755684
function parseWhileStatement(): WhileStatement {
56765685
const pos = getNodePos();
56775686
parseExpected(SyntaxKind.WhileKeyword);
5687+
const openParenPosition = scanner.getTokenPos();
56785688
parseExpected(SyntaxKind.OpenParenToken);
56795689
const expression = allowInAnd(parseExpression);
5680-
parseExpected(SyntaxKind.CloseParenToken);
5690+
parseExpectedMatchingBrackets(SyntaxKind.OpenParenToken, SyntaxKind.CloseParenToken, openParenPosition);
56815691
const statement = parseStatement();
56825692
return finishNode(factory.createWhileStatement(expression, statement), pos);
56835693
}
@@ -5749,9 +5759,10 @@ namespace ts {
57495759
function parseWithStatement(): WithStatement {
57505760
const pos = getNodePos();
57515761
parseExpected(SyntaxKind.WithKeyword);
5762+
const openParenPosition = scanner.getTokenPos();
57525763
parseExpected(SyntaxKind.OpenParenToken);
57535764
const expression = allowInAnd(parseExpression);
5754-
parseExpected(SyntaxKind.CloseParenToken);
5765+
parseExpectedMatchingBrackets(SyntaxKind.OpenParenToken, SyntaxKind.CloseParenToken, openParenPosition);
57555766
const statement = doInsideOfContext(NodeFlags.InWithStatement, parseStatement);
57565767
return finishNode(factory.createWithStatement(expression, statement), pos);
57575768
}
@@ -7973,13 +7984,9 @@ namespace ts {
79737984
hasChildren = true;
79747985
if (child.kind === SyntaxKind.JSDocTypeTag) {
79757986
if (childTypeTag) {
7976-
parseErrorAtCurrentToken(Diagnostics.A_JSDoc_typedef_comment_may_not_contain_multiple_type_tags);
7977-
const lastError = lastOrUndefined(parseDiagnostics);
7987+
const lastError = parseErrorAtCurrentToken(Diagnostics.A_JSDoc_typedef_comment_may_not_contain_multiple_type_tags);
79787988
if (lastError) {
7979-
addRelatedInfo(
7980-
lastError,
7981-
createDetachedDiagnostic(fileName, 0, 0, Diagnostics.The_tag_was_first_specified_here)
7982-
);
7989+
addRelatedInfo(lastError, createDetachedDiagnostic(fileName, 0, 0, Diagnostics.The_tag_was_first_specified_here));
79837990
}
79847991
break;
79857992
}
@@ -8011,7 +8018,7 @@ namespace ts {
80118018
}
80128019

80138020
const typedefTag = factory.createJSDocTypedefTag(tagName, typeExpression, fullName, comment);
8014-
return finishNode(typedefTag, start);
8021+
return finishNode(typedefTag, start, end);
80158022
}
80168023

80178024
function parseJSDocTypeNameWithNamespace(nested?: boolean) {

src/compiler/tsbuildPublic.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1717,7 +1717,11 @@ namespace ts {
17171717
continue;
17181718
}
17191719
const outputs = getAllProjectOutputs(parsed, !host.useCaseSensitiveFileNames());
1720+
if (!outputs.length) continue;
1721+
const inputFileNames = new Set(parsed.fileNames.map(f => toPath(state, f)));
17201722
for (const output of outputs) {
1723+
// If output name is same as input file name, do not delete and ignore the error
1724+
if (inputFileNames.has(toPath(state, output))) continue;
17211725
if (host.fileExists(output)) {
17221726
if (filesToDelete) {
17231727
filesToDelete.push(output);

src/harness/compilerImpl.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,6 @@ namespace compiler {
135135
}
136136
}
137137
}
138-
139-
this.diagnostics = diagnostics;
140138
}
141139

142140
public get vfs(): vfs.FileSystem {

0 commit comments

Comments
 (0)