@@ -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:
@@ -2639,7 +2646,7 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
2639
2646
Builder.addAnnotatedAsync ();
2640
2647
2641
2648
if (isUnresolvedMemberIdealType (VarType))
2642
- Builder.setSemanticContext (SemanticContextKind ::ExpressionSpecific);
2649
+ Builder.addFlair (CodeCompletionFlairBit ::ExpressionSpecific);
2643
2650
}
2644
2651
2645
2652
static bool hasInterestingDefaultValues (const AbstractFunctionDecl *func) {
@@ -2777,7 +2784,10 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
2777
2784
if (ParentKind != StmtKind::If && ParentKind != StmtKind::Guard)
2778
2785
return ;
2779
2786
CodeCompletionResultBuilder Builder (Sink, CodeCompletionResult::ResultKind::Keyword,
2780
- SemanticContextKind::ExpressionSpecific, expectedTypeContext);
2787
+ // FIXME: SemanticContextKind::Local is not correct.
2788
+ // Use 'None' (and fix prioritization) or introduce a new context.
2789
+ SemanticContextKind::Local, expectedTypeContext);
2790
+ Builder.addFlair (CodeCompletionFlairBit::ExpressionSpecific);
2781
2791
Builder.addBaseName (" available" );
2782
2792
Builder.addLeftParen ();
2783
2793
Builder.addSimpleTypedParameter (" Platform" , /* IsVarArg=*/ true );
@@ -3067,6 +3077,10 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
3067
3077
setClangDeclKeywords (FD, Pairs, Builder);
3068
3078
Builder.setAssociatedDecl (FD);
3069
3079
3080
+ if (IsSuperRefExpr && CurrentMethod &&
3081
+ CurrentMethod->getOverriddenDecl () == FD)
3082
+ Builder.addFlair (CodeCompletionFlairBit::SuperChain);
3083
+
3070
3084
if (NotRecommended)
3071
3085
Builder.setNotRecommended (*NotRecommended);
3072
3086
@@ -3156,7 +3170,7 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
3156
3170
ResultType, expectedTypeContext, CurrDeclContext));
3157
3171
3158
3172
if (isUnresolvedMemberIdealType (ResultType))
3159
- Builder.setSemanticContext (SemanticContextKind ::ExpressionSpecific);
3173
+ Builder.addFlair (CodeCompletionFlairBit ::ExpressionSpecific);
3160
3174
3161
3175
if (!IsImplicitlyCurriedInstanceMethod &&
3162
3176
expectedTypeContext.requiresNonVoid () &&
@@ -3210,6 +3224,11 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
3210
3224
expectedTypeContext);
3211
3225
setClangDeclKeywords (CD, Pairs, Builder);
3212
3226
Builder.setAssociatedDecl (CD);
3227
+
3228
+ if (IsSuperRefExpr && CurrentMethod &&
3229
+ CurrentMethod->getOverriddenDecl () == CD)
3230
+ Builder.addFlair (CodeCompletionFlairBit::SuperChain);
3231
+
3213
3232
if (needInit) {
3214
3233
assert (addName.empty ());
3215
3234
addLeadingDot (Builder);
@@ -3453,11 +3472,13 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
3453
3472
CommandWordsPairs Pairs;
3454
3473
CodeCompletionResultBuilder Builder (
3455
3474
Sink, CodeCompletionResult::ResultKind::Declaration,
3456
- HasTypeContext ? SemanticContextKind::ExpressionSpecific
3457
- : getSemanticContext (EED, Reason, dynamicLookupInfo),
3475
+ getSemanticContext (EED, Reason, dynamicLookupInfo),
3458
3476
expectedTypeContext);
3459
3477
Builder.setAssociatedDecl (EED);
3460
3478
setClangDeclKeywords (EED, Pairs, Builder);
3479
+ if (HasTypeContext)
3480
+ Builder.addFlair (CodeCompletionFlairBit::ExpressionSpecific);
3481
+
3461
3482
addLeadingDot (Builder);
3462
3483
addValueBaseName (Builder, EED->getBaseIdentifier ());
3463
3484
@@ -3481,7 +3502,7 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
3481
3502
addTypeAnnotation (Builder, EnumType, EED->getGenericSignatureOfContext ());
3482
3503
3483
3504
if (isUnresolvedMemberIdealType (EnumType))
3484
- Builder.setSemanticContext (SemanticContextKind ::ExpressionSpecific);
3505
+ Builder.addFlair (CodeCompletionFlairBit ::ExpressionSpecific);
3485
3506
}
3486
3507
3487
3508
void addKeyword (StringRef Name, Type TypeAnnotation = Type(),
@@ -4574,13 +4595,17 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
4574
4595
continue ;
4575
4596
CodeCompletionResultBuilder Builder (
4576
4597
Sink, CodeCompletionResult::ResultKind::Pattern,
4577
- SemanticContextKind::ExpressionSpecific, {});
4598
+ // FIXME: SemanticContextKind::Local is not correct.
4599
+ // Use 'None' (and fix prioritization) or introduce a new context.
4600
+ SemanticContextKind::Local, {});
4578
4601
Builder.addCallParameter (Arg->getLabel (), Identifier (),
4579
4602
Arg->getPlainType (), ContextType,
4580
4603
Arg->isVariadic (), Arg->isInOut (),
4581
4604
/* isIUO=*/ false , Arg->isAutoClosure (),
4582
4605
/* useUnderscoreLabel=*/ true ,
4583
4606
isLabeledTrailingClosure);
4607
+ Builder.setIsArgumentLabels ();
4608
+ Builder.addFlair (CodeCompletionFlairBit::ExpressionSpecific);
4584
4609
auto Ty = Arg->getPlainType ();
4585
4610
if (Arg->isInOut ()) {
4586
4611
Ty = InOutType::get (Ty);
@@ -6184,12 +6209,16 @@ static void addPlatformConditions(CodeCompletionResultSink &Sink) {
6184
6209
consumer) {
6185
6210
CodeCompletionResultBuilder Builder (
6186
6211
Sink, CodeCompletionResult::ResultKind::Pattern,
6187
- SemanticContextKind::ExpressionSpecific, {});
6212
+ // FIXME: SemanticContextKind::CurrentModule is not correct.
6213
+ // Use 'None' (and fix prioritization) or introduce a new context.
6214
+ SemanticContextKind::CurrentModule, {});
6215
+ Builder.addFlair (CodeCompletionFlairBit::ExpressionSpecific);
6188
6216
Builder.addBaseName (Name);
6189
6217
Builder.addLeftParen ();
6190
6218
consumer (Builder);
6191
6219
Builder.addRightParen ();
6192
6220
};
6221
+
6193
6222
addWithName (" os" , [](CodeCompletionResultBuilder &Builder) {
6194
6223
Builder.addSimpleNamedParameter (" name" );
6195
6224
});
@@ -6230,7 +6259,10 @@ static void addConditionalCompilationFlags(ASTContext &Ctx,
6230
6259
// TODO: Should we filter out some flags?
6231
6260
CodeCompletionResultBuilder Builder (
6232
6261
Sink, CodeCompletionResult::ResultKind::Keyword,
6233
- SemanticContextKind::ExpressionSpecific, {});
6262
+ // FIXME: SemanticContextKind::CurrentModule is not correct.
6263
+ // Use 'None' (and fix prioritization) or introduce a new context.
6264
+ SemanticContextKind::CurrentModule, {});
6265
+ Builder.addFlair (CodeCompletionFlairBit::ExpressionSpecific);
6234
6266
Builder.addTextChunk (Flag);
6235
6267
}
6236
6268
}
0 commit comments