Skip to content

Commit dec3267

Browse files
committed
[CodeCompletion] Compute InvalidAsyncContext warning when making a completion result contextual
Store whether a result is async in the `ContextFreeCodeCompletionResult` and determine whether an async method is used in a sync context when promoting the context free result to a contextual result. rdar://78317170
1 parent 9fc850a commit dec3267

15 files changed

+135
-77
lines changed

include/swift/IDE/CodeCompletionConsumer.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ class CodeCompletionConsumer {
3030
handleResultsAndModules(CodeCompletionContext &context,
3131
ArrayRef<RequestedCachedModule> requestedModules,
3232
const ExpectedTypeContext *TypeContext,
33-
const DeclContext *DC) = 0;
33+
const DeclContext *DC,
34+
bool CanCurrDeclContextHandleAsync) = 0;
3435
};
3536

3637
/// A simplified code completion consumer interface that clients can use to get
@@ -42,7 +43,8 @@ struct SimpleCachingCodeCompletionConsumer : public CodeCompletionConsumer {
4243
void handleResultsAndModules(CodeCompletionContext &context,
4344
ArrayRef<RequestedCachedModule> requestedModules,
4445
const ExpectedTypeContext *TypeContext,
45-
const DeclContext *DCForModules) override;
46+
const DeclContext *DCForModules,
47+
bool CanCurrDeclContextHandleAsync) override;
4648

4749
/// Clients should override this method to receive \p Results.
4850
virtual void handleResults(CodeCompletionContext &context) = 0;

