Skip to content

Commit ac783dd

Browse files
authored
Merge pull request #31917 from rintaro/5.3-ide-completion-duplicatedmodule-rdar63370253
[5.3][CodeCompletion] Avoid suggesting duplicated module names
2 parents deefd5e + 0a23698 commit ac783dd

File tree

6 files changed

+78
-3
lines changed

6 files changed

+78
-3
lines changed

lib/IDE/CodeCompletion.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6196,6 +6196,8 @@ void CodeCompletionCallbacksImpl::doneParsing() {
61966196
break;
61976197
}
61986198

6199+
llvm::SmallPtrSet<Identifier, 8> seenModuleNames;
6200+
61996201
for (auto &Request: Lookup.RequestedCachedResults) {
62006202
// Use the current SourceFile as the DeclContext so that we can use it to
62016203
// perform qualified lookup, and to get the correct visibility for
@@ -6248,7 +6250,9 @@ void CodeCompletionCallbacksImpl::doneParsing() {
62486250
return; // already handled.
62496251
RequestedModules.push_back({std::move(K), TheModule,
62506252
Request.OnlyTypes, Request.OnlyPrecedenceGroups});
6251-
if (Request.IncludeModuleQualifier)
6253+
6254+
if (Request.IncludeModuleQualifier &&
6255+
seenModuleNames.insert(TheModule->getName()).second)
62526256
Lookup.addModuleName(TheModule);
62536257
}
62546258
};
@@ -6263,8 +6267,10 @@ void CodeCompletionCallbacksImpl::doneParsing() {
62636267
Lookup.getToplevelCompletions(Request.OnlyTypes);
62646268

62656269
// Add the qualifying module name
6266-
if (Request.IncludeModuleQualifier)
6267-
Lookup.addModuleName(CurDeclContext->getParentModule());
6270+
auto curModule = CurDeclContext->getParentModule();
6271+
if (Request.IncludeModuleQualifier &&
6272+
seenModuleNames.insert(curModule->getName()).second)
6273+
Lookup.addModuleName(curModule);
62686274

62696275
// Add results for all imported modules.
62706276
ModuleDecl::ImportFilter ImportFilter;
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
#include <OverlayTest/Overlayed.h>
2+
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
2+
#ifndef OVERLAYED_H
3+
#define OVERLAYED_H
4+
5+
struct __attribute__((swift_name("Overlayed"))) OVOverlayed {
6+
double x, y, z;
7+
};
8+
9+
double OVOverlayedInOriginalFunc(struct OVOverlayed s) __attribute__((swift_name("Overlayed.inOriginalFunc(self:)")));
10+
11+
struct OVOverlayed createOverlayed();
12+
13+
#endif
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
framework module OverlayTest {
2+
umbrella header "OverlayTest.h"
3+
4+
export *
5+
module * { export * }
6+
}
7+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// swift-interface-format-version: 1.0
2+
// swift-module-flags: -module-name OverlayTest
3+
4+
@_exported import OverlayTest
5+
6+
public extension Overlayed {
7+
public func inOverlayFunc() {}
8+
}
9+
10+
public func createOverlayedInOverlay() -> Overlayed

test/IDE/complete_overlaymodule.swift

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -I %S/Inputs/mock-sdk -F %S/Inputs/mock-sdk -code-completion-token=TYPE_GLOBAL | %FileCheck %s --check-prefix=TYPE_GLOBAL
2+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -I %S/Inputs/mock-sdk -F %S/Inputs/mock-sdk -code-completion-token=EXPR_GLOBAL | %FileCheck %s --check-prefix=EXPR_GLOBAL
3+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -I %S/Inputs/mock-sdk -F %S/Inputs/mock-sdk -code-completion-token=EXPR_MEMBER | %FileCheck %s --check-prefix=EXPR_MEMBER
4+
5+
import OverlayTest
6+
7+
func testGlobalType() {
8+
let _: #^TYPE_GLOBAL^#
9+
// TYPE_GLOBAL: Begin completions
10+
// TYPE_GLOBAL-NOT: OverlayTest[#Module#]
11+
// TYPE_GLOBAL-DAG: Decl[Module]/None: OverlayTest[#Module#];
12+
// TYPE_GLOBAL-NOT: OverlayTest[#Module#]
13+
// TYPE_GLOBAL-DAG: Decl[Struct]/OtherModule[OverlayTest.Overlayed]: Overlayed[#Overlayed#];
14+
// TYPE_GLOBAL: End completions
15+
}
16+
func testGlobalExpr() {
17+
let _ = #^EXPR_GLOBAL^#
18+
// EPXR_GLOBAL: Begin completions
19+
// EXPR_GLOBAL-NOT: OverlayTest[#Module#]
20+
// EXPR_GLOBAL-DAG: Decl[Module]/None: OverlayTest[#Module#];
21+
// EXPR_GLOBAL-NOT: OverlayTest[#Module#]
22+
// EXPR_GLOBAL-DAG: Decl[Struct]/OtherModule[OverlayTest.Overlayed]: Overlayed[#Overlayed#];
23+
// EXPR_GLOBAL-DAG: Decl[FreeFunction]/OtherModule[OverlayTest]: createOverlayedInOverlay()[#Overlayed#];
24+
// EXPR_GLOBAL-DAG: Decl[FreeFunction]/OtherModule[OverlayTest.Overlayed]: createOverlayed()[#Overlayed#];
25+
// EPXR_GLOBAL: End completions
26+
}
27+
func testGlobalExpr(value: Overlayed) {
28+
value.#^EXPR_MEMBER^#
29+
// EXPR_MEMBER: Begin completions, 6 items
30+
// EXPR_MEMBER-DAG: Keyword[self]/CurrNominal: self[#Overlayed#]; name=self
31+
// EXPR_MEMBER-DAG: Decl[InstanceVar]/CurrNominal: x[#Double#]; name=x
32+
// EXPR_MEMBER-DAG: Decl[InstanceVar]/CurrNominal: y[#Double#]; name=y
33+
// EXPR_MEMBER-DAG: Decl[InstanceVar]/CurrNominal: z[#Double#]; name=z
34+
// EXPR_MEMBER-DAG: Decl[InstanceMethod]/CurrNominal: inOverlayFunc()[#Void#]; name=inOverlayFunc()
35+
// EXPR_MEMBER-DAG: Decl[InstanceMethod]/CurrNominal: inOriginalFunc()[#Double#]; name=inOriginalFunc()
36+
// EXPR_MEMBER: End completions
37+
}

0 commit comments

Comments
 (0)