[code-completion] Add type context for single-expression functions

Extend the support for single-expression closures to handle
single-expression functions of all kinds. This allows, e.g.

    func foo() -> MyEnum { .<here> }

to complete members of `MyEnum`.
This commit is contained in:
Ben Langmuir
2019-03-26 13:47:43 -07:00
parent 35f5c7afb3
commit b14cd916a3
10 changed files with 479 additions and 56 deletions

View File

@@ -74,6 +74,8 @@ namespace SourceKit {
class Context;
class NotificationCenter;
using TypeContextKind = swift::ide::CodeCompletionContext::TypeContextKind;
class SwiftEditorDocument :
public ThreadSafeRefCountedBase<SwiftEditorDocument> {
@@ -162,7 +164,7 @@ class SessionCache : public ThreadSafeRefCountedBase<SessionCache> {
CompletionSink sink;
std::vector<Completion *> sortedCompletions;
CompletionKind completionKind;
bool completionHasExpectedTypes;
TypeContextKind typeContextKind;
bool completionMayUseImplicitMemberExpr;
FilterRules filterRules;
llvm::sys::Mutex mtx;
@@ -171,11 +173,10 @@ public:
SessionCache(CompletionSink &&sink,
std::unique_ptr<llvm::MemoryBuffer> &&buffer,
std::vector<std::string> &&args, CompletionKind completionKind,
bool hasExpectedTypes, bool mayUseImplicitMemberExpr,
TypeContextKind typeContextKind, bool mayUseImplicitMemberExpr,
FilterRules filterRules)
: buffer(std::move(buffer)), args(std::move(args)), sink(std::move(sink)),
completionKind(completionKind),
completionHasExpectedTypes(hasExpectedTypes),
completionKind(completionKind), typeContextKind(typeContextKind),
completionMayUseImplicitMemberExpr(mayUseImplicitMemberExpr),
filterRules(std::move(filterRules)) {}
void setSortedCompletions(std::vector<Completion *> &&completions);
@@ -184,7 +185,7 @@ public:
ArrayRef<std::string> getCompilerArgs();
const FilterRules &getFilterRules();
CompletionKind getCompletionKind();
bool getCompletionHasExpectedTypes();
TypeContextKind getCompletionTypeContextKind();
bool getCompletionMayUseImplicitMemberExpr();
};
typedef RefPtr<SessionCache> SessionCacheRef;