include/swift/IDE/CodeCompletionResult.h

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,7 @@ class ContextFreeCodeCompletionResult {
326326
static_assert(int(CodeCompletionOperatorKind::MAX_VALUE) < 1 << 6, "");
327327

328328
bool IsSystem : 1;
329+
bool IsAsync : 1;
329330
CodeCompletionString *CompletionString;
330331
NullTerminatedStringRef ModuleName;
331332
NullTerminatedStringRef BriefDocComment;
@@ -356,7 +357,7 @@ class ContextFreeCodeCompletionResult {
356357
/// \c CodeCompletionResultSink as the result itself.
357358
ContextFreeCodeCompletionResult(
358359
CodeCompletionResultKind Kind, uint8_t AssociatedKind,
359-
CodeCompletionOperatorKind KnownOperatorKind, bool IsSystem,
360+
CodeCompletionOperatorKind KnownOperatorKind, bool IsSystem, bool IsAsync,
360361
CodeCompletionString *CompletionString,
361362
NullTerminatedStringRef ModuleName,
362363
NullTerminatedStringRef BriefDocComment,
@@ -368,10 +369,10 @@ class ContextFreeCodeCompletionResult {
368369
NullTerminatedStringRef FilterName,
369370
NullTerminatedStringRef NameForDiagnostics)
370371
: Kind(Kind), KnownOperatorKind(KnownOperatorKind), IsSystem(IsSystem),
371-
CompletionString(CompletionString), ModuleName(ModuleName),
372-
BriefDocComment(BriefDocComment), AssociatedUSRs(AssociatedUSRs),
373-
ResultType(ResultType), NotRecommended(NotRecommended),
374-
DiagnosticSeverity(DiagnosticSeverity),
372+
IsAsync(IsAsync), CompletionString(CompletionString),
373+
ModuleName(ModuleName), BriefDocComment(BriefDocComment),
374+
AssociatedUSRs(AssociatedUSRs), ResultType(ResultType),
375+
NotRecommended(NotRecommended), DiagnosticSeverity(DiagnosticSeverity),
375376
DiagnosticMessage(DiagnosticMessage), FilterName(FilterName),
376377
NameForDiagnostics(NameForDiagnostics) {
377378
this->AssociatedKind.Opaque = AssociatedKind;
@@ -399,7 +400,7 @@ class ContextFreeCodeCompletionResult {
399400
static ContextFreeCodeCompletionResult *createPatternOrBuiltInOperatorResult(
400401
CodeCompletionResultSink &Sink, CodeCompletionResultKind Kind,
401402
CodeCompletionString *CompletionString,
402-
CodeCompletionOperatorKind KnownOperatorKind,
403+
CodeCompletionOperatorKind KnownOperatorKind, bool IsAsync,
403404
NullTerminatedStringRef BriefDocComment,
404405
CodeCompletionResultType ResultType,
405406
ContextFreeNotRecommendedReason NotRecommended,
@@ -434,15 +435,17 @@ class ContextFreeCodeCompletionResult {
434435
/// \note The caller must ensure that the \p CompletionString and all
435436
/// \c StringRefs outlive this result, typically by storing them in the same
436437
/// \c CodeCompletionResultSink as the result itself.
437-
static ContextFreeCodeCompletionResult *createDeclResult(
438-
CodeCompletionResultSink &Sink, CodeCompletionString *CompletionString,
439-
const Decl *AssociatedDecl, NullTerminatedStringRef ModuleName,
440-
NullTerminatedStringRef BriefDocComment,
441-
ArrayRef<NullTerminatedStringRef> AssociatedUSRs,
442-
CodeCompletionResultType ResultType,
443-
ContextFreeNotRecommendedReason NotRecommended,
444-
CodeCompletionDiagnosticSeverity DiagnosticSeverity,
445-
NullTerminatedStringRef DiagnosticMessage);
438+
static ContextFreeCodeCompletionResult *
439+
createDeclResult(CodeCompletionResultSink &Sink,
440+
CodeCompletionString *CompletionString,
441+
const Decl *AssociatedDecl, bool IsAsync,
442+
NullTerminatedStringRef ModuleName,
443+
NullTerminatedStringRef BriefDocComment,
444+
ArrayRef<NullTerminatedStringRef> AssociatedUSRs,
445+
CodeCompletionResultType ResultType,
446+
ContextFreeNotRecommendedReason NotRecommended,
447+
CodeCompletionDiagnosticSeverity DiagnosticSeverity,
448+
NullTerminatedStringRef DiagnosticMessage);
446449

447450
CodeCompletionResultKind getKind() const { return Kind; }
448451

@@ -472,6 +475,8 @@ class ContextFreeCodeCompletionResult {
472475

473476
bool isSystem() const { return IsSystem; };
474477

478+
bool isAsync() const { return IsAsync; };
479+
475480
CodeCompletionString *getCompletionString() const { return CompletionString; }
476481

477482
NullTerminatedStringRef getModuleName() const { return ModuleName; }
@@ -579,6 +584,7 @@ class CodeCompletionResult {
579584
const ExpectedTypeContext *TypeContext,
580585
const DeclContext *DC,
581586
const USRBasedTypeContext *USRTypeContext,
587+
bool CanCurrDeclContextHandleAsync,
582588
ContextualNotRecommendedReason NotRecommended);
583589

584590
const ContextFreeCodeCompletionResult &getContextFreeResult() const {

include/swift/IDE/CompletionLookup.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,10 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
254254

255255
void setIdealExpectedType(Type Ty) { expectedTypeContext.setIdealType(Ty); }
256256

257+
bool canCurrDeclContextHandleAsync() const {
258+
return CanCurrDeclContextHandleAsync;
259+
}
260+
257261
void setCanCurrDeclContextHandleAsync(bool CanCurrDeclContextHandleAsync) {
258262
this->CanCurrDeclContextHandleAsync = CanCurrDeclContextHandleAsync;
259263
}

lib/IDE/CodeCompletion.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1359,7 +1359,8 @@ void swift::ide::deliverCompletionResults(
13591359
/*Sink=*/nullptr);
13601360

13611361
Consumer.handleResultsAndModules(CompletionContext, RequestedModules,
1362-
Lookup.getExpectedTypeContext(), DC);
1362+
Lookup.getExpectedTypeContext(), DC,
1363+
Lookup.canCurrDeclContextHandleAsync());
13631364
}
13641365

13651366
bool CodeCompletionCallbacksImpl::trySolverCompletion(bool MaybeFuncBody) {

lib/IDE/CodeCompletionCache.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ CodeCompletionCache::~CodeCompletionCache() {}
104104
/// This should be incremented any time we commit a change to the format of the
105105
/// cached results. This isn't expected to change very often.
106106
static constexpr uint32_t onDiskCompletionCacheVersion =
107-
8; // Store name for diagnostics
107+
9; // Store whether a decl is async
108108

109109
/// Deserializes CodeCompletionResults from \p in and stores them in \p V.
110110
/// \see writeCacheModule.
@@ -235,6 +235,7 @@ static bool readCachedModule(llvm::MemoryBuffer *in,
235235
auto diagSeverity =
236236
static_cast<CodeCompletionDiagnosticSeverity>(*cursor++);
237237
auto isSystem = static_cast<bool>(*cursor++);
238+
auto isAsync = static_cast<bool>(*cursor++);
238239
auto chunkIndex = read32le(cursor);
239240
auto moduleIndex = read32le(cursor);
240241
auto briefDocIndex = read32le(cursor);
@@ -264,7 +265,7 @@ static bool readCachedModule(llvm::MemoryBuffer *in,
264265

265266
ContextFreeCodeCompletionResult *result =
266267
new (*V.Allocator) ContextFreeCodeCompletionResult(
267-
kind, associatedKind, opKind, isSystem, string, moduleName,
268+
kind, associatedKind, opKind, isSystem, isAsync, string, moduleName,
268269
briefDocComment, makeArrayRef(assocUSRs).copy(*V.Allocator),
269270
CodeCompletionResultType(resultTypes), notRecommended, diagSeverity,
270271
diagMessage, filterName, nameForDiagnostics);
@@ -423,6 +424,7 @@ static void writeCachedModule(llvm::raw_ostream &out,
423424
LE.write(static_cast<uint8_t>(R->getNotRecommendedReason()));
424425
LE.write(static_cast<uint8_t>(R->getDiagnosticSeverity()));
425426
LE.write(static_cast<uint8_t>(R->isSystem()));
427+
LE.write(static_cast<uint8_t>(R->isAsync()));
426428
LE.write(
427429
static_cast<uint32_t>(addCompletionString(R->getCompletionString())));
428430
LE.write(addString(R->getModuleName())); // index into strings

lib/IDE/CodeCompletionConsumer.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ using namespace swift::ide;
1919
static MutableArrayRef<CodeCompletionResult *> copyCodeCompletionResults(
2020
CodeCompletionResultSink &targetSink, CodeCompletionCache::Value &source,
2121
bool onlyTypes, bool onlyPrecedenceGroups,
22-
const ExpectedTypeContext *TypeContext, const DeclContext *DC) {
22+
const ExpectedTypeContext *TypeContext, const DeclContext *DC,
23+
bool CanCurrDeclContextHandleAsync) {
2324

2425
// We will be adding foreign results (from another sink) into TargetSink.
2526
// TargetSink should have an owning pointer to the allocator that keeps the
@@ -87,7 +88,7 @@ static MutableArrayRef<CodeCompletionResult *> copyCodeCompletionResults(
8788
*contextFreeResult, SemanticContextKind::OtherModule,
8889
CodeCompletionFlair(),
8990
/*numBytesToErase=*/0, TypeContext, DC, &USRTypeContext,
90-
ContextualNotRecommendedReason::None);
91+
CanCurrDeclContextHandleAsync, ContextualNotRecommendedReason::None);
9192
targetSink.Results.push_back(contextualResult);
9293
}
9394

@@ -98,7 +99,8 @@ static MutableArrayRef<CodeCompletionResult *> copyCodeCompletionResults(
9899
void SimpleCachingCodeCompletionConsumer::handleResultsAndModules(
99100
CodeCompletionContext &context,
100101
ArrayRef<RequestedCachedModule> requestedModules,
101-
const ExpectedTypeContext *TypeContext, const DeclContext *DC) {
102+
const ExpectedTypeContext *TypeContext, const DeclContext *DC,
103+
bool CanCurrDeclContextHandleAsync) {
102104

103105
// Use the current SourceFile as the DeclContext so that we can use it to
104106
// perform qualified lookup, and to get the correct visibility for
@@ -143,9 +145,9 @@ void SimpleCachingCodeCompletionConsumer::handleResultsAndModules(
143145
context.Cache.set(R.Key, *V);
144146
}
145147
assert(V.hasValue());
146-
auto newItems =
147-
copyCodeCompletionResults(context.getResultSink(), **V, R.OnlyTypes,
148-
R.OnlyPrecedenceGroups, TypeContext, DC);
148+
auto newItems = copyCodeCompletionResults(
149+
context.getResultSink(), **V, R.OnlyTypes, R.OnlyPrecedenceGroups,
150+
TypeContext, DC, CanCurrDeclContextHandleAsync);
149151
postProcessCompletionResults(newItems, context.CodeCompletionKind, DC,
150152
&context.getResultSink());
151153
}

lib/IDE/CodeCompletionResult.cpp

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ ContextFreeCodeCompletionResult *
2626
ContextFreeCodeCompletionResult::createPatternOrBuiltInOperatorResult(
2727
CodeCompletionResultSink &Sink, CodeCompletionResultKind Kind,
2828
CodeCompletionString *CompletionString,
29-
CodeCompletionOperatorKind KnownOperatorKind,
29+
CodeCompletionOperatorKind KnownOperatorKind, bool IsAsync,
3030
NullTerminatedStringRef BriefDocComment,
3131
CodeCompletionResultType ResultType,
3232
ContextFreeNotRecommendedReason NotRecommended,
@@ -43,7 +43,8 @@ ContextFreeCodeCompletionResult::createPatternOrBuiltInOperatorResult(
4343
}
4444
return new (Sink.getAllocator()) ContextFreeCodeCompletionResult(
4545
Kind, /*AssociatedKind=*/0, KnownOperatorKind,
46-
/*IsSystem=*/false, CompletionString, /*ModuleName=*/"", BriefDocComment,
46+
/*IsSystem=*/false, IsAsync, CompletionString,
47+
/*ModuleName=*/"", BriefDocComment,
4748
/*AssociatedUSRs=*/{}, ResultType, NotRecommended, DiagnosticSeverity,
4849
DiagnosticMessage,
4950
getCodeCompletionResultFilterName(CompletionString, Sink.getAllocator()),
@@ -61,7 +62,8 @@ ContextFreeCodeCompletionResult::createKeywordResult(
6162
}
6263
return new (Sink.getAllocator()) ContextFreeCodeCompletionResult(
6364
CodeCompletionResultKind::Keyword, static_cast<uint8_t>(Kind),
64-
CodeCompletionOperatorKind::None, /*IsSystem=*/false, CompletionString,
65+
CodeCompletionOperatorKind::None, /*IsSystem=*/false, /*IsAsync=*/false,
66+
CompletionString,
6567
/*ModuleName=*/"", BriefDocComment,
6668
/*AssociatedUSRs=*/{}, ResultType, ContextFreeNotRecommendedReason::None,
6769
CodeCompletionDiagnosticSeverity::None, /*DiagnosticMessage=*/"",
@@ -80,7 +82,8 @@ ContextFreeCodeCompletionResult::createLiteralResult(
8082
return new (Sink.getAllocator()) ContextFreeCodeCompletionResult(
8183
CodeCompletionResultKind::Literal, static_cast<uint8_t>(LiteralKind),
8284
CodeCompletionOperatorKind::None,
83-
/*IsSystem=*/false, CompletionString, /*ModuleName=*/"",
85+
/*IsSystem=*/false, /*IsAsync=*/false, CompletionString,
86+
/*ModuleName=*/"",
8487
/*BriefDocComment=*/"",
8588
/*AssociatedUSRs=*/{}, ResultType, ContextFreeNotRecommendedReason::None,
8689
CodeCompletionDiagnosticSeverity::None, /*DiagnosticMessage=*/"",
@@ -95,7 +98,7 @@ getDeclNameForDiagnostics(const Decl *D, CodeCompletionResultSink &Sink) {
9598
llvm::raw_svector_ostream NameOS(Name);
9699
NameOS << "'";
97100
llvm::SmallString<64> Scratch;
98-
NameOS << VD->getName().getString(Scratch);
101+
VD->getName().printPretty(NameOS);
99102
NameOS << "'";
100103
return NullTerminatedStringRef(NameOS.str(), Sink.getAllocator());
101104
} else {
@@ -106,8 +109,8 @@ getDeclNameForDiagnostics(const Decl *D, CodeCompletionResultSink &Sink) {
106109
ContextFreeCodeCompletionResult *
107110
ContextFreeCodeCompletionResult::createDeclResult(
108111
CodeCompletionResultSink &Sink, CodeCompletionString *CompletionString,
109-
const Decl *AssociatedDecl, NullTerminatedStringRef ModuleName,
110-
NullTerminatedStringRef BriefDocComment,
112+
const Decl *AssociatedDecl, bool IsAsync,
113+
NullTerminatedStringRef ModuleName, NullTerminatedStringRef BriefDocComment,
111114
ArrayRef<NullTerminatedStringRef> AssociatedUSRs,
112115
CodeCompletionResultType ResultType,
113116
ContextFreeNotRecommendedReason NotRecommended,
@@ -121,8 +124,8 @@ ContextFreeCodeCompletionResult::createDeclResult(
121124
CodeCompletionResultKind::Declaration,
122125
static_cast<uint8_t>(getCodeCompletionDeclKind(AssociatedDecl)),
123126
CodeCompletionOperatorKind::None, getDeclIsSystem(AssociatedDecl),
124-
CompletionString, ModuleName, BriefDocComment, AssociatedUSRs, ResultType,
125-
NotRecommended, DiagnosticSeverity, DiagnosticMessage,
127+
IsAsync, CompletionString, ModuleName, BriefDocComment, AssociatedUSRs,
128+
ResultType, NotRecommended, DiagnosticSeverity, DiagnosticMessage,
126129
getCodeCompletionResultFilterName(CompletionString, Sink.getAllocator()),
127130
/*NameForDiagnostics=*/getDeclNameForDiagnostics(AssociatedDecl, Sink));
128131
}
@@ -288,14 +291,30 @@ bool ContextFreeCodeCompletionResult::getDeclIsSystem(const Decl *D) {
288291

289292
// MARK: - CodeCompletionResult
290293

294+
static ContextualNotRecommendedReason
295+
getNotRecommenedReason(const ContextFreeCodeCompletionResult &ContextFree,
296+
bool CanCurrDeclContextHandleAsync,
297+
ContextualNotRecommendedReason ExplicitReason) {
298+
if (ExplicitReason != ContextualNotRecommendedReason::None) {
299+
return ExplicitReason;
300+
}
301+
if (ContextFree.isAsync() && !CanCurrDeclContextHandleAsync) {
302+
return ContextualNotRecommendedReason::InvalidAsyncContext;
303+
}
304+
return ContextualNotRecommendedReason::None;
305+
}
306+
291307
CodeCompletionResult::CodeCompletionResult(
292308
const ContextFreeCodeCompletionResult &ContextFree,
293309
SemanticContextKind SemanticContext, CodeCompletionFlair Flair,
294310
uint8_t NumBytesToErase, const ExpectedTypeContext *TypeContext,
295311
const DeclContext *DC, const USRBasedTypeContext *USRTypeContext,
312+
bool CanCurrDeclContextHandleAsync,
296313
ContextualNotRecommendedReason NotRecommended)
297314
: ContextFree(ContextFree), SemanticContext(SemanticContext),
298-
Flair(Flair.toRaw()), NotRecommended(NotRecommended),
315+
Flair(Flair.toRaw()),
316+
NotRecommended(getNotRecommenedReason(
317+
ContextFree, CanCurrDeclContextHandleAsync, NotRecommended)),
299318
NumBytesToErase(NumBytesToErase),
300319
TypeDistance(ContextFree.getResultType().calculateTypeRelation(
301320
TypeContext, DC, USRTypeContext)) {}

lib/IDE/CodeCompletionResultBuilder.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ CodeCompletionResult *CodeCompletionResultBuilder::takeResult() {
128128
}
129129

130130
ContextFreeResult = ContextFreeCodeCompletionResult::createDeclResult(
131-
Sink, CCS, AssociatedDecl, ModuleName,
131+
Sink, CCS, AssociatedDecl, IsAsync, ModuleName,
132132
NullTerminatedStringRef(BriefDocComment, Allocator),
133133
copyAssociatedUSRs(Allocator, AssociatedDecl), ResultType,
134134
ContextFreeNotRecReason, ContextFreeDiagnosticSeverity,
@@ -145,7 +145,7 @@ CodeCompletionResult *CodeCompletionResultBuilder::takeResult() {
145145
case CodeCompletionResultKind::Pattern:
146146
ContextFreeResult =
147147
ContextFreeCodeCompletionResult::createPatternOrBuiltInOperatorResult(
148-
Sink, Kind, CCS, CodeCompletionOperatorKind::None,
148+
Sink, Kind, CCS, CodeCompletionOperatorKind::None, IsAsync,
149149
NullTerminatedStringRef(BriefDocComment, Allocator), ResultType,
150150
ContextFreeNotRecReason, ContextFreeDiagnosticSeverity,
151151
ContextFreeDiagnosticMessage);
@@ -164,6 +164,7 @@ CodeCompletionResult *CodeCompletionResultBuilder::takeResult() {
164164
*ContextFreeResult, SemanticContextKind::None, CodeCompletionFlair(),
165165
/*NumBytesToErase=*/0, /*TypeContext=*/nullptr,
166166
/*DC=*/nullptr, /*USRTypeContext=*/nullptr,
167+
/*CanCurrDeclContextHandleAsync=*/false,
167168
ContextualNotRecommendedReason::None);
168169
} else {
169170
assert(
@@ -175,7 +176,8 @@ CodeCompletionResult *CodeCompletionResultBuilder::takeResult() {
175176
// for USRTypeContext.
176177
return new (Allocator) CodeCompletionResult(
177178
*ContextFreeResult, SemanticContext, Flair, NumBytesToErase,
178-
TypeContext, DC, /*USRTypeContext=*/nullptr, ContextualNotRecReason);
179+
TypeContext, DC, /*USRTypeContext=*/nullptr,
180+
CanCurrDeclContextHandleAsync, ContextualNotRecReason);
179181
}
180182
}
181183

lib/IDE/CodeCompletionResultBuilder.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class CodeCompletionResultBuilder {
4343
CodeCompletionFlair Flair;
4444
unsigned NumBytesToErase = 0;
4545
const Decl *AssociatedDecl = nullptr;
46+
bool IsAsync = false;
4647
Optional<CodeCompletionLiteralKind> LiteralKind;
4748
CodeCompletionKeywordKind KeywordKind = CodeCompletionKeywordKind::None;
4849
unsigned CurrentNestingLevel = 0;
@@ -63,6 +64,7 @@ class CodeCompletionResultBuilder {
6364
/// type relation to \c ResultType.
6465
const ExpectedTypeContext *TypeContext = nullptr;
6566
const DeclContext *DC = nullptr;
67+
bool CanCurrDeclContextHandleAsync = false;
6668

6769
void addChunkWithText(CodeCompletionString::Chunk::ChunkKind Kind,
6870
StringRef Text);
@@ -113,6 +115,8 @@ class CodeCompletionResultBuilder {
113115

114116
void setAssociatedDecl(const Decl *D);
115117

118+
void setIsAsync(bool IsAsync) { this->IsAsync = IsAsync; }
119+
116120
void setLiteralKind(CodeCompletionLiteralKind kind) { LiteralKind = kind; }
117121
void setKeywordKind(CodeCompletionKeywordKind kind) { KeywordKind = kind; }
118122
void setContextFreeNotRecommended(ContextFreeNotRecommendedReason Reason) {
@@ -149,6 +153,10 @@ class CodeCompletionResultBuilder {
149153
this->DC = DC;
150154
}
151155

156+
void setCanCurrDeclContextHandleAsync(bool CanCurrDeclContextHandleAsync) {
157+
this->CanCurrDeclContextHandleAsync = CanCurrDeclContextHandleAsync;
158+
}
159+
152160
void withNestedGroup(CodeCompletionString::Chunk::ChunkKind Kind,
153161
llvm::function_ref<void()> body);
154162

0 commit comments

Comments
 (0)