Skip to content

Commit 9eeb96c

Browse files
committed
[CodeCompletion] Handle cases where PersistentParserState is not created
For example, if stdlib is not found, CompilerInstance simply returns before creating PersistentParserState. In such cases, completion should just return empty result. Previously, it caused SourceKit crash. rdar://problem/58663066
1 parent 5fc2cfa commit 9eeb96c

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

lib/IDE/CompletionInstance.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,8 @@ bool CompletionInstance::performCachedOperaitonIfPossible(
171171

172172
auto &CI = *CachedCI;
173173

174+
if (!CI.hasPersistentParserState())
175+
return false;
174176
auto &oldState = CI.getPersistentParserState();
175177
if (!oldState.hasCodeCompletionDelayedDeclState())
176178
return false;
@@ -321,7 +323,8 @@ bool CompletionInstance::performNewOperation(
321323
registerIDERequestFunctions(CI.getASTContext().evaluator);
322324

323325
CI.performParseAndResolveImportsOnly();
324-
Callback(CI);
326+
if (CI.hasPersistentParserState())
327+
Callback(CI);
325328

326329
if (DiagC)
327330
CI.removeDiagnosticConsumer(DiagC);
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Str {
2+
var value: Str
3+
}
4+
5+
// rdar://problem/58663066
6+
// Test a environment where stdlib is not found.
7+
// Completion should return zero result.
8+
9+
// RUN: %empty-directory(%t/rsrc)
10+
// RUN: %empty-directory(%t/sdk)
11+
12+
// RUN: %sourcekitd-test \
13+
// RUN: -req=complete -pos=4:1 %s -- %s -resource-dir %t/rsrc -sdk %t/sdk | %FileCheck %s
14+
// RUN: %sourcekitd-test \
15+
// RUN: -req=complete -req-opts=reuseastcontext=1 -pos=4:1 %s -- %s -resource-dir %t/rsrc -sdk %t/sdk == \
16+
// RUN: -req=complete -req-opts=reuseastcontext=1 -pos=4:1 %s -- %s -resource-dir %t/rsrc -sdk %t/sdk | %FileCheck %s
17+
18+
// CHECK: key.results: [
19+
// CHECK-NOT: key.description:

0 commit comments

Comments
 (0)