@@ -1317,8 +1317,21 @@ class CodeCompletionCallbacksImpl : public CodeCompletionCallbacks {
1317
1317
// / \returns true on success, false on failure.
1318
1318
bool typecheckParsedType () {
1319
1319
assert (ParsedTypeLoc.getTypeRepr () && " should have a TypeRepr" );
1320
- return !performTypeLocChecking (P.Context , ParsedTypeLoc,
1321
- CurDeclContext, false );
1320
+ if (!performTypeLocChecking (P.Context , ParsedTypeLoc,
1321
+ CurDeclContext, false ))
1322
+ return true ;
1323
+
1324
+ // It doesn't type check as a type, so see if it's a qualifying module name.
1325
+ if (auto *ITR = dyn_cast<IdentTypeRepr>(ParsedTypeLoc.getTypeRepr ())) {
1326
+ SmallVector<ImportDecl::AccessPathElement, 4 > AccessPath;
1327
+ for (auto Component : ITR->getComponentRange ())
1328
+ AccessPath.push_back ({ Component->getIdentifier (),
1329
+ Component->getIdLoc () });
1330
+ if (auto Module = Context.getLoadedModule (AccessPath))
1331
+ ParsedTypeLoc.setType (ModuleType::get (Module));
1332
+ return true ;
1333
+ }
1334
+ return false ;
1322
1335
}
1323
1336
1324
1337
public:
@@ -1583,26 +1596,37 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
1583
1596
bool OnlyTypes;
1584
1597
bool OnlyPrecedenceGroups;
1585
1598
bool NeedLeadingDot;
1599
+ bool IncludeModuleQualifier;
1586
1600
1587
1601
static RequestedResultsTy fromModule (const ModuleDecl *TheModule) {
1588
- return { TheModule, false , false , false };
1602
+ return { TheModule, false , false , false , true };
1589
1603
}
1590
1604
1591
1605
RequestedResultsTy onlyTypes () const {
1592
- return { TheModule, true , false , NeedLeadingDot };
1606
+ return { TheModule, true , false , NeedLeadingDot, IncludeModuleQualifier };
1593
1607
}
1594
1608
1595
1609
RequestedResultsTy onlyPrecedenceGroups () const {
1596
1610
assert (!OnlyTypes && " onlyTypes() already includes precedence groups" );
1597
- return { TheModule, false , true , false };
1611
+ return { TheModule, false , true , false , true };
1598
1612
}
1599
1613
1600
1614
RequestedResultsTy needLeadingDot (bool NeedDot) const {
1601
- return { TheModule, OnlyTypes, OnlyPrecedenceGroups, NeedDot };
1615
+ return {
1616
+ TheModule, OnlyTypes, OnlyPrecedenceGroups, NeedDot,
1617
+ IncludeModuleQualifier
1618
+ };
1619
+ }
1620
+
1621
+ RequestedResultsTy withModuleQualifier (bool IncludeModule) const {
1622
+ return {
1623
+ TheModule, OnlyTypes, OnlyPrecedenceGroups, NeedLeadingDot,
1624
+ IncludeModule
1625
+ };
1602
1626
}
1603
1627
1604
1628
static RequestedResultsTy toplevelResults () {
1605
- return { nullptr , false , false , false };
1629
+ return { nullptr , false , false , false , true };
1606
1630
}
1607
1631
};
1608
1632
@@ -1704,7 +1728,7 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
1704
1728
CodeCompletionResultBuilder Builder (Sink,
1705
1729
CodeCompletionResult::ResultKind::
1706
1730
Declaration,
1707
- SemanticContextKind::OtherModule ,
1731
+ SemanticContextKind::None ,
1708
1732
expectedTypeContext);
1709
1733
auto MD = ModuleDecl::create (Ctx.getIdentifier (Pair.first ), Ctx);
1710
1734
Builder.setAssociatedDecl (MD);
@@ -1741,6 +1765,21 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
1741
1765
}
1742
1766
}
1743
1767
1768
+ void addModuleName (
1769
+ const ModuleDecl *MD,
1770
+ Optional<CodeCompletionResult::NotRecommendedReason> R = None) {
1771
+ CodeCompletionResultBuilder Builder (
1772
+ Sink,
1773
+ CodeCompletionResult::ResultKind::Declaration,
1774
+ SemanticContextKind::None,
1775
+ expectedTypeContext);
1776
+ Builder.setAssociatedDecl (MD);
1777
+ Builder.addTextChunk (MD->getNameStr ());
1778
+ Builder.addTypeAnnotation (" Module" );
1779
+ if (R)
1780
+ Builder.setNotRecommended (*R);
1781
+ }
1782
+
1744
1783
void addImportModuleNames () {
1745
1784
SmallVector<Identifier, 0 > ModuleNames;
1746
1785
Ctx.getVisibleTopLevelModuleNames (ModuleNames);
@@ -1757,19 +1796,13 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
1757
1796
continue ;
1758
1797
1759
1798
auto MD = ModuleDecl::create (ModuleName, Ctx);
1760
- CodeCompletionResultBuilder Builder (
1761
- Sink,
1762
- CodeCompletionResult::ResultKind::Declaration,
1763
- SemanticContextKind::OtherModule,
1764
- expectedTypeContext);
1765
- Builder.setAssociatedDecl (MD);
1766
- Builder.addTextChunk (MD->getNameStr ());
1767
- Builder.addTypeAnnotation (" Module" );
1799
+ Optional<CodeCompletionResult::NotRecommendedReason> Reason = None;
1768
1800
1769
1801
// Imported modules are not recommended.
1770
1802
if (ImportedModules.count (MD->getNameStr ()) != 0 )
1771
- Builder.setNotRecommended (
1772
- CodeCompletionResult::NotRecommendedReason::Redundant);
1803
+ Reason = CodeCompletionResult::NotRecommendedReason::Redundant;
1804
+
1805
+ addModuleName (MD, Reason);
1773
1806
}
1774
1807
}
1775
1808
@@ -3203,13 +3236,17 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
3203
3236
return false ;
3204
3237
}
3205
3238
3206
- bool tryModuleCompletions (Type ExprType) {
3239
+ bool tryModuleCompletions (Type ExprType, bool TypesOnly = false ) {
3207
3240
if (auto MT = ExprType->getAs <ModuleType>()) {
3208
3241
ModuleDecl *M = MT->getModule ();
3209
3242
if (CurrModule != M) {
3210
3243
// Only use the cache if it is not the current module.
3211
- RequestedCachedResults.push_back (
3212
- RequestedResultsTy::fromModule (M).needLeadingDot (needDot ()));
3244
+ RequestedResultsTy Request = RequestedResultsTy::fromModule (M)
3245
+ .needLeadingDot (needDot ())
3246
+ .withModuleQualifier (false );
3247
+ if (TypesOnly)
3248
+ Request = Request.onlyTypes ();
3249
+ RequestedCachedResults.push_back (Request);
3213
3250
return true ;
3214
3251
}
3215
3252
}
@@ -3767,17 +3804,16 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
3767
3804
3768
3805
void getValueCompletionsInDeclContext (SourceLoc Loc,
3769
3806
DeclFilter Filter = DefaultFilter,
3770
- bool IncludeTopLevel = false ,
3771
- bool RequestCache = true ,
3772
- bool LiteralCompletions = true ) {
3807
+ bool LiteralCompletions = true ,
3808
+ bool ModuleQualifier = true ) {
3773
3809
ExprType = Type ();
3774
3810
Kind = LookupKind::ValueInDeclContext;
3775
3811
NeedLeadingDot = false ;
3776
3812
FilteredDeclConsumer Consumer (*this , Filter);
3777
3813
lookupVisibleDecls (Consumer, CurrDeclContext,
3778
- /* IncludeTopLevel=*/ IncludeTopLevel , Loc);
3779
- if (RequestCache )
3780
- RequestedCachedResults. push_back ( RequestedResultsTy::toplevelResults ( ));
3814
+ /* IncludeTopLevel=*/ false , Loc);
3815
+ RequestedCachedResults. push_back ( RequestedResultsTy::toplevelResults ( )
3816
+ . withModuleQualifier (ModuleQualifier ));
3781
3817
3782
3818
// Manually add any expected nominal types from imported modules so that
3783
3819
// they get their expected type relation. Don't include protocols, since
@@ -3875,6 +3911,8 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
3875
3911
}
3876
3912
3877
3913
void getTypeCompletions (Type BaseType) {
3914
+ if (tryModuleCompletions (BaseType, /* OnlyTypes=*/ true ))
3915
+ return ;
3878
3916
Kind = LookupKind::Type;
3879
3917
this ->BaseType = BaseType;
3880
3918
NeedLeadingDot = !HaveDot;
@@ -3884,7 +3922,7 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
3884
3922
if (BaseType->isAnyExistentialType ()) {
3885
3923
addKeyword (" Protocol" , MetatypeType::get (BaseType));
3886
3924
addKeyword (" Type" , ExistentialMetatypeType::get (BaseType));
3887
- } else {
3925
+ } else if (!BaseType-> is <ModuleType>()) {
3888
3926
addKeyword (" Type" , MetatypeType::get (BaseType));
3889
3927
}
3890
3928
}
@@ -3962,8 +4000,9 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
3962
4000
if (Module == CurrModule)
3963
4001
continue ;
3964
4002
3965
- RequestedCachedResults.push_back (
3966
- RequestedResultsTy::fromModule (Module).onlyPrecedenceGroups ());
4003
+ RequestedCachedResults.push_back (RequestedResultsTy::fromModule (Module)
4004
+ .onlyPrecedenceGroups ()
4005
+ .withModuleQualifier (false ));
3967
4006
}
3968
4007
}
3969
4008
@@ -4000,13 +4039,16 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
4000
4039
getAttributeDeclParamCompletions (DAK_Available, 0 );
4001
4040
}
4002
4041
4003
- void getTypeCompletionsInDeclContext (SourceLoc Loc) {
4042
+ void getTypeCompletionsInDeclContext (SourceLoc Loc,
4043
+ bool ModuleQualifier = true ) {
4004
4044
Kind = LookupKind::TypeInDeclContext;
4005
4045
lookupVisibleDecls (*this , CurrDeclContext,
4006
4046
/* IncludeTopLevel=*/ false , Loc);
4007
4047
4008
4048
RequestedCachedResults.push_back (
4009
- RequestedResultsTy::toplevelResults ().onlyTypes ());
4049
+ RequestedResultsTy::toplevelResults ()
4050
+ .onlyTypes ()
4051
+ .withModuleQualifier (ModuleQualifier));
4010
4052
}
4011
4053
4012
4054
void getToplevelCompletions (bool OnlyTypes) {
@@ -5273,7 +5315,7 @@ void CodeCompletionCallbacksImpl::doneParsing() {
5273
5315
} else {
5274
5316
SourceLoc Loc = P.Context .SourceMgr .getCodeCompletionLoc ();
5275
5317
Lookup.getValueCompletionsInDeclContext (Loc, KeyPathFilter,
5276
- false , true , false );
5318
+ /* LiteralCompletions= */ false );
5277
5319
}
5278
5320
break ;
5279
5321
}
@@ -5508,6 +5550,8 @@ void CodeCompletionCallbacksImpl::doneParsing() {
5508
5550
return ; // already handled.
5509
5551
RequestedModules.push_back ({std::move (K), TheModule,
5510
5552
Request.OnlyTypes , Request.OnlyPrecedenceGroups });
5553
+ if (Request.IncludeModuleQualifier )
5554
+ Lookup.addModuleName (TheModule);
5511
5555
}
5512
5556
};
5513
5557
@@ -5520,6 +5564,10 @@ void CodeCompletionCallbacksImpl::doneParsing() {
5520
5564
// Add results from current module.
5521
5565
Lookup.getToplevelCompletions (Request.OnlyTypes );
5522
5566
5567
+ // Add the qualifying module name
5568
+ if (Request.IncludeModuleQualifier )
5569
+ Lookup.addModuleName (CurDeclContext->getParentModule ());
5570
+
5523
5571
// Add results for all imported modules.
5524
5572
ModuleDecl::ImportFilter ImportFilter;
5525
5573
ImportFilter |= ModuleDecl::ImportFilterKind::Public;
0 commit comments