Skip to content

Commit 870f5b6

Browse files
committed
Merge branch 'master' into noPropertyAccessFromIndexSignature_fix
2 parents 4f8fde3 + cd37a32 commit 870f5b6

File tree

75 files changed

+1302
-149
lines changed

Some content is hidden

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

75 files changed

+1302
-149
lines changed

package-lock.json

Lines changed: 20 additions & 20 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: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2482,7 +2482,7 @@ namespace ts {
24822482
const immediate = resolveExternalModuleName(
24832483
node,
24842484
getExternalModuleRequireArgument(node) || getExternalModuleImportEqualsDeclarationExpression(node));
2485-
const resolved = resolveExternalModuleSymbol(immediate);
2485+
const resolved = resolveExternalModuleSymbol(immediate);
24862486
markSymbolOfAliasDeclarationIfTypeOnly(node, immediate, resolved, /*overwriteEmpty*/ false);
24872487
return resolved;
24882488
}
@@ -2492,7 +2492,7 @@ namespace ts {
24922492
}
24932493

24942494
function checkAndReportErrorForResolvingImportAliasToTypeOnlySymbol(node: ImportEqualsDeclaration, resolved: Symbol | undefined) {
2495-
if (markSymbolOfAliasDeclarationIfTypeOnly(node, /*immediateTarget*/ undefined, resolved, /*overwriteEmpty*/ false)) {
2495+
if (markSymbolOfAliasDeclarationIfTypeOnly(node, /*immediateTarget*/ undefined, resolved, /*overwriteEmpty*/ false) && !node.isTypeOnly) {
24962496
const typeOnlyDeclaration = getTypeOnlyAliasDeclaration(getSymbolOfNode(node))!;
24972497
const isExport = typeOnlyDeclarationIsExport(typeOnlyDeclaration);
24982498
const message = isExport
@@ -6841,13 +6841,15 @@ namespace ts {
68416841
addResult(factory.createImportEqualsDeclaration(
68426842
/*decorators*/ undefined,
68436843
/*modifiers*/ undefined,
6844+
/*isTypeOnly*/ false,
68446845
uniqueName,
68456846
factory.createExternalModuleReference(factory.createStringLiteral(specifier))
68466847
), ModifierFlags.None);
68476848
// import x = _x.z
68486849
addResult(factory.createImportEqualsDeclaration(
68496850
/*decorators*/ undefined,
68506851
/*modifiers*/ undefined,
6852+
/*isTypeOnly*/ false,
68516853
factory.createIdentifier(localName),
68526854
factory.createQualifiedName(uniqueName, initializer.name as Identifier),
68536855
), modifierFlags);
@@ -6867,6 +6869,7 @@ namespace ts {
68676869
addResult(factory.createImportEqualsDeclaration(
68686870
/*decorators*/ undefined,
68696871
/*modifiers*/ undefined,
6872+
/*isTypeOnly*/ false,
68706873
factory.createIdentifier(localName),
68716874
isLocalImport
68726875
? symbolToName(target, context, SymbolFlags.All, /*expectsIdentifier*/ false)
@@ -7024,6 +7027,7 @@ namespace ts {
70247027
addResult(factory.createImportEqualsDeclaration(
70257028
/*decorators*/ undefined,
70267029
/*modifiers*/ undefined,
7030+
/*isTypeOnly*/ false,
70277031
factory.createIdentifier(varName),
70287032
symbolToName(target, context, SymbolFlags.All, /*expectsIdentifier*/ false)
70297033
), ModifierFlags.None);
@@ -12077,6 +12081,11 @@ namespace ts {
1207712081
else if (grandParent.kind === SyntaxKind.TemplateLiteralTypeSpan) {
1207812082
inferences = append(inferences, stringType);
1207912083
}
12084+
// When an 'infer T' declaration is in the constraint position of a mapped type, we infer a 'keyof any'
12085+
// constraint.
12086+
else if (grandParent.kind === SyntaxKind.TypeParameter && grandParent.parent.kind === SyntaxKind.MappedType) {
12087+
inferences = append(inferences, keyofConstraintType);
12088+
}
1208012089
}
1208112090
}
1208212091
}
@@ -15277,8 +15286,7 @@ namespace ts {
1527715286
}
1527815287
}
1527915288
// If the constraint type of the instantiation is the wildcard type, return the wildcard type.
15280-
const result = <MappedType>instantiateAnonymousType(type, mapper);
15281-
return getConstraintTypeFromMappedType(result) === wildcardType ? wildcardType : result;
15289+
return instantiateType(getConstraintTypeFromMappedType(type), mapper) === wildcardType ? wildcardType : instantiateAnonymousType(type, mapper);
1528215290
}
1528315291

1528415292
function getModifiedReadonlyState(state: boolean, modifiers: MappedTypeModifiers) {
@@ -36459,9 +36467,12 @@ namespace ts {
3645936467
checkTypeNameIsReserved(node.name, Diagnostics.Import_name_cannot_be_0);
3646036468
}
3646136469
}
36470+
if (node.isTypeOnly) {
36471+
grammarErrorOnNode(node, Diagnostics.An_import_alias_cannot_use_import_type);
36472+
}
3646236473
}
3646336474
else {
36464-
if (moduleKind >= ModuleKind.ES2015 && !(node.flags & NodeFlags.Ambient)) {
36475+
if (moduleKind >= ModuleKind.ES2015 && !node.isTypeOnly && !(node.flags & NodeFlags.Ambient)) {
3646536476
// Import equals declaration is deprecated in es6 or above
3646636477
grammarErrorOnNode(node, Diagnostics.Import_assignment_cannot_be_used_when_targeting_ECMAScript_modules_Consider_using_import_Asterisk_as_ns_from_mod_import_a_from_mod_import_d_from_mod_or_another_module_format_instead);
3646736478
}
@@ -36552,19 +36563,30 @@ namespace ts {
3655236563
});
3655336564
}
3655436565

36566+
function canConvertImportDeclarationToTypeOnly(statement: Statement) {
36567+
return isImportDeclaration(statement) &&
36568+
statement.importClause &&
36569+
!statement.importClause.isTypeOnly &&
36570+
importClauseContainsReferencedImport(statement.importClause) &&
36571+
!isReferencedAliasDeclaration(statement.importClause, /*checkChildren*/ true) &&
36572+
!importClauseContainsConstEnumUsedAsValue(statement.importClause);
36573+
}
36574+
36575+
function canConvertImportEqualsDeclarationToTypeOnly(statement: Statement) {
36576+
return isImportEqualsDeclaration(statement) &&
36577+
isExternalModuleReference(statement.moduleReference) &&
36578+
!statement.isTypeOnly &&
36579+
getSymbolOfNode(statement).isReferenced &&
36580+
!isReferencedAliasDeclaration(statement, /*checkChildren*/ false) &&
36581+
!getSymbolLinks(getSymbolOfNode(statement)).constEnumReferenced;
36582+
}
36583+
3655536584
function checkImportsForTypeOnlyConversion(sourceFile: SourceFile) {
3655636585
for (const statement of sourceFile.statements) {
36557-
if (
36558-
isImportDeclaration(statement) &&
36559-
statement.importClause &&
36560-
!statement.importClause.isTypeOnly &&
36561-
importClauseContainsReferencedImport(statement.importClause) &&
36562-
!isReferencedAliasDeclaration(statement.importClause, /*checkChildren*/ true) &&
36563-
!importClauseContainsConstEnumUsedAsValue(statement.importClause)
36564-
) {
36586+
if (canConvertImportDeclarationToTypeOnly(statement) || canConvertImportEqualsDeclarationToTypeOnly(statement)) {
3656536587
error(
3656636588
statement,
36567-
Diagnostics.This_import_is_never_used_as_a_value_and_must_use_import_type_because_the_importsNotUsedAsValues_is_set_to_error);
36589+
Diagnostics.This_import_is_never_used_as_a_value_and_must_use_import_type_because_importsNotUsedAsValues_is_set_to_error);
3656836590
}
3656936591
}
3657036592
}

src/compiler/diagnosticMessages.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1112,11 +1112,7 @@
11121112
"category": "Message",
11131113
"code": 1369
11141114
},
1115-
"Only ECMAScript imports may use 'import type'.": {
1116-
"category": "Error",
1117-
"code": 1370
1118-
},
1119-
"This import is never used as a value and must use 'import type' because the 'importsNotUsedAsValues' is set to 'error'.": {
1115+
"This import is never used as a value and must use 'import type' because 'importsNotUsedAsValues' is set to 'error'.": {
11201116
"category": "Error",
11211117
"code": 1371
11221118
},
@@ -1196,6 +1192,10 @@
11961192
"category": "Error",
11971193
"code": 1391
11981194
},
1195+
"An import alias cannot use 'import type'": {
1196+
"category": "Error",
1197+
"code": 1392
1198+
},
11991199
"The types of '{0}' are incompatible between these types.": {
12001200
"category": "Error",
12011201
"code": 2200

src/compiler/emitter.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3155,6 +3155,10 @@ namespace ts {
31553155
emitModifiers(node, node.modifiers);
31563156
emitTokenWithComment(SyntaxKind.ImportKeyword, node.modifiers ? node.modifiers.end : node.pos, writeKeyword, node);
31573157
writeSpace();
3158+
if (node.isTypeOnly) {
3159+
emitTokenWithComment(SyntaxKind.TypeKeyword, node.pos, writeKeyword, node);
3160+
writeSpace();
3161+
}
31583162
emit(node.name);
31593163
writeSpace();
31603164
emitTokenWithComment(SyntaxKind.EqualsToken, node.name.end, writePunctuation, node);

src/compiler/factory/nodeFactory.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3776,6 +3776,7 @@ namespace ts {
37763776
function createImportEqualsDeclaration(
37773777
decorators: readonly Decorator[] | undefined,
37783778
modifiers: readonly Modifier[] | undefined,
3779+
isTypeOnly: boolean,
37793780
name: string | Identifier,
37803781
moduleReference: ModuleReference
37813782
) {
@@ -3785,6 +3786,7 @@ namespace ts {
37853786
modifiers,
37863787
name
37873788
);
3789+
node.isTypeOnly = isTypeOnly;
37883790
node.moduleReference = moduleReference;
37893791
node.transformFlags |= propagateChildFlags(node.moduleReference);
37903792
if (!isExternalModuleReference(node.moduleReference)) node.transformFlags |= TransformFlags.ContainsTypeScript;
@@ -3797,14 +3799,16 @@ namespace ts {
37973799
node: ImportEqualsDeclaration,
37983800
decorators: readonly Decorator[] | undefined,
37993801
modifiers: readonly Modifier[] | undefined,
3802+
isTypeOnly: boolean,
38003803
name: Identifier,
38013804
moduleReference: ModuleReference
38023805
) {
38033806
return node.decorators !== decorators
38043807
|| node.modifiers !== modifiers
3808+
|| node.isTypeOnly !== isTypeOnly
38053809
|| node.name !== name
38063810
|| node.moduleReference !== moduleReference
3807-
? update(createImportEqualsDeclaration(decorators, modifiers, name, moduleReference), node)
3811+
? update(createImportEqualsDeclaration(decorators, modifiers, isTypeOnly, name, moduleReference), node)
38083812
: node;
38093813
}
38103814

@@ -5798,7 +5802,7 @@ namespace ts {
57985802
isTypeAliasDeclaration(node) ? updateTypeAliasDeclaration(node, node.decorators, modifiers, node.name, node.typeParameters, node.type) :
57995803
isEnumDeclaration(node) ? updateEnumDeclaration(node, node.decorators, modifiers, node.name, node.members) :
58005804
isModuleDeclaration(node) ? updateModuleDeclaration(node, node.decorators, modifiers, node.name, node.body) :
5801-
isImportEqualsDeclaration(node) ? updateImportEqualsDeclaration(node, node.decorators, modifiers, node.name, node.moduleReference) :
5805+
isImportEqualsDeclaration(node) ? updateImportEqualsDeclaration(node, node.decorators, modifiers, node.isTypeOnly, node.name, node.moduleReference) :
58025806
isImportDeclaration(node) ? updateImportDeclaration(node, node.decorators, modifiers, node.importClause, node.moduleSpecifier) :
58035807
isExportAssignment(node) ? updateExportAssignment(node, node.decorators, modifiers, node.expression) :
58045808
isExportDeclaration(node) ? updateExportDeclaration(node, node.decorators, modifiers, node.isTypeOnly, node.exportClause, node.moduleSpecifier) :

src/compiler/parser.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6929,11 +6929,8 @@ namespace ts {
69296929
parseExpected(SyntaxKind.EqualsToken);
69306930
const moduleReference = parseModuleReference();
69316931
parseSemicolon();
6932-
const node = factory.createImportEqualsDeclaration(decorators, modifiers, identifier, moduleReference);
6932+
const node = factory.createImportEqualsDeclaration(decorators, modifiers, isTypeOnly, identifier, moduleReference);
69336933
const finished = withJSDoc(finishNode(node, pos), hasJSDoc);
6934-
if (isTypeOnly) {
6935-
parseErrorAtRange(finished, Diagnostics.Only_ECMAScript_imports_may_use_import_type);
6936-
}
69376934
return finished;
69386935
}
69396936

src/compiler/transformers/declarations.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,7 @@ namespace ts {
681681
decl,
682682
/*decorators*/ undefined,
683683
decl.modifiers,
684+
decl.isTypeOnly,
684685
decl.name,
685686
factory.updateExternalModuleReference(decl.moduleReference, rewriteModuleSpecifier(decl, specifier))
686687
);

src/compiler/transformers/destructuring.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ namespace ts {
199199
bindingOrAssignmentElementContainsNonLiteralComputedName(node))) {
200200
// If the right-hand value of the assignment is also an assignment target then
201201
// we need to cache the right-hand value.
202-
initializer = ensureIdentifier(flattenContext, initializer, /*reuseIdentifierExpressions*/ false, initializer);
202+
initializer = ensureIdentifier(flattenContext, visitNode(initializer, flattenContext.visitor), /*reuseIdentifierExpressions*/ false, initializer);
203203
node = context.factory.updateVariableDeclaration(node, node.name, /*exclamationToken*/ undefined, /*type*/ undefined, initializer);
204204
}
205205
}

src/compiler/transformers/es2015.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3155,7 +3155,7 @@ namespace ts {
31553155

31563156
const containsYield = (node.statement.transformFlags & TransformFlags.ContainsYield) !== 0;
31573157

3158-
let emitFlags: EmitFlags = 0;
3158+
let emitFlags: EmitFlags = EmitFlags.ReuseTempVariableScope;
31593159
if (currentState.containsLexicalThis) emitFlags |= EmitFlags.CapturesThis;
31603160
if (containsYield && (hierarchyFacts & HierarchyFacts.AsyncFunctionBody) !== 0) emitFlags |= EmitFlags.AsyncFunctionBody;
31613161

src/compiler/transformers/ts.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2973,6 +2973,11 @@ namespace ts {
29732973
* @param node The import equals declaration node.
29742974
*/
29752975
function visitImportEqualsDeclaration(node: ImportEqualsDeclaration): VisitResult<Statement> {
2976+
// Always elide type-only imports
2977+
if (node.isTypeOnly) {
2978+
return undefined;
2979+
}
2980+
29762981
if (isExternalModuleImportEqualsDeclaration(node)) {
29772982
const isReferenced = resolver.isReferencedAliasDeclaration(node);
29782983
// If the alias is unreferenced but we want to keep the import, replace with 'import "mod"'.

0 commit comments

Comments
 (0)