Skip to content

Commit fd5076e

Browse files
authored
Merge pull request #77698 from hamishknight/complete-inverted
[Completion] Fix invertible type completion
2 parents e4e0760 + c19d049 commit fd5076e

File tree

7 files changed

+46
-29
lines changed

7 files changed

+46
-29
lines changed

include/swift/IDE/CodeCompletionResult.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ enum class CompletionKind : uint8_t {
204204
TypeSimpleBeginning,
205205
TypeSimpleWithDot,
206206
TypeSimpleWithoutDot,
207+
TypeSimpleInverted,
207208
CaseStmtKeyword,
208209
CaseStmtBeginning,
209210
NominalMemberBeginning,
@@ -231,9 +232,6 @@ enum class CompletionKind : uint8_t {
231232
TypeAttrBeginning,
232233
TypeAttrInheritanceBeginning,
233234
OptionalBinding,
234-
235-
/// Completion after `~` in an inheritance clause.
236-
WithoutConstraintType
237235
};
238236

239237
enum class CodeCompletionDiagnosticSeverity : uint8_t {

include/swift/IDE/CompletionLookup.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -593,6 +593,9 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
593593

594594
void getTypeCompletions(Type BaseType);
595595

596+
/// Add completions for types that can appear after a \c ~ prefix.
597+
void getInvertedTypeCompletions();
598+
596599
void getGenericRequirementCompletions(DeclContext *DC,
597600
SourceLoc CodeCompletionLoc);
598601

@@ -631,8 +634,6 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
631634
void getStmtLabelCompletions(SourceLoc Loc, bool isContinue);
632635

633636
void getOptionalBindingCompletions(SourceLoc Loc);
634-
635-
void addWithoutConstraintTypes();
636637
};
637638

638639
} // end namespace ide

