@@ -708,9 +708,6 @@ void CodeCompletionResult::printPrefix(raw_ostream &OS) const {
708
708
case SemanticContextKind::None:
709
709
Prefix.append (" None" );
710
710
break ;
711
- case SemanticContextKind::ExpressionSpecific:
712
- Prefix.append (" ExprSpecific" );
713
- break ;
714
711
case SemanticContextKind::Local:
715
712
Prefix.append (" Local" );
716
713
break ;
@@ -732,6 +729,19 @@ void CodeCompletionResult::printPrefix(raw_ostream &OS) const {
732
729
Prefix.append ((Twine (" [" ) + ModuleName + " ]" ).str ());
733
730
break ;
734
731
}
732
+ if (getFlair ().toRaw ()) {
733
+ Prefix.append (" /Flair[" );
734
+ bool isFirstFlair = true ;
735
+ #define PRINT_FLAIR (KIND, NAME ) \
736
+ if (getFlair ().contains (CodeCompletionFlairBit::KIND)) { \
737
+ if (isFirstFlair) { isFirstFlair = false ; } \
738
+ else { Prefix.append (" ," ); } \
739
+ Prefix.append (NAME); \
740
+ }
741
+ PRINT_FLAIR (ExpressionSpecific, " ExprSpecific" );
742
+ PRINT_FLAIR (SuperChain, " SuperChain" );
743
+ Prefix.append (" ]" );
744
+ }
735
745
if (NotRecommended)
736
746
Prefix.append (" /NotRecommended" );
737
747
if (IsSystem)
@@ -1294,7 +1304,7 @@ CodeCompletionResult *CodeCompletionResultBuilder::takeResult() {
1294
1304
}
1295
1305
1296
1306
return new (*Sink.Allocator ) CodeCompletionResult (
1297
- SemanticContext, IsArgumentLabels, NumBytesToErase, CCS, AssociatedDecl,
1307
+ SemanticContext, Flair, IsArgumentLabels, NumBytesToErase, CCS, AssociatedDecl,
1298
1308
ModuleName, NotRecReason, copyString (*Sink.Allocator , BriefComment),
1299
1309
copyAssociatedUSRs (*Sink.Allocator , AssociatedDecl),
1300
1310
copyArray (*Sink.Allocator , CommentWords), ExpectedTypeRelation);
@@ -1303,21 +1313,21 @@ CodeCompletionResult *CodeCompletionResultBuilder::takeResult() {
1303
1313
case CodeCompletionResult::ResultKind::Keyword:
1304
1314
return new (*Sink.Allocator )
1305
1315
CodeCompletionResult (
1306
- KeywordKind, SemanticContext, IsArgumentLabels, NumBytesToErase,
1316
+ KeywordKind, SemanticContext, Flair, IsArgumentLabels, NumBytesToErase,
1307
1317
CCS, ExpectedTypeRelation,
1308
1318
copyString (*Sink.Allocator , BriefDocComment));
1309
1319
1310
1320
case CodeCompletionResult::ResultKind::BuiltinOperator:
1311
1321
case CodeCompletionResult::ResultKind::Pattern:
1312
1322
return new (*Sink.Allocator ) CodeCompletionResult (
1313
- Kind, SemanticContext, IsArgumentLabels, NumBytesToErase, CCS,
1323
+ Kind, SemanticContext, Flair, IsArgumentLabels, NumBytesToErase, CCS,
1314
1324
ExpectedTypeRelation, CodeCompletionOperatorKind::None,
1315
1325
copyString (*Sink.Allocator , BriefDocComment));
1316
1326
1317
1327
case CodeCompletionResult::ResultKind::Literal:
1318
1328
assert (LiteralKind.hasValue ());
1319
1329
return new (*Sink.Allocator )
1320
- CodeCompletionResult (*LiteralKind, SemanticContext, IsArgumentLabels,
1330
+ CodeCompletionResult (*LiteralKind, SemanticContext, Flair, IsArgumentLabels,
1321
1331
NumBytesToErase, CCS, ExpectedTypeRelation);
1322
1332
}
1323
1333
@@ -2180,9 +2190,6 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
2180
2190
return SemanticContextKind::Local;
2181
2191
2182
2192
case DeclVisibilityKind::MemberOfCurrentNominal:
2183
- if (IsSuperRefExpr &&
2184
- CurrentMethod && CurrentMethod->getOverriddenDecl () == D)
2185
- return SemanticContextKind::ExpressionSpecific;
2186
2193
return SemanticContextKind::CurrentNominal;
2187
2194
2188
2195
case DeclVisibilityKind::MemberOfProtocolConformedToByCurrentNominal:
@@ -2644,7 +2651,7 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
2644
2651
Builder.addAnnotatedAsync ();
2645
2652
2646
2653
if (isUnresolvedMemberIdealType (VarType))
2647
- Builder.setSemanticContext (SemanticContextKind ::ExpressionSpecific);
2654
+ Builder.addFlair (CodeCompletionFlairBit ::ExpressionSpecific);
2648
2655
}
2649
2656
2650
2657
static bool hasInterestingDefaultValues (const AbstractFunctionDecl *func) {
@@ -2782,7 +2789,10 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
2782
2789
if (ParentKind != StmtKind::If && ParentKind != StmtKind::Guard)
2783
2790
return ;
2784
2791
CodeCompletionResultBuilder Builder (Sink, CodeCompletionResult::ResultKind::Keyword,
2785
- SemanticContextKind::ExpressionSpecific, expectedTypeContext);
2792
+ // FIXME: SemanticContextKind::Local is not correct.
2793
+ // Use 'None' (and fix prioritization) or introduce a new context.
2794
+ SemanticContextKind::Local, expectedTypeContext);
2795
+ Builder.addFlair (CodeCompletionFlairBit::ExpressionSpecific);
2786
2796
Builder.addBaseName (" available" );
2787
2797
Builder.addLeftParen ();
2788
2798
Builder.addSimpleTypedParameter (" Platform" , /* IsVarArg=*/ true );
@@ -3072,6 +3082,10 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
3072
3082
setClangDeclKeywords (FD, Pairs, Builder);
3073
3083
Builder.setAssociatedDecl (FD);
3074
3084
3085
+ if (IsSuperRefExpr && CurrentMethod &&
3086
+ CurrentMethod->getOverriddenDecl () == FD)
3087
+ Builder.addFlair (CodeCompletionFlairBit::SuperChain);
3088
+
3075
3089
if (NotRecommended)
3076
3090
Builder.setNotRecommended (*NotRecommended);
3077
3091
@@ -3161,7 +3175,7 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
3161
3175
ResultType, expectedTypeContext, CurrDeclContext));
3162
3176
3163
3177
if (isUnresolvedMemberIdealType (ResultType))
3164
- Builder.setSemanticContext (SemanticContextKind ::ExpressionSpecific);
3178
+ Builder.addFlair (CodeCompletionFlairBit ::ExpressionSpecific);
3165
3179
3166
3180
if (!IsImplicitlyCurriedInstanceMethod &&
3167
3181
expectedTypeContext.requiresNonVoid () &&
@@ -3215,6 +3229,11 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
3215
3229
expectedTypeContext);
3216
3230
setClangDeclKeywords (CD, Pairs, Builder);
3217
3231
Builder.setAssociatedDecl (CD);
3232
+
3233
+ if (IsSuperRefExpr && CurrentMethod &&
3234
+ CurrentMethod->getOverriddenDecl () == CD)
3235
+ Builder.addFlair (CodeCompletionFlairBit::SuperChain);
3236
+
3218
3237
if (needInit) {
3219
3238
assert (addName.empty ());
3220
3239
addLeadingDot (Builder);
@@ -3458,11 +3477,13 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
3458
3477
CommandWordsPairs Pairs;
3459
3478
CodeCompletionResultBuilder Builder (
3460
3479
Sink, CodeCompletionResult::ResultKind::Declaration,
3461
- HasTypeContext ? SemanticContextKind::ExpressionSpecific
3462
- : getSemanticContext (EED, Reason, dynamicLookupInfo),
3480
+ getSemanticContext (EED, Reason, dynamicLookupInfo),
3463
3481
expectedTypeContext);
3464
3482
Builder.setAssociatedDecl (EED);
3465
3483
setClangDeclKeywords (EED, Pairs, Builder);
3484
+ if (HasTypeContext)
3485
+ Builder.addFlair (CodeCompletionFlairBit::ExpressionSpecific);
3486
+
3466
3487
addLeadingDot (Builder);
3467
3488
addValueBaseName (Builder, EED->getBaseIdentifier ());
3468
3489
@@ -3486,7 +3507,7 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
3486
3507
addTypeAnnotation (Builder, EnumType, EED->getGenericSignatureOfContext ());
3487
3508
3488
3509
if (isUnresolvedMemberIdealType (EnumType))
3489
- Builder.setSemanticContext (SemanticContextKind ::ExpressionSpecific);
3510
+ Builder.addFlair (CodeCompletionFlairBit ::ExpressionSpecific);
3490
3511
}
3491
3512
3492
3513
void addKeyword (StringRef Name, Type TypeAnnotation = Type(),
@@ -4579,13 +4600,17 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
4579
4600
continue ;
4580
4601
CodeCompletionResultBuilder Builder (
4581
4602
Sink, CodeCompletionResult::ResultKind::Pattern,
4582
- SemanticContextKind::ExpressionSpecific, {});
4603
+ // FIXME: SemanticContextKind::Local is not correct.
4604
+ // Use 'None' (and fix prioritization) or introduce a new context.
4605
+ SemanticContextKind::Local, {});
4583
4606
Builder.addCallParameter (Arg->getLabel (), Identifier (),
4584
4607
Arg->getPlainType (), ContextType,
4585
4608
Arg->isVariadic (), Arg->isInOut (),
4586
4609
/* isIUO=*/ false , Arg->isAutoClosure (),
4587
4610
/* useUnderscoreLabel=*/ true ,
4588
4611
isLabeledTrailingClosure);
4612
+ Builder.setIsArgumentLabels ();
4613
+ Builder.addFlair (CodeCompletionFlairBit::ExpressionSpecific);
4589
4614
auto Ty = Arg->getPlainType ();
4590
4615
if (Arg->isInOut ()) {
4591
4616
Ty = InOutType::get (Ty);
@@ -6202,12 +6227,16 @@ static void addPlatformConditions(CodeCompletionResultSink &Sink) {
6202
6227
consumer) {
6203
6228
CodeCompletionResultBuilder Builder (
6204
6229
Sink, CodeCompletionResult::ResultKind::Pattern,
6205
- SemanticContextKind::ExpressionSpecific, {});
6230
+ // FIXME: SemanticContextKind::CurrentModule is not correct.
6231
+ // Use 'None' (and fix prioritization) or introduce a new context.
6232
+ SemanticContextKind::CurrentModule, {});
6233
+ Builder.addFlair (CodeCompletionFlairBit::ExpressionSpecific);
6206
6234
Builder.addBaseName (Name);
6207
6235
Builder.addLeftParen ();
6208
6236
consumer (Builder);
6209
6237
Builder.addRightParen ();
6210
6238
};
6239
+
6211
6240
addWithName (" os" , [](CodeCompletionResultBuilder &Builder) {
6212
6241
Builder.addSimpleNamedParameter (" name" );
6213
6242
});
@@ -6248,7 +6277,10 @@ static void addConditionalCompilationFlags(ASTContext &Ctx,
6248
6277
// TODO: Should we filter out some flags?
6249
6278
CodeCompletionResultBuilder Builder (
6250
6279
Sink, CodeCompletionResult::ResultKind::Keyword,
6251
- SemanticContextKind::ExpressionSpecific, {});
6280
+ // FIXME: SemanticContextKind::CurrentModule is not correct.
6281
+ // Use 'None' (and fix prioritization) or introduce a new context.
6282
+ SemanticContextKind::CurrentModule, {});
6283
+ Builder.addFlair (CodeCompletionFlairBit::ExpressionSpecific);
6252
6284
Builder.addTextChunk (Flag);
6253
6285
}
6254
6286
}
0 commit comments