Skip to content

Commit ee99666

Browse files
committed
[CodeComplete] Return result sink as code completion results
Previously the code completion methods just returned an `ArrayRef` that pointed into the result sink that contained the results but no effort was made to actually keep that that result sink alive, e.g. when transforming results in `transformAndForwardResults`. Instead, return the `CodeCompletionResultSink` from the code compleiton methods now and adopt that sink from the inner results created in `transformAndForwardResults`.
1 parent 91966de commit ee99666

File tree

7 files changed

+44
-44
lines changed

7 files changed

+44
-44
lines changed

include/swift/IDE/CodeCompletion.h

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1003,8 +1003,7 @@ class ImportDepth {
10031003
class CodeCompletionContext {
10041004
friend class CodeCompletionResultBuilder;
10051005

1006-
/// A set of current completion results, not yet delivered to the
1007-
/// consumer.
1006+
/// A set of current completion results.
10081007
CodeCompletionResultSink CurrentResults;
10091008

10101009
public:
@@ -1072,13 +1071,10 @@ class CodeCompletionContext {
10721071
/// Allocate a string owned by the code completion context.
10731072
StringRef copyString(StringRef Str);
10741073

1075-
/// Return current code completion results.
1076-
MutableArrayRef<CodeCompletionResult *> takeResults();
1077-
10781074
/// Sort code completion results in an implementation-defined order
10791075
/// in place.
1080-
static void sortCompletionResults(
1081-
MutableArrayRef<CodeCompletionResult *> Results);
1076+
static std::vector<CodeCompletionResult *>
1077+
sortCompletionResults(ArrayRef<CodeCompletionResult *> Results);
10821078

10831079
CodeCompletionResultSink &getResultSink() {
10841080
return CurrentResults;

include/swift/IDE/CompletionInstance.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ struct CompletionInstanceResult {
5353

5454
/// The results returned from \c CompletionInstance::codeComplete.
5555
struct CodeCompleteResult {
56-
MutableArrayRef<CodeCompletionResult *> Results;
56+
CodeCompletionResultSink ResultSink;
5757
SwiftCompletionInfo &Info;
5858
};
5959

lib/IDE/CodeCompletion.cpp

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1354,18 +1354,6 @@ void CodeCompletionResultBuilder::finishResult() {
13541354
Sink.Results.push_back(takeResult());
13551355
}
13561356

1357-
1358-
MutableArrayRef<CodeCompletionResult *> CodeCompletionContext::takeResults() {
1359-
// Copy pointers to the results.
1360-
const size_t Count = CurrentResults.Results.size();
1361-
CodeCompletionResult **Results =
1362-
CurrentResults.Allocator->Allocate<CodeCompletionResult *>(Count);
1363-
std::copy(CurrentResults.Results.begin(), CurrentResults.Results.end(),
1364-
Results);
1365-
CurrentResults.Results.clear();
1366-
return MutableArrayRef<CodeCompletionResult *>(Results, Count);
1367-
}
1368-
13691357
Optional<unsigned> CodeCompletionString::getFirstTextChunkIndex(
13701358
bool includeLeadingPunctuation) const {
13711359
for (auto i : indices(getChunks())) {
@@ -1451,25 +1439,29 @@ CodeCompletionString::getFirstTextChunk(bool includeLeadingPunctuation) const {
14511439
return StringRef();
14521440
}
14531441

1454-
void CodeCompletionContext::sortCompletionResults(
1455-
MutableArrayRef<CodeCompletionResult *> Results) {
1442+
std::vector<CodeCompletionResult *>
1443+
CodeCompletionContext::sortCompletionResults(
1444+
ArrayRef<CodeCompletionResult *> Results) {
1445+
std::vector<CodeCompletionResult *> SortedResults(Results.begin(),
1446+
Results.end());
14561447
struct ResultAndName {
14571448
CodeCompletionResult *result;
14581449
std::string name;
14591450
};
14601451

14611452
// Caching the name of each field is important to avoid unnecessary calls to
14621453
// CodeCompletionString::getName().
1463-
std::vector<ResultAndName> nameCache(Results.size());
1464-
for (unsigned i = 0, n = Results.size(); i < n; ++i) {
1465-
auto *result = Results[i];
1454+
std::vector<ResultAndName> nameCache(SortedResults.size());
1455+
for (unsigned i = 0, n = SortedResults.size(); i < n; ++i) {
1456+
auto *result = SortedResults[i];
14661457
nameCache[i].result = result;
14671458
llvm::raw_string_ostream OS(nameCache[i].name);
14681459
printCodeCompletionResultFilterName(*result, OS);
14691460
OS.flush();
14701461
}
14711462

1472-
// Sort nameCache, and then transform Results to return the pointers in order.
1463+
// Sort nameCache, and then transform SortedResults to return the pointers in
1464+
// order.
14731465
std::sort(nameCache.begin(), nameCache.end(),
14741466
[](const ResultAndName &LHS, const ResultAndName &RHS) {
14751467
int Result = StringRef(LHS.name).compare_insensitive(RHS.name);
@@ -1480,8 +1472,9 @@ void CodeCompletionContext::sortCompletionResults(
14801472
return Result < 0;
14811473
});
14821474

1483-
llvm::transform(nameCache, Results.begin(),
1475+
llvm::transform(nameCache, SortedResults.begin(),
14841476
[](const ResultAndName &entry) { return entry.result; });
1477+
return SortedResults;
14851478
}
14861479

14871480
namespace {

lib/IDE/CompletionInstance.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -709,9 +709,8 @@ void swift::ide::CompletionInstance::codeComplete(
709709
CancellationFlag->load(std::memory_order_relaxed)) {
710710
Callback(ResultType::cancelled());
711711
} else {
712-
MutableArrayRef<CodeCompletionResult *> Results = context.takeResults();
713712
assert(SwiftContext.swiftASTContext);
714-
Callback(ResultType::success({Results, SwiftContext}));
713+
Callback(ResultType::success({context.getResultSink(), SwiftContext}));
715714
}
716715
}
717716
};

lib/IDE/REPLCodeCompletion.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,9 @@ class REPLCodeCompletionConsumer : public SimpleCachingCodeCompletionConsumer {
178178
: Completions(Completions) {}
179179

180180
void handleResults(CodeCompletionContext &context) override {
181-
MutableArrayRef<CodeCompletionResult *> Results = context.takeResults();
182-
CodeCompletionContext::sortCompletionResults(Results);
183-
for (auto Result : Results) {
181+
auto SortedResults = CodeCompletionContext::sortCompletionResults(
182+
context.getResultSink().Results);
183+
for (auto Result : SortedResults) {
184184
std::string InsertableString = toInsertableString(Result);
185185
if (StringRef(InsertableString).startswith(Completions.Prefix)) {
186186
llvm::SmallString<128> PrintedResult;

tools/SourceKit/lib/SwiftLang/SwiftCompletion.cpp

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -144,11 +144,18 @@ deliverCodeCompleteResults(SourceKit::CodeCompletionConsumer &SKConsumer,
144144

145145
bool hasRequiredType = Result->Info.completionContext->typeContextKind ==
146146
TypeContextKind::Required;
147-
if (CCOpts.sortByName)
148-
CodeCompletionContext::sortCompletionResults(Result->Results);
147+
ArrayRef<CodeCompletionResult *> Results = Result->ResultSink.Results;
148+
// If the results are sorted by name, this stores the sorted results, which
149+
// will be referenced by `Results`.
150+
std::vector<CodeCompletionResult *> SortedResultsStorage;
151+
if (CCOpts.sortByName) {
152+
SortedResultsStorage =
153+
CodeCompletionContext::sortCompletionResults(Results);
154+
Results = SortedResultsStorage;
155+
}
149156
// FIXME: this adhoc filtering should be configurable like it is in the
150157
// codeCompleteOpen path.
151-
for (auto *Result : Result->Results) {
158+
for (auto *Result : Results) {
152159
if (Result->getKind() == CodeCompletionResult::ResultKind::Literal) {
153160
switch (Result->getLiteralKind()) {
154161
case CodeCompletionLiteralKind::NilLiteral:
@@ -1028,15 +1035,17 @@ static void transformAndForwardResults(
10281035
return;
10291036
}
10301037
auto topResults = filterInnerResults(
1031-
Result->Results, options.addInnerResults,
1032-
options.addInnerOperators, hasDot, hasQDot, hasInit, rules);
1038+
ArrayRef<CodeCompletionResult *>(Result->ResultSink.Results),
1039+
options.addInnerResults, options.addInnerOperators, hasDot,
1040+
hasQDot, hasInit, rules);
10331041
// FIXME: Clearing the flair (and semantic context) is a hack so
10341042
// that they won't overwhelm other results that also match the
10351043
// filter text.
10361044
innerResults =
10371045
extendCompletions(topResults, innerSink, Result->Info,
10381046
nameToPopularity, options, exactMatch,
10391047
/*clearFlair=*/true);
1048+
innerSink.adoptSwiftSink(Result->ResultSink);
10401049
break;
10411050
}
10421051
case CancellableResultKind::Failure:
@@ -1145,8 +1154,10 @@ void SwiftLangSupport::codeCompleteOpen(
11451154
mayUseImplicitMemberExpr = completionCtx.MayUseImplicitMemberExpr;
11461155
consumer.setReusingASTContext(completionCtx.ReusingASTContext);
11471156
consumer.setAnnotatedTypename(completionCtx.getAnnotateResult());
1148-
completions = extendCompletions(Result->Results, sink, Result->Info,
1149-
nameToPopularity, CCOpts);
1157+
completions =
1158+
extendCompletions(Result->ResultSink.Results, sink, Result->Info,
1159+
nameToPopularity, CCOpts);
1160+
sink.adoptSwiftSink(Result->ResultSink);
11501161
break;
11511162
}
11521163
case CancellableResultKind::Failure:

tools/swift-ide-test/swift-ide-test.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1056,7 +1056,7 @@ doConformingMethodList(const CompilerInvocation &InitInvok,
10561056
}
10571057

10581058
static void
1059-
printCodeCompletionResultsImpl(MutableArrayRef<CodeCompletionResult *> Results,
1059+
printCodeCompletionResultsImpl(ArrayRef<CodeCompletionResult *> Results,
10601060
llvm::raw_ostream &OS, bool IncludeKeywords,
10611061
bool IncludeComments, bool IncludeSourceText,
10621062
bool PrintAnnotatedDescription) {
@@ -1137,8 +1137,8 @@ static int printCodeCompletionResults(
11371137
return printResult<CodeCompleteResult>(
11381138
CancellableResult, [&](CodeCompleteResult &Result) {
11391139
printCodeCompletionResultsImpl(
1140-
Result.Results, llvm::outs(), IncludeKeywords, IncludeComments,
1141-
IncludeSourceText, PrintAnnotatedDescription);
1140+
Result.ResultSink.Results, llvm::outs(), IncludeKeywords,
1141+
IncludeComments, IncludeSourceText, PrintAnnotatedDescription);
11421142
return 0;
11431143
});
11441144
}
@@ -1514,8 +1514,9 @@ static int doBatchCodeCompletion(const CompilerInvocation &InitInvok,
15141514
case CancellableResultKind::Success: {
15151515
wasASTContextReused =
15161516
Result->Info.completionContext->ReusingASTContext;
1517-
printCodeCompletionResultsImpl(Result->Results, OS, IncludeKeywords,
1518-
IncludeComments, IncludeSourceText,
1517+
printCodeCompletionResultsImpl(Result->ResultSink.Results, OS,
1518+
IncludeKeywords, IncludeComments,
1519+
IncludeSourceText,
15191520
CodeCompletionAnnotateResults);
15201521
break;
15211522
}

0 commit comments

Comments
 (0)