diff --git a/src/services/completions.ts b/src/services/completions.ts
index f0ad156956d82..7cea305e32df6 100644
--- a/src/services/completions.ts
+++ b/src/services/completions.ts
@@ -855,6 +855,7 @@ namespace ts.Completions {
host: LanguageServiceHost
): CompletionData | Request | undefined {
const typeChecker = program.getTypeChecker();
+ const compilerOptions = program.getCompilerOptions();
let start = timestamp();
let currentToken = getTokenAtPosition(sourceFile, position); // TODO: GH#15853
@@ -1519,7 +1520,22 @@ namespace ts.Completions {
return false;
}
- symbol = skipAlias(symbol, typeChecker);
+ // External modules can have global export declarations that will be
+ // available as global keywords in all scopes. But if the external module
+ // already has an explicit export and user only wants to user explicit
+ // module imports then the global keywords will be filtered out so auto
+ // import suggestions will win in the completion
+ const symbolOrigin = skipAlias(symbol, typeChecker);
+ // We only want to filter out the global keywords
+ if (symbol.id
+ && symbolToSortTextMap[symbol.id] === SortText.GlobalsOrKeywords
+ && symbolOrigin.id
+ && symbolToSortTextMap[symbolOrigin.id] === SortText.AutoImportSuggestions
+ && !compilerOptions.allowUmdGlobalAccess) {
+ return false;
+ }
+ // Continue with origin symbol
+ symbol = symbolOrigin;
// import m = /**/ <-- It can only access namespace (if typing import = x. this would get member symbols and not namespace)
if (isInRightSideOfInternalImportEqualsDeclaration(location)) {
diff --git a/tests/cases/fourslash/completionsImport_umdModules1_globalAccess.ts b/tests/cases/fourslash/completionsImport_umdModules1_globalAccess.ts
new file mode 100644
index 0000000000000..6ac4e394556ee
--- /dev/null
+++ b/tests/cases/fourslash/completionsImport_umdModules1_globalAccess.ts
@@ -0,0 +1,30 @@
+///