Skip to content

Commit 16fa207

Browse files
committed
Add nightly-only error on ImportType resolution mode assertion
1 parent ce9b4c1 commit 16fa207

File tree

4 files changed

+23
-6
lines changed

4 files changed

+23
-6
lines changed

src/compiler/checker.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6224,6 +6224,7 @@ namespace ts {
62246224
factory.createStringLiteral("import")
62256225
)
62266226
])));
6227+
context.tracker.reportImportTypeNodeResolutionModeOverride?.();
62276228
}
62286229
}
62296230
if (!specifier) {
@@ -6247,6 +6248,7 @@ namespace ts {
62476248
factory.createStringLiteral(swappedMode === ModuleKind.ESNext ? "import" : "require")
62486249
)
62496250
])));
6251+
context.tracker.reportImportTypeNodeResolutionModeOverride?.();
62506252
}
62516253
}
62526254

@@ -36029,6 +36031,9 @@ namespace ts {
3602936031
if (node.assertions) {
3603036032
const override = getResolutionModeOverrideForClause(node.assertions.assertClause, grammarErrorOnNode);
3603136033
if (override) {
36034+
if (!isNightly()) {
36035+
grammarErrorOnNode(node.assertions.assertClause, Diagnostics.Resolution_mode_assertions_are_unstable_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next);
36036+
}
3603236037
if (getEmitModuleResolutionKind(compilerOptions) !== ModuleResolutionKind.Node16 && getEmitModuleResolutionKind(compilerOptions) !== ModuleResolutionKind.NodeNext) {
3603336038
grammarErrorOnNode(node.assertions.assertClause, Diagnostics.Resolution_modes_are_only_supported_when_moduleResolution_is_node16_or_nodenext);
3603436039
}

src/compiler/diagnosticMessages.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3479,6 +3479,10 @@
34793479
"category": "Error",
34803480
"code": 2840
34813481
},
3482+
"The type of this expression cannot be named without a resolution mode assertion, which is an unstable feature. Use nightly TypeScript to silence this error. Try updating with 'npm install -D typescript@next'.": {
3483+
"category": "Error",
3484+
"code": 2841
3485+
},
34823486

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

src/compiler/transformers/declarations.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ namespace ts {
7878
trackReferencedAmbientModule,
7979
trackExternalModuleSymbolOfImportTypeNode,
8080
reportNonlocalAugmentation,
81-
reportNonSerializableProperty
81+
reportNonSerializableProperty,
82+
reportImportTypeNodeResolutionModeOverride,
8283
};
8384
let errorNameNode: DeclarationName | undefined;
8485
let errorFallbackNode: Declaration | undefined;
@@ -235,6 +236,12 @@ namespace ts {
235236
}
236237
}
237238

239+
function reportImportTypeNodeResolutionModeOverride() {
240+
if (!isNightly() && (errorNameNode || errorFallbackNode)) {
241+
context.addDiagnostic(createDiagnosticForNode((errorNameNode || errorFallbackNode)!, Diagnostics.The_type_of_this_expression_cannot_be_named_without_a_resolution_mode_assertion_which_is_an_unstable_feature_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next));
242+
}
243+
}
244+
238245
function transformDeclarationsForJS(sourceFile: SourceFile, bundled?: boolean) {
239246
const oldDiag = getSymbolAccessibilityDiagnostic;
240247
getSymbolAccessibilityDiagnostic = (s) => (s.errorNode && canProduceDiagnostics(s.errorNode) ? createGetSymbolAccessibilityDiagnosticForNode(s.errorNode)(s) : ({
@@ -788,13 +795,13 @@ namespace ts {
788795
// Nothing visible
789796
}
790797

791-
function getResolutionModeOverrideForClauseInNightly(assertClause: AssertClause | undefined) {
792-
const mode = getResolutionModeOverrideForClause(assertClause);
798+
function getResolutionModeOverrideForClauseInNightly<T extends AssertClause | ImportTypeAssertionContainer>(container: T | undefined): T | undefined {
799+
const mode = getResolutionModeOverrideForClause(container?.kind === SyntaxKind.AssertClause ? container : container?.assertClause);
793800
if (mode !== undefined) {
794801
if (!isNightly()) {
795-
context.addDiagnostic(createDiagnosticForNode(assertClause!, Diagnostics.Resolution_mode_assertions_are_unstable_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next));
802+
context.addDiagnostic(createDiagnosticForNode(container!, Diagnostics.Resolution_mode_assertions_are_unstable_Use_nightly_TypeScript_to_silence_this_error_Try_updating_with_npm_install_D_typescript_next));
796803
}
797-
return assertClause;
804+
return container;
798805
}
799806
return undefined;
800807
}
@@ -1067,7 +1074,7 @@ namespace ts {
10671074
return cleanup(factory.updateImportTypeNode(
10681075
input,
10691076
factory.updateLiteralTypeNode(input.argument, rewriteModuleSpecifier(input, input.argument.literal)),
1070-
input.assertions,
1077+
getResolutionModeOverrideForClauseInNightly(input.assertions),
10711078
input.qualifier,
10721079
visitNodes(input.typeArguments, visitDeclarationSubtree, isTypeNode),
10731080
input.isTypeOf

src/compiler/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8524,6 +8524,7 @@ namespace ts {
85248524
trackExternalModuleSymbolOfImportTypeNode?(symbol: Symbol): void;
85258525
reportNonlocalAugmentation?(containingFile: SourceFile, parentSymbol: Symbol, augmentingSymbol: Symbol): void;
85268526
reportNonSerializableProperty?(propertyName: string): void;
8527+
reportImportTypeNodeResolutionModeOverride?(): void;
85278528
}
85288529

85298530
export interface TextSpan {

0 commit comments

Comments
 (0)