Skip to content

Commit 1114f1b

Browse files
authored
Merge pull request swiftlang#37527 from rintaro/ide-compeltion-hiddenmodule-rdar78232229
[CodeCompletion] Don't suggest underscored module name
2 parents ce63aa6 + 98324f6 commit 1114f1b

File tree

2 files changed

+102
-5
lines changed

2 files changed

+102
-5
lines changed

lib/IDE/CodeCompletion.cpp

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2079,6 +2079,12 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
20792079
IncludeInstanceMembers = true;
20802080
}
20812081

2082+
bool isHiddenModuleName(Identifier Name) {
2083+
return (Name.str().startswith("_") ||
2084+
Name == Ctx.SwiftShimsModuleName ||
2085+
Name.str() == SWIFT_ONONE_SUPPORT);
2086+
}
2087+
20822088
void addSubModuleNames(std::vector<std::pair<std::string, bool>>
20832089
&SubModuleNameVisibilityPairs) {
20842090
for (auto &Pair : SubModuleNameVisibilityPairs) {
@@ -2143,10 +2149,7 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
21432149

21442150
auto mainModuleName = CurrModule->getName();
21452151
for (auto ModuleName : ModuleNames) {
2146-
if (ModuleName.str().startswith("_") ||
2147-
ModuleName == mainModuleName ||
2148-
ModuleName == Ctx.SwiftShimsModuleName ||
2149-
ModuleName.str() == SWIFT_ONONE_SUPPORT)
2152+
if (ModuleName == mainModuleName || isHiddenModuleName(ModuleName))
21502153
continue;
21512154

21522155
auto MD = ModuleDecl::create(ModuleName, Ctx);
@@ -6249,6 +6252,25 @@ static void deliverCompletionResults(CodeCompletionContext &CompletionContext,
62496252
llvm::SmallPtrSet<Identifier, 8> seenModuleNames;
62506253
std::vector<RequestedCachedModule> RequestedModules;
62516254

6255+
SmallPtrSet<ModuleDecl *, 4> explictlyImportedModules;
6256+
{
6257+
// Collect modules directly imported in this SourceFile.
6258+
SmallVector<ImportedModule, 4> directImport;
6259+
SF.getImportedModules(directImport,
6260+
{ModuleDecl::ImportFilterKind::Default,
6261+
ModuleDecl::ImportFilterKind::ImplementationOnly});
6262+
for (auto import : directImport)
6263+
explictlyImportedModules.insert(import.importedModule);
6264+
6265+
// Exclude modules implicitly imported in the current module.
6266+
auto implicitImports = SF.getParentModule()->getImplicitImports();
6267+
for (auto import : implicitImports.imports)
6268+
explictlyImportedModules.erase(import.module.importedModule);
6269+
6270+
// Consider the current module "explicit".
6271+
explictlyImportedModules.insert(SF.getParentModule());
6272+
}
6273+
62526274
for (auto &Request: Lookup.RequestedCachedResults) {
62536275
llvm::DenseSet<CodeCompletionCache::Key> ImportsSeen;
62546276
auto handleImport = [&](ImportedModule Import) {
@@ -6297,8 +6319,11 @@ static void deliverCompletionResults(CodeCompletionContext &CompletionContext,
62976319
RequestedModules.push_back({std::move(K), TheModule,
62986320
Request.OnlyTypes, Request.OnlyPrecedenceGroups});
62996321

6322+
auto TheModuleName = TheModule->getName();
63006323
if (Request.IncludeModuleQualifier &&
6301-
seenModuleNames.insert(TheModule->getName()).second)
6324+
(!Lookup.isHiddenModuleName(TheModuleName) ||
6325+
explictlyImportedModules.contains(TheModule)) &&
6326+
seenModuleNames.insert(TheModuleName).second)
63026327
Lookup.addModuleName(TheModule);
63036328
}
63046329
};

test/IDE/complete_modulename.swift

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
// BEGIN _Helper.swift
2+
public struct HelperTy {}
3+
public func helperFunc() {}
4+
5+
// BEGIN MyModule.swift
6+
@_exported import _Helper
7+
8+
public struct MyModuleTy {}
9+
public func myModuleFunc() {}
10+
11+
// BEGIN _Explicit.swift
12+
public struct HiddenTy {}
13+
public func hiddenFunc() {}
14+
15+
// BEGIN App.swift
16+
17+
import MyModule
18+
import _Explicit
19+
20+
func test() {
21+
let _ = #^EXPR^#
22+
23+
func test() -> #^TYPE^#
24+
}
25+
26+
// EXPR: Begin completion
27+
28+
// EXPR-NOT: _Concurrency[#Module#]
29+
// EXPR-NOT: SwiftShims[#Module#]
30+
// EXPR-NOT: SwiftOnoneSupport[#Module#]
31+
// EXPR-NOT: _Helper[#Module#]
32+
33+
// EXPR-DAG: Decl[Module]/None: swift_ide_test[#Module#]; name=swift_ide_test
34+
// EXPR-DAG: Decl[Module]/None/IsSystem: Swift[#Module#]; name=Swift
35+
// EXPR-DAG: Decl[Module]/None: MyModule[#Module#]; name=MyModule
36+
// EXPR-DAG: Decl[Module]/None: _Explicit[#Module#]; name=_Explicit
37+
// EXPR-DAG: Decl[Struct]/OtherModule[MyModule]: MyModuleTy[#MyModuleTy#]; name=MyModuleTy
38+
// EXPR-DAG: Decl[Struct]/OtherModule[_Explicit]: HiddenTy[#HiddenTy#]; name=HiddenTy
39+
// EXPR-DAG: Decl[Struct]/OtherModule[_Helper]: HelperTy[#HelperTy#]; name=HelperTy
40+
// EXPR-DAG: Decl[FreeFunction]/OtherModule[MyModule]: myModuleFunc()[#Void#]; name=myModuleFunc()
41+
// EXPR-DAG: Decl[FreeFunction]/OtherModule[_Explicit]: hiddenFunc()[#Void#]; name=hiddenFunc()
42+
// EXPR-DAG: Decl[FreeFunction]/OtherModule[_Helper]: helperFunc()[#Void#]; name=helperFunc()
43+
44+
// EXPR: End completions
45+
46+
// TYPE: Begin completion
47+
48+
// TYPE-NOT: _Concurrency[#Module#]
49+
// TYPE-NOT: SwiftShims[#Module#]
50+
// TYPE-NOT: SwiftOnoneSupport[#Module#]
51+
// TYPE-NOT: _Helper[#Module#]
52+
53+
// TYPE-DAG: Decl[Module]/None: swift_ide_test[#Module#]; name=swift_ide_test
54+
// TYPE-DAG: Decl[Module]/None/IsSystem: Swift[#Module#]; name=Swift
55+
// TYPE-DAG: Decl[Module]/None: MyModule[#Module#]; name=MyModule
56+
// TYPE-DAG: Decl[Module]/None: _Explicit[#Module#]; name=_Explicit
57+
// TYPE-DAG: Decl[Struct]/OtherModule[MyModule]: MyModuleTy[#MyModuleTy#]; name=MyModuleTy
58+
// TYPE-DAG: Decl[Struct]/OtherModule[_Explicit]: HiddenTy[#HiddenTy#]; name=HiddenTy
59+
// TYPE-DAG: Decl[Struct]/OtherModule[_Helper]: HelperTy[#HelperTy#]; name=HelperTy
60+
61+
// TYPE: End completions
62+
63+
// RUN: %empty-directory(%t)
64+
// RUN: %{python} %utils/split_file.py -o %t %s
65+
66+
// RUN: %empty-directory(%t/Modules)
67+
// RUN: %target-swift-frontend -emit-module -module-name _Helper -o %t/Modules %t/_Helper.swift
68+
// RUN: %target-swift-frontend -emit-module -module-name MyModule -o %t/Modules %t/MyModule.swift -I %t/Modules
69+
// RUN: %target-swift-frontend -emit-module -module-name _Explicit -o %t/Modules %t/_Explicit.swift -I %t/Modules
70+
71+
// RUN: %empty-directory(%t/Out)
72+
// RUN: %target-swift-ide-test -batch-code-completion -source-filename %t/App.swift -filecheck %raw-FileCheck -completion-output-dir %t/Out -I %t/Modules

0 commit comments

Comments
 (0)