Skip to content

Commit 4f5d4d8

Browse files
committed
[Gardening] Add re-usable copy* utility methods to use in code completion
Various copy* methods were re-implemented in a bunch of files, move them to CodeCompletion.h so they can be re-used everywhere that needs them.
1 parent 9de171a commit 4f5d4d8

File tree

4 files changed

+33
-57
lines changed

4 files changed

+33
-57
lines changed

include/swift/IDE/CodeCompletion.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,20 @@ std::string removeCodeCompletionTokens(StringRef Input,
5757
StringRef TokenName,
5858
unsigned *CompletionOffset);
5959

60+
StringRef copyString(llvm::BumpPtrAllocator &Allocator,
61+
StringRef Str);
62+
63+
const char *copyCString(llvm::BumpPtrAllocator &Allocator,
64+
StringRef Str);
65+
66+
template <typename T>
67+
ArrayRef<T> copyArray(llvm::BumpPtrAllocator &Allocator,
68+
ArrayRef<T> Arr) {
69+
T *Buffer = Allocator.Allocate<T>(Arr.size());
70+
std::copy(Arr.begin(), Arr.end(), Buffer);
71+
return llvm::makeArrayRef(Buffer, Arr.size());
72+
}
73+
6074
namespace detail {
6175
class CodeCompletionStringChunk {
6276
friend class swift::ide::CodeCompletionResultBuilder;

lib/IDE/CodeCompletion.cpp

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,21 @@ std::string swift::ide::removeCodeCompletionTokens(
341341
return CleanFile;
342342
}
343343

344+
llvm::StringRef swift::ide::copyString(llvm::BumpPtrAllocator &Allocator,
345+
llvm::StringRef Str) {
346+
char *Buffer = Allocator.Allocate<char>(Str.size());
347+
std::copy(Str.begin(), Str.end(), Buffer);
348+
return llvm::StringRef(Buffer, Str.size());
349+
}
350+
351+
const char *swift::ide::copyCString(llvm::BumpPtrAllocator &Allocator,
352+
llvm::StringRef Str) {
353+
char *Buffer = Allocator.Allocate<char>(Str.size() + 1);
354+
std::copy(Str.begin(), Str.end(), Buffer);
355+
Buffer[Str.size()] = '\0';
356+
return Buffer;
357+
}
358+
344359
CodeCompletionString::CodeCompletionString(ArrayRef<Chunk> Chunks) {
345360
std::uninitialized_copy(Chunks.begin(), Chunks.end(),
346361
getTrailingObjects<Chunk>());
@@ -769,29 +784,6 @@ void CodeCompletionResult::dump() const {
769784
llvm::errs() << "\n";
770785
}
771786

772-
static StringRef copyString(llvm::BumpPtrAllocator &Allocator,
773-
StringRef Str) {
774-
char *Mem = Allocator.Allocate<char>(Str.size());
775-
std::copy(Str.begin(), Str.end(), Mem);
776-
return StringRef(Mem, Str.size());
777-
}
778-
779-
static ArrayRef<StringRef> copyStringArray(llvm::BumpPtrAllocator &Allocator,
780-
ArrayRef<StringRef> Arr) {
781-
StringRef *Buff = Allocator.Allocate<StringRef>(Arr.size());
782-
std::copy(Arr.begin(), Arr.end(), Buff);
783-
return llvm::makeArrayRef(Buff, Arr.size());
784-
}
785-
786-
static ArrayRef<std::pair<StringRef, StringRef>> copyStringPairArray(
787-
llvm::BumpPtrAllocator &Allocator,
788-
ArrayRef<std::pair<StringRef, StringRef>> Arr) {
789-
std::pair<StringRef, StringRef> *Buff = Allocator.Allocate<std::pair<StringRef,
790-
StringRef>>(Arr.size());
791-
std::copy(Arr.begin(), Arr.end(), Buff);
792-
return llvm::makeArrayRef(Buff, Arr.size());
793-
}
794-
795787
void CodeCompletionResultBuilder::withNestedGroup(
796788
CodeCompletionString::Chunk::ChunkKind Kind,
797789
llvm::function_ref<void()> body) {
@@ -1125,7 +1117,7 @@ ArrayRef<StringRef> copyAssociatedUSRs(llvm::BumpPtrAllocator &Allocator,
11251117
});
11261118

11271119
if (!USRs.empty())
1128-
return copyStringArray(Allocator, USRs);
1120+
return copyArray(Allocator, ArrayRef<StringRef>(USRs));
11291121

11301122
return ArrayRef<StringRef>();
11311123
}
@@ -1343,7 +1335,7 @@ CodeCompletionResult *CodeCompletionResultBuilder::takeResult() {
13431335
/*NotRecommended=*/IsNotRecommended, NotRecReason,
13441336
copyString(*Sink.Allocator, BriefComment),
13451337
copyAssociatedUSRs(*Sink.Allocator, AssociatedDecl),
1346-
copyStringPairArray(*Sink.Allocator, CommentWords), typeRelation);
1338+
copyArray(*Sink.Allocator, CommentWords), typeRelation);
13471339
}
13481340

