@@ -311,6 +311,8 @@ namespace ts {
311311 node = getParseTreeNode(node, isTypeNode);
312312 return node && getTypeArgumentConstraint(node);
313313 },
314+
315+ getSuggestionDiagnostics: file => suggestionDiagnostics.get(file.fileName) || emptyArray,
314316 };
315317
316318 const tupleTypes: GenericType[] = [];
@@ -449,6 +451,19 @@ namespace ts {
449451 const awaitedTypeStack: number[] = [];
450452
451453 const diagnostics = createDiagnosticCollection();
454+ // Suggestion diagnostics must have a file. Keyed by source file name.
455+ const suggestionDiagnostics = createMultiMap<Diagnostic>();
456+ function addSuggestionDiagnostic(diag: Diagnostic): void {
457+ suggestionDiagnostics.add(diag.file.fileName, { ...diag, category: DiagnosticCategory.Suggestion });
458+ }
459+ function addErrorOrSuggestionDiagnostic(isError: boolean, diag: Diagnostic) {
460+ if (isError) {
461+ diagnostics.add(diag);
462+ }
463+ else {
464+ addSuggestionDiagnostic(diag);
465+ }
466+ }
452467
453468 const enum TypeFacts {
454469 None = 0,
@@ -2095,9 +2110,15 @@ namespace ts {
20952110 const diag = Diagnostics.Invalid_module_name_in_augmentation_Module_0_resolves_to_an_untyped_module_at_1_which_cannot_be_augmented;
20962111 error(errorNode, diag, moduleReference, resolvedModule.resolvedFileName);
20972112 }
2098- else if (noImplicitAny && moduleNotFoundError) {
2099- diagnostics.add(createDiagnosticForModuleMissingTypes(errorNode, resolvedModule, moduleReference, Diagnostics.Could_not_find_a_declaration_file_for_module_0_1_implicitly_has_an_any_type));
2100- }
2113+ const errorInfo = resolvedModule.packageId && chainDiagnosticMessages(
2114+ /*details*/ undefined,
2115+ Diagnostics.Try_npm_install_types_Slash_0_if_it_exists_or_add_a_new_declaration_d_ts_file_containing_declare_module_0,
2116+ getMangledNameForScopedPackage(resolvedModule.packageId.name));
2117+ addErrorOrSuggestionDiagnostic(noImplicitAny && !!moduleNotFoundError, createDiagnosticForNodeFromMessageChain(errorNode, chainDiagnosticMessages(
2118+ errorInfo,
2119+ Diagnostics.Could_not_find_a_declaration_file_for_module_0_1_implicitly_has_an_any_type,
2120+ moduleReference,
2121+ resolvedModule.resolvedFileName)));
21012122 // Failed imports and untyped modules are both treated in an untyped manner; only difference is whether we give a diagnostic first.
21022123 return undefined;
21032124 }
0 commit comments