@@ -708,9 +708,6 @@ void CodeCompletionResult::printPrefix(raw_ostream &OS) const {
708708 case SemanticContextKind::None:
709709 Prefix.append (" None" );
710710 break ;
711- case SemanticContextKind::ExpressionSpecific:
712- Prefix.append (" ExprSpecific" );
713- break ;
714711 case SemanticContextKind::Local:
715712 Prefix.append (" Local" );
716713 break ;
@@ -732,6 +729,19 @@ void CodeCompletionResult::printPrefix(raw_ostream &OS) const {
732729 Prefix.append ((Twine (" [" ) + ModuleName + " ]" ).str ());
733730 break ;
734731 }
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+ }
735745 if (NotRecommended)
736746 Prefix.append (" /NotRecommended" );
737747 if (IsSystem)
@@ -1294,7 +1304,7 @@ CodeCompletionResult *CodeCompletionResultBuilder::takeResult() {
12941304 }
12951305
12961306 return new (*Sink.Allocator ) CodeCompletionResult (
1297- SemanticContext, IsArgumentLabels, NumBytesToErase, CCS, AssociatedDecl,
1307+ SemanticContext, Flair, IsArgumentLabels, NumBytesToErase, CCS, AssociatedDecl,
12981308 ModuleName, NotRecReason, copyString (*Sink.Allocator , BriefComment),
12991309 copyAssociatedUSRs (*Sink.Allocator , AssociatedDecl),
13001310 copyArray (*Sink.Allocator , CommentWords), ExpectedTypeRelation);
@@ -1303,21 +1313,21 @@ CodeCompletionResult *CodeCompletionResultBuilder::takeResult() {
13031313 case CodeCompletionResult::ResultKind::Keyword:
13041314 return new (*Sink.Allocator )
13051315 CodeCompletionResult (
1306- KeywordKind, SemanticContext, IsArgumentLabels, NumBytesToErase,
1316+ KeywordKind, SemanticContext, Flair, IsArgumentLabels, NumBytesToErase,
13071317 CCS, ExpectedTypeRelation,
13081318 copyString (*Sink.Allocator , BriefDocComment));
13091319
13101320 case CodeCompletionResult::ResultKind::BuiltinOperator:
13111321 case CodeCompletionResult::ResultKind::Pattern:
13121322 return new (*Sink.Allocator ) CodeCompletionResult (
1313- Kind, SemanticContext, IsArgumentLabels, NumBytesToErase, CCS,
1323+ Kind, SemanticContext, Flair, IsArgumentLabels, NumBytesToErase, CCS,
13141324 ExpectedTypeRelation, CodeCompletionOperatorKind::None,
13151325 copyString (*Sink.Allocator , BriefDocComment));
13161326
13171327 case CodeCompletionResult::ResultKind::Literal:
13181328 assert (LiteralKind.hasValue ());
13191329 return new (*Sink.Allocator )
1320- CodeCompletionResult (*LiteralKind, SemanticContext, IsArgumentLabels,
1330+ CodeCompletionResult (*LiteralKind, SemanticContext, Flair, IsArgumentLabels,
13211331 NumBytesToErase, CCS, ExpectedTypeRelation);
13221332 }
13231333
@@ -2180,9 +2190,6 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
21802190 return SemanticContextKind::Local;
21812191
21822192 case DeclVisibilityKind::MemberOfCurrentNominal:
2183- if (IsSuperRefExpr &&
2184- CurrentMethod && CurrentMethod->getOverriddenDecl () == D)
2185- return SemanticContextKind::ExpressionSpecific;
21862193 return SemanticContextKind::CurrentNominal;
21872194
21882195 case DeclVisibilityKind::MemberOfProtocolConformedToByCurrentNominal:
@@ -2644,7 +2651,7 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
26442651 Builder.addAnnotatedAsync ();
26452652
26462653 if (isUnresolvedMemberIdealType (VarType))
2647- Builder.setSemanticContext (SemanticContextKind ::ExpressionSpecific);
2654+ Builder.addFlair (CodeCompletionFlairBit ::ExpressionSpecific);
26482655 }
26492656
26502657 static bool hasInterestingDefaultValues (const AbstractFunctionDecl *func) {
@@ -2782,7 +2789,10 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
27822789 if (ParentKind != StmtKind::If && ParentKind != StmtKind::Guard)
27832790 return ;
27842791 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);
27862796 Builder.addBaseName (" available" );
27872797 Builder.addLeftParen ();
27882798 Builder.addSimpleTypedParameter (" Platform" , /* IsVarArg=*/ true );
@@ -3072,6 +3082,10 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
30723082 setClangDeclKeywords (FD, Pairs, Builder);
30733083 Builder.setAssociatedDecl (FD);
30743084
3085+ if (IsSuperRefExpr && CurrentMethod &&
3086+ CurrentMethod->getOverriddenDecl () == FD)
3087+ Builder.addFlair (CodeCompletionFlairBit::SuperChain);
3088+
30753089 if (NotRecommended)
30763090 Builder.setNotRecommended (*NotRecommended);
30773091
@@ -3161,7 +3175,7 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
31613175 ResultType, expectedTypeContext, CurrDeclContext));
31623176
31633177 if (isUnresolvedMemberIdealType (ResultType))
3164- Builder.setSemanticContext (SemanticContextKind ::ExpressionSpecific);
3178+ Builder.addFlair (CodeCompletionFlairBit ::ExpressionSpecific);
31653179
31663180 if (!IsImplicitlyCurriedInstanceMethod &&
31673181 expectedTypeContext.requiresNonVoid () &&
@@ -3215,6 +3229,11 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
32153229 expectedTypeContext);
32163230 setClangDeclKeywords (CD, Pairs, Builder);
32173231 Builder.setAssociatedDecl (CD);
3232+
3233+ if (IsSuperRefExpr && CurrentMethod &&
3234+ CurrentMethod->getOverriddenDecl () == CD)
3235+ Builder.addFlair (CodeCompletionFlairBit::SuperChain);
3236+
32183237 if (needInit) {
32193238 assert (addName.empty ());
32203239 addLeadingDot (Builder);
@@ -3458,11 +3477,13 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
34583477 CommandWordsPairs Pairs;
34593478 CodeCompletionResultBuilder Builder (
34603479 Sink, CodeCompletionResult::ResultKind::Declaration,
3461- HasTypeContext ? SemanticContextKind::ExpressionSpecific
3462- : getSemanticContext (EED, Reason, dynamicLookupInfo),
3480+ getSemanticContext (EED, Reason, dynamicLookupInfo),
34633481 expectedTypeContext);
34643482 Builder.setAssociatedDecl (EED);
34653483 setClangDeclKeywords (EED, Pairs, Builder);
3484+ if (HasTypeContext)
3485+ Builder.addFlair (CodeCompletionFlairBit::ExpressionSpecific);
3486+
34663487 addLeadingDot (Builder);
34673488 addValueBaseName (Builder, EED->getBaseIdentifier ());
34683489
@@ -3486,7 +3507,7 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
34863507 addTypeAnnotation (Builder, EnumType, EED->getGenericSignatureOfContext ());
34873508
34883509 if (isUnresolvedMemberIdealType (EnumType))
3489- Builder.setSemanticContext (SemanticContextKind ::ExpressionSpecific);
3510+ Builder.addFlair (CodeCompletionFlairBit ::ExpressionSpecific);
34903511 }
34913512
34923513 void addKeyword (StringRef Name, Type TypeAnnotation = Type(),
@@ -4579,13 +4600,17 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
45794600 continue ;
45804601 CodeCompletionResultBuilder Builder (
45814602 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, {});
45834606 Builder.addCallParameter (Arg->getLabel (), Identifier (),
45844607 Arg->getPlainType (), ContextType,
45854608 Arg->isVariadic (), Arg->isInOut (),
45864609 /* isIUO=*/ false , Arg->isAutoClosure (),
45874610 /* useUnderscoreLabel=*/ true ,
45884611 isLabeledTrailingClosure);
4612+ Builder.setIsArgumentLabels ();
4613+ Builder.addFlair (CodeCompletionFlairBit::ExpressionSpecific);
45894614 auto Ty = Arg->getPlainType ();
45904615 if (Arg->isInOut ()) {
45914616 Ty = InOutType::get (Ty);
@@ -6202,12 +6227,16 @@ static void addPlatformConditions(CodeCompletionResultSink &Sink) {
62026227 consumer) {
62036228 CodeCompletionResultBuilder Builder (
62046229 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);
62066234 Builder.addBaseName (Name);
62076235 Builder.addLeftParen ();
62086236 consumer (Builder);
62096237 Builder.addRightParen ();
62106238 };
6239+
62116240 addWithName (" os" , [](CodeCompletionResultBuilder &Builder) {
62126241 Builder.addSimpleNamedParameter (" name" );
62136242 });
@@ -6248,7 +6277,10 @@ static void addConditionalCompilationFlags(ASTContext &Ctx,
62486277 // TODO: Should we filter out some flags?
62496278 CodeCompletionResultBuilder Builder (
62506279 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);
62526284 Builder.addTextChunk (Flag);
62536285 }
62546286}
0 commit comments