13491341
case CodeCompletionResult::ResultKind::Keyword:

lib/IDE/CodeCompletionCache.cpp

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -102,28 +102,6 @@ CodeCompletionCache::~CodeCompletionCache() {}
102102
/// cached results. This isn't expected to change very often.
103103
static constexpr uint32_t onDiskCompletionCacheVersion = 1;
104104

105-
static StringRef copyString(llvm::BumpPtrAllocator &Allocator, StringRef Str) {
106-
char *Mem = Allocator.Allocate<char>(Str.size());
107-
std::copy(Str.begin(), Str.end(), Mem);
108-
return StringRef(Mem, Str.size());
109-
}
110-
111-
static ArrayRef<StringRef> copyStringArray(llvm::BumpPtrAllocator &Allocator,
112-
ArrayRef<StringRef> Arr) {
113-
StringRef *Buff = Allocator.Allocate<StringRef>(Arr.size());
114-
std::copy(Arr.begin(), Arr.end(), Buff);
115-
return llvm::makeArrayRef(Buff, Arr.size());
116-
}
117-
118-
static ArrayRef<std::pair<StringRef, StringRef>> copyStringPairArray(
119-
llvm::BumpPtrAllocator &Allocator,
120-
ArrayRef<std::pair<StringRef, StringRef>> Arr) {
121-
std::pair<StringRef, StringRef> *Buff = Allocator.Allocate<std::pair<StringRef,
122-
StringRef>>(Arr.size());
123-
std::copy(Arr.begin(), Arr.end(), Buff);
124-
return llvm::makeArrayRef(Buff, Arr.size());
125-
}
126-
127105
/// Deserializes CodeCompletionResults from \p in and stores them in \p V.
128106
/// \see writeCacheModule.
129107
static bool readCachedModule(llvm::MemoryBuffer *in,
@@ -251,8 +229,8 @@ static bool readCachedModule(llvm::MemoryBuffer *in,
251229
result = new (*V.Sink.Allocator) CodeCompletionResult(
252230
context, numBytesToErase, string, declKind, isSystem, moduleName,
253231
notRecommended, CodeCompletionResult::NotRecommendedReason::NoReason,
254-
briefDocComment, copyStringArray(*V.Sink.Allocator, assocUSRs),
255-
copyStringPairArray(*V.Sink.Allocator, declKeywords),
232+
briefDocComment, copyArray(*V.Sink.Allocator, ArrayRef<StringRef>(assocUSRs)),
233+
copyArray(*V.Sink.Allocator, ArrayRef<std::pair<StringRef, StringRef>>(declKeywords)),
256234
CodeCompletionResult::Unknown, opKind);
257235
} else {
258236
result = new (*V.Sink.Allocator)

tools/SourceKit/lib/SwiftLang/CodeCompletionOrganizer.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,6 @@ std::vector<Completion *> SourceKit::CodeCompletion::extendCompletions(
157157
return results;
158158
}
159159

160-
static StringRef copyString(llvm::BumpPtrAllocator &allocator, StringRef str);
161-
162160
bool SourceKit::CodeCompletion::addCustomCompletions(
163161
CompletionSink &sink, std::vector<Completion *> &completions,
164162
ArrayRef<CustomCompletionInfo> customCompletions,
@@ -405,12 +403,6 @@ ImportDepth::ImportDepth(ASTContext &context,
405403
// CodeCompletionOrganizer::Impl utilities
406404
//===----------------------------------------------------------------------===//
407405

408-
static StringRef copyString(llvm::BumpPtrAllocator &allocator, StringRef str) {
409-
char *newStr = allocator.Allocate<char>(str.size());
410-
std::copy(str.begin(), str.end(), newStr);
411-
return StringRef(newStr, str.size());
412-
}
413-
414406
static std::unique_ptr<Group> make_group(StringRef name) {
415407
auto g = std::make_unique<Group>();
416408
g->name = name.str();

0 commit comments

Comments
 (0)