1313#ifndef SWIFT_IDE_CODECOMPLETION_H
1414#define SWIFT_IDE_CODECOMPLETION_H
1515
16+ #include " CodeCompletionResultType.h"
1617#include " swift/AST/Identifier.h"
1718#include " swift/Basic/Debug.h"
1819#include " swift/Basic/LLVM.h"
@@ -724,6 +725,7 @@ class ContextFreeCodeCompletionResult {
724725 StringRef ModuleName;
725726 StringRef BriefDocComment;
726727 ArrayRef<StringRef> AssociatedUSRs;
728+ CodeCompletionResultType ResultType;
727729
728730 ContextFreeNotRecommendedReason NotRecommended : 3 ;
729731 static_assert (int (ContextFreeNotRecommendedReason::MAX_VALUE) < 1 << 3 , " " );
@@ -747,13 +749,15 @@ class ContextFreeCodeCompletionResult {
747749 CodeCompletionOperatorKind KnownOperatorKind, bool IsSystem,
748750 CodeCompletionString *CompletionString, StringRef ModuleName,
749751 StringRef BriefDocComment, ArrayRef<StringRef> AssociatedUSRs,
752+ CodeCompletionResultType ResultType,
750753 ContextFreeNotRecommendedReason NotRecommended,
751754 CodeCompletionDiagnosticSeverity DiagnosticSeverity,
752755 StringRef DiagnosticMessage)
753756 : Kind(Kind), KnownOperatorKind(KnownOperatorKind), IsSystem(IsSystem),
754757 CompletionString (CompletionString), ModuleName(ModuleName),
755758 BriefDocComment(BriefDocComment), AssociatedUSRs(AssociatedUSRs),
756- NotRecommended(NotRecommended), DiagnosticSeverity(DiagnosticSeverity),
759+ ResultType(ResultType), NotRecommended(NotRecommended),
760+ DiagnosticSeverity(DiagnosticSeverity),
757761 DiagnosticMessage(DiagnosticMessage) {
758762 this ->AssociatedKind .Opaque = AssociatedKind;
759763 assert ((NotRecommended == ContextFreeNotRecommendedReason::None) ==
@@ -780,13 +784,14 @@ class ContextFreeCodeCompletionResult {
780784 ContextFreeCodeCompletionResult (
781785 CodeCompletionResultKind Kind, CodeCompletionString *CompletionString,
782786 CodeCompletionOperatorKind KnownOperatorKind, StringRef BriefDocComment,
787+ CodeCompletionResultType ResultType,
783788 ContextFreeNotRecommendedReason NotRecommended,
784789 CodeCompletionDiagnosticSeverity DiagnosticSeverity,
785790 StringRef DiagnosticMessage)
786791 : ContextFreeCodeCompletionResult(
787792 Kind, /* AssociatedKind=*/ 0 , KnownOperatorKind,
788793 /* IsSystem=*/ false , CompletionString, /* ModuleName=*/ " " ,
789- BriefDocComment, /* AssociatedUSRs=*/ {}, NotRecommended,
794+ BriefDocComment, /* AssociatedUSRs=*/ {}, ResultType, NotRecommended,
790795 DiagnosticSeverity, DiagnosticMessage) {}
791796
792797 // / Constructs a \c Keyword result.
@@ -796,12 +801,14 @@ class ContextFreeCodeCompletionResult {
796801 // / same \c CodeCompletionResultSink as the result itself.
797802 ContextFreeCodeCompletionResult (CodeCompletionKeywordKind Kind,
798803 CodeCompletionString *CompletionString,
799- StringRef BriefDocComment)
804+ StringRef BriefDocComment,
805+ CodeCompletionResultType ResultType)
800806 : ContextFreeCodeCompletionResult(
801807 CodeCompletionResultKind::Keyword, static_cast <uint8_t >(Kind),
802808 CodeCompletionOperatorKind::None, /* IsSystem=*/ false,
803809 CompletionString, /* ModuleName=*/ "", BriefDocComment,
804- /* AssociatedUSRs=*/ {}, ContextFreeNotRecommendedReason::None,
810+ /* AssociatedUSRs=*/ {}, ResultType,
811+ ContextFreeNotRecommendedReason::None,
805812 CodeCompletionDiagnosticSeverity::None, /* DiagnosticMessage=*/ " " ) {}
806813
807814 // / Constructs a \c Literal result.
@@ -810,13 +817,15 @@ class ContextFreeCodeCompletionResult {
810817 // / result, typically by storing them in the same \c CodeCompletionResultSink
811818 // / as the result itself.
812819 ContextFreeCodeCompletionResult (CodeCompletionLiteralKind LiteralKind,
813- CodeCompletionString *CompletionString)
820+ CodeCompletionString *CompletionString,
821+ CodeCompletionResultType ResultType)
814822 : ContextFreeCodeCompletionResult(
815823 CodeCompletionResultKind::Literal,
816824 static_cast <uint8_t >(LiteralKind), CodeCompletionOperatorKind::None,
817825 /* IsSystem=*/ false , CompletionString, /* ModuleName=*/ " " ,
818826 /* BriefDocComment=*/ " " ,
819- /* AssociatedUSRs=*/ {}, ContextFreeNotRecommendedReason::None,
827+ /* AssociatedUSRs=*/ {}, ResultType,
828+ ContextFreeNotRecommendedReason::None,
820829 CodeCompletionDiagnosticSeverity::None, /* DiagnosticMessage=*/ " " ) {}
821830
822831 // / Constructs a \c Declaration result.
@@ -827,7 +836,7 @@ class ContextFreeCodeCompletionResult {
827836 ContextFreeCodeCompletionResult (
828837 CodeCompletionString *CompletionString, const Decl *AssociatedDecl,
829838 StringRef ModuleName, StringRef BriefDocComment,
830- ArrayRef<StringRef> AssociatedUSRs,
839+ ArrayRef<StringRef> AssociatedUSRs, CodeCompletionResultType ResultType,
831840 ContextFreeNotRecommendedReason NotRecommended,
832841 CodeCompletionDiagnosticSeverity DiagnosticSeverity,
833842 StringRef DiagnosticMessage)
@@ -836,7 +845,7 @@ class ContextFreeCodeCompletionResult {
836845 static_cast <uint8_t >(getCodeCompletionDeclKind(AssociatedDecl)),
837846 CodeCompletionOperatorKind::None, getDeclIsSystem(AssociatedDecl),
838847 CompletionString, ModuleName, BriefDocComment, AssociatedUSRs,
839- NotRecommended, DiagnosticSeverity, DiagnosticMessage) {
848+ ResultType, NotRecommended, DiagnosticSeverity, DiagnosticMessage) {
840849 assert (AssociatedDecl && " should have a decl" );
841850 }
842851
@@ -874,6 +883,8 @@ class ContextFreeCodeCompletionResult {
874883
875884 ArrayRef<StringRef> getAssociatedUSRs () const { return AssociatedUSRs; }
876885
886+ const CodeCompletionResultType &getResultType () const { return ResultType; }
887+
877888 ContextFreeNotRecommendedReason getNotRecommendedReason () const {
878889 return NotRecommended;
879890 }
@@ -909,34 +920,6 @@ class ContextFreeCodeCompletionResult {
909920// / A single code completion result enriched with information that depend on
910921// / the completion's usage context.
911922class CodeCompletionResult {
912- public:
913- // / Describes the relationship between the type of the completion results and
914- // / the expected type at the code completion position.
915- enum class ExpectedTypeRelation : uint8_t {
916- // / The result does not have a type (e.g. keyword).
917- NotApplicable,
918-
919- // / The type relation have not been calculated.
920- Unknown,
921-
922- // / The relationship of the result's type to the expected type is not
923- // / invalid, not convertible, and not identical.
924- Unrelated,
925-
926- // / The result's type is invalid at the expected position.
927- Invalid,
928-
929- // / The result's type is convertible to the type of the expected.
930- Convertible,
931-
932- // / The result's type is identical to the type of the expected.
933- Identical,
934-
935- MAX_VALUE = Identical
936- };
937-
938-
939- private:
940923 const ContextFreeCodeCompletionResult &ContextFree;
941924 SemanticContextKind SemanticContext : 3 ;
942925 static_assert (int (SemanticContextKind::MAX_VALUE) < 1 << 3 , " " );
@@ -962,17 +945,17 @@ class CodeCompletionResult {
962945 static const unsigned MaxNumBytesToErase = 127 ;
963946
964947private:
965- ExpectedTypeRelation TypeDistance : 3 ;
966- public:
967- // / Enrich a \c ContextFreeCodeCompletionResult with the following contextual
968- // / information.
948+ CodeCompletionResultTypeRelation TypeDistance : 3 ;
949+ static_assert ( int (CodeCompletionResultTypeRelation::MAX_VALUE) < 1 << 3 , " " );
950+
951+ // / Memberwise initializer
969952 // / The \c ContextFree result must outlive this result. Typically, this is
970953 // / done by allocating the two in the same sink or adopting the context free
971954 // / sink in the sink that allocates this result.
972955 CodeCompletionResult (const ContextFreeCodeCompletionResult &ContextFree,
973956 SemanticContextKind SemanticContext,
974957 CodeCompletionFlair Flair, uint8_t NumBytesToErase,
975- ExpectedTypeRelation TypeDistance,
958+ CodeCompletionResultTypeRelation TypeDistance,
976959 ContextualNotRecommendedReason NotRecommended,
977960 CodeCompletionDiagnosticSeverity DiagnosticSeverity,
978961 StringRef DiagnosticMessage)
@@ -982,6 +965,23 @@ class CodeCompletionResult {
982965 DiagnosticMessage(DiagnosticMessage), NumBytesToErase(NumBytesToErase),
983966 TypeDistance(TypeDistance) {}
984967
968+ public:
969+ // / Enrich a \c ContextFreeCodeCompletionResult with the following contextual
970+ // / information.
971+ // / This computes the type relation between the completion item and its
972+ // / expected type context.
973+ // / The \c ContextFree result must outlive this result. Typically, this is
974+ // / done by allocating the two in the same sink or adopting the context free
975+ // / sink in the sink that allocates this result.
976+ CodeCompletionResult (const ContextFreeCodeCompletionResult &ContextFree,
977+ SemanticContextKind SemanticContext,
978+ CodeCompletionFlair Flair, uint8_t NumBytesToErase,
979+ const ExpectedTypeContext *TypeContext,
980+ const DeclContext *DC,
981+ ContextualNotRecommendedReason NotRecommended,
982+ CodeCompletionDiagnosticSeverity DiagnosticSeverity,
983+ StringRef DiagnosticMessage);
984+
985985 const ContextFreeCodeCompletionResult &getContextFreeResult () const {
986986 return ContextFree;
987987 }
@@ -998,7 +998,16 @@ class CodeCompletionResult {
998998 // / context free result outlives the result the result returned by this
999999 // / method.
10001000 CodeCompletionResult *withFlair (CodeCompletionFlair newFlair,
1001- CodeCompletionResultSink &Sink);
1001+ CodeCompletionResultSink &Sink) const ;
1002+
1003+ // / Copy this result to \p Sink with \p newFlair . Note that this does NOT
1004+ // / copy the context free result. Thus the caller needs to ensure that the
1005+ // / context free result outlives the result the result returned by this
1006+ // / method.
1007+ CodeCompletionResult *withContextFreeResultSemanticContextAndFlair (
1008+ const ContextFreeCodeCompletionResult &NewContextFree,
1009+ SemanticContextKind NewSemanticContext, CodeCompletionFlair NewFlair,
1010+ CodeCompletionResultSink &Sink) const ;
10021011
10031012 CodeCompletionResultKind getKind () const {
10041013 return getContextFreeResult ().getKind ();
@@ -1024,7 +1033,9 @@ class CodeCompletionResult {
10241033
10251034 bool isSystem () const { return getContextFreeResult ().isSystem (); }
10261035
1027- ExpectedTypeRelation getExpectedTypeRelation () const { return TypeDistance; }
1036+ CodeCompletionResultTypeRelation getExpectedTypeRelation () const {
1037+ return TypeDistance;
1038+ }
10281039
10291040 // / Get the contextual not-recommended reason. This disregards context-free
10301041 // / not recommended reasons.
0 commit comments