Skip to content

Commit c76484b

Browse files
committed
[CodeCompletion] Suggest explicitly imported modules regaredless
(cherry picked from commit 98324f6)
1 parent 7426809 commit c76484b

File tree

2 files changed

+48
-9
lines changed

2 files changed

+48
-9
lines changed

lib/IDE/CodeCompletion.cpp

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6234,6 +6234,25 @@ static void deliverCompletionResults(CodeCompletionContext &CompletionContext,
62346234
llvm::SmallPtrSet<Identifier, 8> seenModuleNames;
62356235
std::vector<RequestedCachedModule> RequestedModules;
62366236

6237+
SmallPtrSet<ModuleDecl *, 4> explictlyImportedModules;
6238+
{
6239+
// Collect modules directly imported in this SourceFile.
6240+
SmallVector<ImportedModule, 4> directImport;
6241+
SF.getImportedModules(directImport,
6242+
{ModuleDecl::ImportFilterKind::Default,
6243+
ModuleDecl::ImportFilterKind::ImplementationOnly});
6244+
for (auto import : directImport)
6245+
explictlyImportedModules.insert(import.importedModule);
6246+
6247+
// Exclude modules implicitly imported in the current module.
6248+
auto implicitImports = SF.getParentModule()->getImplicitImports();
6249+
for (auto import : implicitImports.imports)
6250+
explictlyImportedModules.erase(import.module.importedModule);
6251+
6252+
// Consider the current module "explicit".
6253+
explictlyImportedModules.insert(SF.getParentModule());
6254+
}
6255+
62376256
for (auto &Request: Lookup.RequestedCachedResults) {
62386257
llvm::DenseSet<CodeCompletionCache::Key> ImportsSeen;
62396258
auto handleImport = [&](ImportedModule Import) {
@@ -6284,7 +6303,8 @@ static void deliverCompletionResults(CodeCompletionContext &CompletionContext,
62846303

62856304
auto TheModuleName = TheModule->getName();
62866305
if (Request.IncludeModuleQualifier &&
6287-
!Lookup.isHiddenModuleName(TheModuleName) &&
6306+
(!Lookup.isHiddenModuleName(TheModuleName) ||
6307+
explictlyImportedModules.contains(TheModule)) &&
62886308
seenModuleNames.insert(TheModuleName).second)
62896309
Lookup.addModuleName(TheModule);
62906310
}

test/IDE/complete_modulename.swift

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
1+
// BEGIN _Helper.swift
2+
public struct HelperTy {}
3+
public func helperFunc() {}
4+
15
// BEGIN MyModule.swift
6+
@_exported import _Helper
7+
28
public struct MyModuleTy {}
39
public func myModuleFunc() {}
410

5-
6-
// BEGIN _Hidden.swift
11+
// BEGIN _Explicit.swift
712
public struct HiddenTy {}
813
public func hiddenFunc() {}
914

1015
// BEGIN App.swift
1116

1217
import MyModule
13-
import _Hidden
18+
import _Explicit
1419

1520
func test() {
1621
let _ = #^EXPR^#
@@ -19,35 +24,49 @@ func test() {
1924
}
2025

2126
// EXPR: Begin completion
27+
2228
// EXPR-NOT: _Concurrency[#Module#]
2329
// EXPR-NOT: SwiftShims[#Module#]
2430
// EXPR-NOT: SwiftOnoneSupport[#Module#]
31+
// EXPR-NOT: _Helper[#Module#]
32+
2533
// EXPR-DAG: Decl[Module]/None: swift_ide_test[#Module#]; name=swift_ide_test
2634
// EXPR-DAG: Decl[Module]/None/IsSystem: Swift[#Module#]; name=Swift
2735
// EXPR-DAG: Decl[Module]/None: MyModule[#Module#]; name=MyModule
36+
// EXPR-DAG: Decl[Module]/None: _Explicit[#Module#]; name=_Explicit
2837
// EXPR-DAG: Decl[Struct]/OtherModule[MyModule]: MyModuleTy[#MyModuleTy#]; name=MyModuleTy
29-
// EXPR-DAG: Decl[Struct]/OtherModule[_Hidden]: HiddenTy[#HiddenTy#]; name=HiddenTy
38+
// EXPR-DAG: Decl[Struct]/OtherModule[_Explicit]: HiddenTy[#HiddenTy#]; name=HiddenTy
39+
// EXPR-DAG: Decl[Struct]/OtherModule[_Helper]: HelperTy[#HelperTy#]; name=HelperTy
3040
// EXPR-DAG: Decl[FreeFunction]/OtherModule[MyModule]: myModuleFunc()[#Void#]; name=myModuleFunc()
31-
// EXPR-DAG: Decl[FreeFunction]/OtherModule[_Hidden]: hiddenFunc()[#Void#]; name=hiddenFunc()
41+
// EXPR-DAG: Decl[FreeFunction]/OtherModule[_Explicit]: hiddenFunc()[#Void#]; name=hiddenFunc()
42+
// EXPR-DAG: Decl[FreeFunction]/OtherModule[_Helper]: helperFunc()[#Void#]; name=helperFunc()
43+
3244
// EXPR: End completions
3345

3446
// TYPE: Begin completion
47+
3548
// TYPE-NOT: _Concurrency[#Module#]
3649
// TYPE-NOT: SwiftShims[#Module#]
3750
// TYPE-NOT: SwiftOnoneSupport[#Module#]
51+
// TYPE-NOT: _Helper[#Module#]
52+
3853
// TYPE-DAG: Decl[Module]/None: swift_ide_test[#Module#]; name=swift_ide_test
3954
// TYPE-DAG: Decl[Module]/None/IsSystem: Swift[#Module#]; name=Swift
4055
// TYPE-DAG: Decl[Module]/None: MyModule[#Module#]; name=MyModule
56+
// TYPE-DAG: Decl[Module]/None: _Explicit[#Module#]; name=_Explicit
4157
// TYPE-DAG: Decl[Struct]/OtherModule[MyModule]: MyModuleTy[#MyModuleTy#]; name=MyModuleTy
42-
// TYPE-DAG: Decl[Struct]/OtherModule[_Hidden]: HiddenTy[#HiddenTy#]; name=HiddenTy
58+
// TYPE-DAG: Decl[Struct]/OtherModule[_Explicit]: HiddenTy[#HiddenTy#]; name=HiddenTy
59+
// TYPE-DAG: Decl[Struct]/OtherModule[_Helper]: HelperTy[#HelperTy#]; name=HelperTy
60+
4361
// TYPE: End completions
4462

4563
// RUN: %empty-directory(%t)
4664
// RUN: %{python} %utils/split_file.py -o %t %s
4765

4866
// RUN: %empty-directory(%t/Modules)
49-
// RUN: %target-swift-frontend -emit-module -module-name MyModule -o %t/Modules %t/MyModule.swift
50-
// RUN: %target-swift-frontend -emit-module -module-name _Hidden -o %t/Modules %t/_Hidden.swift
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
5170

5271
// RUN: %empty-directory(%t/Out)
5372
// 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)