Merge pull request #34524 from orta/fix_32675

Does not add a duplicate completion when offering an export which was re-declared as a global
This commit is contained in:
Orta 2019-10-17 13:08:32 -04:00 committed by GitHub
commit 5d20c573a6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 2 deletions

View File

@ -1000,6 +1000,7 @@ namespace ts.Completions {
let completionKind = CompletionKind.None;
let isNewIdentifierLocation = false;
let keywordFilters = KeywordCompletionFilters.None;
// This also gets mutated in nested-functions after the return
let symbols: Symbol[] = [];
const symbolToOriginInfoMap: SymbolOriginInfoMap = [];
const symbolToSortTextMap: SymbolSortTextMap = [];
@ -1464,7 +1465,7 @@ namespace ts.Completions {
}
/**
* Gathers symbols that can be imported from other files, deduplicating along the way. Symbols can be duplicates
* Gathers symbols that can be imported from other files, de-duplicating along the way. Symbols can be "duplicates"
* if re-exported from another module, e.g. `export { foo } from "./a"`. That syntax creates a fresh symbol, but
* its just an alias to the first, and both have the same name, so we generally want to filter those aliases out,
* if and only if the the first can be imported (it may be excluded due to package.json filtering in
@ -1548,7 +1549,7 @@ namespace ts.Completions {
// Don't add another completion for `export =` of a symbol that's already global.
// So in `declare namespace foo {} declare module "foo" { export = foo; }`, there will just be the global completion for `foo`.
if (resolvedModuleSymbol !== moduleSymbol &&
every(resolvedModuleSymbol.declarations, d => !!d.getSourceFile().externalModuleIndicator)) {
every(resolvedModuleSymbol.declarations, d => !!d.getSourceFile().externalModuleIndicator && !findAncestor(d, isGlobalScopeAugmentation))) {
pushSymbol(resolvedModuleSymbol, moduleSymbol, /*skipFilter*/ true);
}

View File

@ -0,0 +1,35 @@
/// <reference path="fourslash.ts" />
// 32675 - if this fails there are two copies of assert in completions
// @esModuleInterop: true,
// @target: esnext
// @Filename: /myAssert.d.ts
////declare function assert(value:any, message?:string):void;
////export = assert;
////export as namespace assert;
// @Filename: /ambient.d.ts
////import assert from './myAssert';
////
////type Assert = typeof assert;
////
////declare global {
//// const assert: Assert;
////}
// @Filename: /index.ts
/////// <reference path="./ambient.d.ts" />
////asser/**/;
verify.completions({
marker: "",
includes: [
{
name: "assert",
sortText: completion.SortText.GlobalsOrKeywords
}
],
preferences: { includeCompletionsForModuleExports: true, includeInsertTextCompletions: true }
});