include/swift/Parse/IDEInspectionCallbacks.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,9 @@ class CodeCompletionCallbacks {
204204
/// Complete a given \c type-simple when there is no trailing dot.
205205
virtual void completeTypeSimpleWithoutDot(TypeRepr *TR){};
206206

207+
/// Complete a given \c type-simple following a \c ~ prefix.
208+
virtual void completeTypeSimpleInverted() {};
209+
207210
/// Complete the beginning of a case statement at the top of switch stmt.
208211
virtual void completeCaseStmtKeyword() {};
209212

@@ -291,8 +294,6 @@ class CodeCompletionCallbacks {
291294
virtual void completeTypeAttrInheritanceBeginning() {};
292295

293296
virtual void completeOptionalBinding(){};
294-
295-
virtual void completeWithoutConstraintType(){};
296297
};
297298

298299
class DoneParsingCallback {

lib/IDE/CodeCompletion.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ class CodeCompletionCallbacksImpl : public CodeCompletionCallbacks,
267267
void completeTypeSimpleBeginning() override;
268268
void completeTypeSimpleWithDot(TypeRepr *TR) override;
269269
void completeTypeSimpleWithoutDot(TypeRepr *TR) override;
270+
void completeTypeSimpleInverted() override;
270271

271272
void completeCaseStmtKeyword() override;
272273
void completeCaseStmtBeginning(CodeCompletionExpr *E) override;
@@ -305,7 +306,6 @@ class CodeCompletionCallbacksImpl : public CodeCompletionCallbacks,
305306
void completeTypeAttrBeginning() override;
306307
void completeTypeAttrInheritanceBeginning() override;
307308
void completeOptionalBinding() override;
308-
void completeWithoutConstraintType() override;
309309

310310
void doneParsing(SourceFile *SrcFile) override;
311311

@@ -509,6 +509,11 @@ void CodeCompletionCallbacksImpl::completeTypeSimpleWithoutDot(TypeRepr *TR) {
509509
CurDeclContext = P.CurDeclContext;
510510
}
511511

512+
void CodeCompletionCallbacksImpl::completeTypeSimpleInverted() {
513+
Kind = CompletionKind::TypeSimpleInverted;
514+
CurDeclContext = P.CurDeclContext;
515+
}
516+
512517
void CodeCompletionCallbacksImpl::completeCaseStmtKeyword() {
513518
Kind = CompletionKind::CaseStmtKeyword;
514519
CurDeclContext = P.CurDeclContext;
@@ -646,11 +651,6 @@ void CodeCompletionCallbacksImpl::completeOptionalBinding() {
646651
Kind = CompletionKind::OptionalBinding;
647652
}
648653

649-
void CodeCompletionCallbacksImpl::completeWithoutConstraintType() {
650-
CurDeclContext = P.CurDeclContext;
651-
Kind = CompletionKind::WithoutConstraintType;
652-
}
653-
654654
void CodeCompletionCallbacksImpl::completeTypeAttrBeginning() {
655655
CurDeclContext = P.CurDeclContext;
656656
Kind = CompletionKind::TypeAttrBeginning;
@@ -993,7 +993,6 @@ void CodeCompletionCallbacksImpl::addKeywords(CodeCompletionResultSink &Sink,
993993
case CompletionKind::TypeAttrBeginning:
994994
case CompletionKind::TypeAttrInheritanceBeginning:
995995
case CompletionKind::OptionalBinding:
996-
case CompletionKind::WithoutConstraintType:
997996
break;
998997

999998
case CompletionKind::EffectsSpecifier:
@@ -1066,6 +1065,7 @@ void CodeCompletionCallbacksImpl::addKeywords(CodeCompletionResultSink &Sink,
10661065
break;
10671066
case CompletionKind::CaseStmtBeginning:
10681067
case CompletionKind::TypeSimpleWithDot:
1068+
case CompletionKind::TypeSimpleInverted:
10691069
break;
10701070

10711071
case CompletionKind::TypeSimpleWithoutDot:
@@ -1296,9 +1296,9 @@ void swift::ide::postProcessCompletionResults(
12961296
Kind != CompletionKind::TypeSimpleBeginning &&
12971297
Kind != CompletionKind::TypeSimpleWithoutDot &&
12981298
Kind != CompletionKind::TypeSimpleWithDot &&
1299+
Kind != CompletionKind::TypeSimpleInverted &&
12991300
Kind != CompletionKind::TypeDeclResultBeginning &&
1300-
Kind != CompletionKind::GenericRequirement &&
1301-
Kind != CompletionKind::WithoutConstraintType) {
1301+
Kind != CompletionKind::GenericRequirement) {
13021302
flair |= CodeCompletionFlairBit::RareTypeAtCurrentPosition;
13031303
modified = true;
13041304
}
@@ -1807,6 +1807,11 @@ void CodeCompletionCallbacksImpl::doneParsing(SourceFile *SrcFile) {
18071807
break;
18081808
}
18091809

1810+
case CompletionKind::TypeSimpleInverted: {
1811+
Lookup.getInvertedTypeCompletions();
1812+
break;
1813+
}
1814+
18101815
case CompletionKind::NominalMemberBeginning: {
18111816
CompletionOverrideLookup OverrideLookup(CompletionContext.getResultSink(),
18121817
P.Context, CurDeclContext,
@@ -1955,11 +1960,6 @@ void CodeCompletionCallbacksImpl::doneParsing(SourceFile *SrcFile) {
19551960
break;
19561961
}
19571962

1958-
case CompletionKind::WithoutConstraintType: {
1959-
Lookup.addWithoutConstraintTypes();
1960-
break;
1961-
}
1962-
19631963
case CompletionKind::AfterIfStmtElse:
19641964
case CompletionKind::CaseStmtKeyword:
19651965
case CompletionKind::EffectsSpecifier:

lib/IDE/CompletionLookup.cpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2964,6 +2964,22 @@ void CompletionLookup::getTypeCompletions(Type BaseType) {
29642964
}
29652965
}
29662966

2967+
void CompletionLookup::getInvertedTypeCompletions() {
2968+
Kind = LookupKind::Type;
2969+
2970+
auto addCompletion = [&](InvertibleProtocolKind invertableKind) {
2971+
auto *P = Ctx.getProtocol(getKnownProtocolKind(invertableKind));
2972+
if (!P)
2973+
return;
2974+
2975+
addNominalTypeRef(P, DeclVisibilityKind::VisibleAtTopLevel,
2976+
DynamicLookupInfo());
2977+
};
2978+
#define INVERTIBLE_PROTOCOL(Name, Bit) \
2979+
addCompletion(InvertibleProtocolKind::Name);
2980+
#include "swift/ABI/InvertibleProtocols.def"
2981+
}
2982+
29672983
void CompletionLookup::getGenericRequirementCompletions(
29682984
DeclContext *DC, SourceLoc CodeCompletionLoc) {
29692985
auto genericSig = DC->getGenericSignatureOfContext();
@@ -3490,9 +3506,3 @@ void CompletionLookup::getOptionalBindingCompletions(SourceLoc Loc) {
34903506
lookupVisibleDecls(FilteringConsumer, Loc, CurrDeclContext,
34913507
/*IncludeTopLevel=*/false);
34923508
}
3493-
3494-
void CompletionLookup::addWithoutConstraintTypes() {
3495-
auto *CopyableDecl = Ctx.getProtocol(KnownProtocolKind::Copyable);
3496-
addNominalTypeRef(CopyableDecl, DeclVisibilityKind::VisibleAtTopLevel,
3497-
DynamicLookupInfo());
3498-
}

lib/Parse/ParseType.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,11 @@ ParserResult<TypeRepr> Parser::parseTypeSimple(
227227
break;
228228
case tok::code_complete:
229229
if (CodeCompletionCallbacks) {
230-
CodeCompletionCallbacks->completeTypeSimpleBeginning();
230+
if (tildeLoc.isValid()) {
231+
CodeCompletionCallbacks->completeTypeSimpleInverted();
232+
} else {
233+
CodeCompletionCallbacks->completeTypeSimpleBeginning();
234+
}
231235
}
232236
return makeParserCodeCompletionResult<TypeRepr>(
233237
ErrorTypeRepr::create(Context, consumeToken(tok::code_complete)));
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
// RUN: %batch-code-completion
22

3+
// rdar://139212286 - We should only suggest invertible types here.
34
struct FileDescriptor: ~#^COMPLETE^# {}
4-
// COMPLETE: Decl[Protocol]/OtherModule[Swift]/IsSystem: Copyable[#Copyable#]; name=Copyable
5+
// COMPLETE: Begin completions, 2 items
6+
// COMPLETE-DAG: Decl[Protocol]/OtherModule[Swift]/IsSystem: Copyable[#Copyable#]; name=Copyable
7+
// COMPLETE-DAG: Decl[Protocol]/OtherModule[Swift]/IsSystem: Escapable[#Escapable#]; name=Escapable

0 commit comments

Comments
 (0)