mirror of https://github.com/microsoft/clang.git
Switch c-index-test from clang_codeComplete() over to
clang_codeCompleteAt(). This uncovered a few issues with the latter: - ASTUnit wasn't saving/restoring diagnostic state appropriately between reparses and code completions. - "Overload" completions weren't being passed through to the client git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@116241 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f2ad2c9272
commit
32be4a588f
|
@ -722,7 +722,8 @@ public:
|
|||
/// \brief Create a new code-completion string that describes the function
|
||||
/// signature of this overload candidate.
|
||||
CodeCompletionString *CreateSignatureString(unsigned CurrentArg,
|
||||
Sema &S) const;
|
||||
Sema &S,
|
||||
CodeCompletionString *Result = 0) const;
|
||||
};
|
||||
|
||||
CodeCompleteConsumer() : IncludeMacros(false), IncludeCodePatterns(false),
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include "clang/Frontend/FrontendActions.h"
|
||||
#include "clang/Frontend/FrontendDiagnostic.h"
|
||||
#include "clang/Frontend/FrontendOptions.h"
|
||||
#include "clang/Frontend/Utils.h"
|
||||
#include "clang/Serialization/ASTReader.h"
|
||||
#include "clang/Serialization/ASTWriter.h"
|
||||
#include "clang/Lex/HeaderSearch.h"
|
||||
|
@ -1058,7 +1059,11 @@ llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble(
|
|||
|
||||
// Set the state of the diagnostic object to mimic its state
|
||||
// after parsing the preamble.
|
||||
// FIXME: This won't catch any #pragma push warning changes that
|
||||
// have occurred in the preamble.
|
||||
getDiagnostics().Reset();
|
||||
ProcessWarningOptions(getDiagnostics(),
|
||||
PreambleInvocation.getDiagnosticOpts());
|
||||
getDiagnostics().setNumWarnings(NumWarningsInPreamble);
|
||||
if (StoredDiagnostics.size() > NumStoredDiagnosticsInPreamble)
|
||||
StoredDiagnostics.erase(
|
||||
|
@ -1195,6 +1200,7 @@ llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble(
|
|||
|
||||
// Clear out old caches and data.
|
||||
getDiagnostics().Reset();
|
||||
ProcessWarningOptions(getDiagnostics(), Clang.getDiagnosticOpts());
|
||||
StoredDiagnostics.clear();
|
||||
TopLevelDecls.clear();
|
||||
TopLevelDeclsInPreamble.clear();
|
||||
|
@ -1463,8 +1469,10 @@ bool ASTUnit::Reparse(RemappedFile *RemappedFiles, unsigned NumRemappedFiles) {
|
|||
OverrideMainBuffer = getMainBufferWithPrecompiledPreamble(*Invocation);
|
||||
|
||||
// Clear out the diagnostics state.
|
||||
if (!OverrideMainBuffer)
|
||||
if (!OverrideMainBuffer) {
|
||||
getDiagnostics().Reset();
|
||||
ProcessWarningOptions(getDiagnostics(), Invocation->getDiagnosticOpts());
|
||||
}
|
||||
|
||||
// Parse the sources
|
||||
bool Result = Parse(OverrideMainBuffer);
|
||||
|
@ -1757,6 +1765,7 @@ void ASTUnit::CodeComplete(llvm::StringRef File, unsigned Line, unsigned Column,
|
|||
|
||||
// Set up diagnostics, capturing any diagnostics produced.
|
||||
Clang.setDiagnostics(&Diag);
|
||||
ProcessWarningOptions(Diag, CCInvocation.getDiagnosticOpts());
|
||||
CaptureDroppedDiagnostics Capture(true,
|
||||
Clang.getDiagnostics(),
|
||||
StoredDiagnostics);
|
||||
|
|
|
@ -2366,10 +2366,12 @@ CodeCompletionResult::CreateCodeCompletionString(Sema &S,
|
|||
CodeCompletionString *
|
||||
CodeCompleteConsumer::OverloadCandidate::CreateSignatureString(
|
||||
unsigned CurrentArg,
|
||||
Sema &S) const {
|
||||
Sema &S,
|
||||
CodeCompletionString *Result) const {
|
||||
typedef CodeCompletionString::Chunk Chunk;
|
||||
|
||||
CodeCompletionString *Result = new CodeCompletionString;
|
||||
if (!Result)
|
||||
Result = new CodeCompletionString;
|
||||
FunctionDecl *FDecl = getFunction();
|
||||
AddResultTypeChunk(S.Context, FDecl, Result);
|
||||
const FunctionProtoType *Proto
|
||||
|
|
|
@ -5,25 +5,25 @@
|
|||
@implementation MyClass
|
||||
@end
|
||||
|
||||
// RUN: c-index-test -code-completion-at=%s:2:2 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC1 %s
|
||||
// RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test -code-completion-at=%s:2:2 %s | FileCheck -check-prefix=CHECK-CC1 %s
|
||||
// CHECK-CC1: {TypedText class}{HorizontalSpace }{Placeholder name}
|
||||
// CHECK-CC1: {TypedText compatibility_alias}{HorizontalSpace }{Placeholder alias}{HorizontalSpace }{Placeholder class}
|
||||
// CHECK-CC1: {TypedText implementation}{HorizontalSpace }{Placeholder class}
|
||||
// CHECK-CC1: {TypedText interface}{HorizontalSpace }{Placeholder class}
|
||||
// CHECK-CC1: {TypedText protocol}{HorizontalSpace }{Placeholder protocol}
|
||||
|
||||
// RUN: c-index-test -code-completion-at=%s:3:2 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC2 %s
|
||||
// RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test -code-completion-at=%s:3:2 %s | FileCheck -check-prefix=CHECK-CC2 %s
|
||||
// CHECK-CC2: {TypedText end}
|
||||
// CHECK-CC2: {TypedText optional}
|
||||
// CHECK-CC2: {TypedText property}
|
||||
// CHECK-CC2: {TypedText required}
|
||||
|
||||
// RUN: c-index-test -code-completion-at=%s:6:2 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC3 %s
|
||||
// RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test -code-completion-at=%s:6:2 %s | FileCheck -check-prefix=CHECK-CC3 %s
|
||||
// CHECK-CC3: {TypedText dynamic}{HorizontalSpace }{Placeholder property}
|
||||
// CHECK-CC3: {TypedText end}
|
||||
// CHECK-CC3: {TypedText synthesize}{HorizontalSpace }{Placeholder property}
|
||||
|
||||
// RUN: c-index-test -code-completion-at=%s:2:1 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC4 %s
|
||||
// RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test -code-completion-at=%s:2:1 %s | FileCheck -check-prefix=CHECK-CC4 %s
|
||||
// CHECK-CC4: NotImplemented:{TypedText @class}{HorizontalSpace }{Placeholder name}
|
||||
// CHECK-CC4: NotImplemented:{TypedText @compatibility_alias}{HorizontalSpace }{Placeholder alias}{HorizontalSpace }{Placeholder class}
|
||||
// CHECK-CC4: NotImplemented:{TypedText @implementation}{HorizontalSpace }{Placeholder class}
|
||||
|
@ -34,19 +34,19 @@
|
|||
// CHECK-CC4: TypedefDecl:{TypedText id}
|
||||
// CHECK-CC4: TypedefDecl:{TypedText SEL}
|
||||
|
||||
// RUN: c-index-test -code-completion-at=%s:3:1 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC5 %s
|
||||
// RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test -code-completion-at=%s:3:1 %s | FileCheck -check-prefix=CHECK-CC5 %s
|
||||
// CHECK-CC5: {TypedText @end}
|
||||
// CHECK-CC5: {TypedText @optional}
|
||||
// CHECK-CC5: {TypedText @property}
|
||||
// CHECK-CC5: {TypedText @required}
|
||||
|
||||
// RUN: c-index-test -code-completion-at=%s:2:23 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC6 %s
|
||||
// RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test -code-completion-at=%s:2:23 %s | FileCheck -check-prefix=CHECK-CC6 %s
|
||||
// CHECK-CC6: NotImplemented:{TypedText package}
|
||||
// CHECK-CC6: NotImplemented:{TypedText private}
|
||||
// CHECK-CC6: NotImplemented:{TypedText protected}
|
||||
// CHECK-CC6: NotImplemented:{TypedText public}
|
||||
|
||||
// RUN: c-index-test -code-completion-at=%s:2:22 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC7 %s
|
||||
// RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test -code-completion-at=%s:2:22 %s | FileCheck -check-prefix=CHECK-CC7 %s
|
||||
// CHECK-CC7: NotImplemented:{TypedText @package}
|
||||
// CHECK-CC7: NotImplemented:{TypedText @private}
|
||||
// CHECK-CC7: NotImplemented:{TypedText @protected}
|
||||
|
|
|
@ -19,18 +19,18 @@ void f() {
|
|||
@selector(add:to:);
|
||||
}
|
||||
|
||||
// RUN: c-index-test -code-completion-at=%s:9:4 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC1 %s
|
||||
// RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test -code-completion-at=%s:9:4 %s | FileCheck -check-prefix=CHECK-CC1 %s
|
||||
// CHECK-CC1: {TypedText encode}{LeftParen (}{Placeholder type-name}{RightParen )}
|
||||
// CHECK-CC1: {TypedText protocol}{LeftParen (}{Placeholder protocol-name}{RightParen )}
|
||||
// CHECK-CC1: {TypedText selector}{LeftParen (}{Placeholder selector}{RightParen )}
|
||||
// CHECK-CC1: {TypedText synchronized}{HorizontalSpace }{LeftParen (}{Placeholder expression}{RightParen )}{LeftBrace {}{Placeholder statements}{RightBrace }}
|
||||
// CHECK-CC1: {TypedText throw}{HorizontalSpace }{Placeholder expression}
|
||||
// CHECK-CC1: {TypedText try}{LeftBrace {}{Placeholder statements}{RightBrace }}{Text @catch}{LeftParen (}{Placeholder parameter}{RightParen )}{LeftBrace {}{Placeholder statements}{RightBrace }}{Text @finally}{LeftBrace {}{Placeholder statements}{RightBrace }}
|
||||
// RUN: c-index-test -code-completion-at=%s:9:19 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC2 %s
|
||||
// RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test -code-completion-at=%s:9:19 %s | FileCheck -check-prefix=CHECK-CC2 %s
|
||||
// CHECK-CC2: {TypedText encode}{LeftParen (}{Placeholder type-name}{RightParen )}
|
||||
// CHECK-CC2: {TypedText protocol}{LeftParen (}{Placeholder protocol-name}{RightParen )}
|
||||
// CHECK-CC2: {TypedText selector}{LeftParen (}{Placeholder selector}{RightParen )}
|
||||
// RUN: c-index-test -code-completion-at=%s:9:3 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC3 %s
|
||||
// RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test -code-completion-at=%s:9:3 %s | FileCheck -check-prefix=CHECK-CC3 %s
|
||||
// CHECK-CC3: NotImplemented:{TypedText @encode}{LeftParen (}{Placeholder type-name}{RightParen )}
|
||||
// CHECK-CC3: NotImplemented:{TypedText @protocol}{LeftParen (}{Placeholder protocol-name}{RightParen )}
|
||||
// CHECK-CC3: NotImplemented:{TypedText @selector}{LeftParen (}{Placeholder selector}{RightParen )}
|
||||
|
|
|
@ -77,7 +77,7 @@
|
|||
// CHECK-CC3: ObjCInstanceMethodDecl:{TypedText init}
|
||||
// CHECK-CC3: ObjCInstanceMethodDecl:{TypedText initWithInt}{Colon :}{LeftParen (}{Text int}{RightParen )}{Text x}
|
||||
// CHECK-CC3: ObjCInstanceMethodDecl:{TypedText initWithTwoInts}{Colon :}{LeftParen (}{Text int}{RightParen )}{Text x}{HorizontalSpace }{Text second}{Colon :}{LeftParen (}{Text int}{RightParen )}{Text y}
|
||||
// RUN: c-index-test -code-completion-at=%s:33:3 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC4 %s
|
||||
// RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test -code-completion-at=%s:33:3 %s | FileCheck -check-prefix=CHECK-CC4 %s
|
||||
// CHECK-CC4: ObjCInstanceMethodDecl:{LeftParen (}{Text id}{RightParen )}{TypedText abc}{HorizontalSpace }{LeftBrace {}{VerticalSpace }{Text return}{HorizontalSpace }{Placeholder expression}{SemiColon ;}{VerticalSpace }{RightBrace }} (32)
|
||||
// CHECK-CC4: ObjCInstanceMethodDecl:{LeftParen (}{Text int}{RightParen )}{TypedText getInt}{HorizontalSpace }{LeftBrace {}{VerticalSpace
|
||||
// CHECK-CC4: ObjCInstanceMethodDecl:{LeftParen (}{Text int}{RightParen )}{TypedText getSecondValue}{HorizontalSpace }{LeftBrace {}{VerticalSpace
|
||||
|
@ -85,27 +85,27 @@
|
|||
// CHECK-CC4: ObjCInstanceMethodDecl:{LeftParen (}{Text id}{RightParen )}{TypedText initWithInt}{Colon :}{LeftParen (}{Text int}{RightParen )}{Text x}{HorizontalSpace }{LeftBrace {}{VerticalSpace
|
||||
// CHECK-CC4: ObjCInstanceMethodDecl:{LeftParen (}{Text id}{RightParen )}{TypedText initWithTwoInts}{Colon :}{LeftParen (}{Text int}{RightParen )}{Text x}{HorizontalSpace }{Text second}{Colon :}{LeftParen (}{Text int}{RightParen )}{Text y}{HorizontalSpace }{LeftBrace {}{VerticalSpace
|
||||
// CHECK-CC4: ObjCInstanceMethodDecl:{LeftParen (}{Text int}{RightParen )}{TypedText setValue}{Colon :}{LeftParen (}{Text int}{RightParen )}{Text x}{HorizontalSpace }{LeftBrace {}{VerticalSpace
|
||||
// RUN: c-index-test -code-completion-at=%s:33:8 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC5 %s
|
||||
// RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test -code-completion-at=%s:33:8 %s | FileCheck -check-prefix=CHECK-CC5 %s
|
||||
// CHECK-CC5: ObjCInstanceMethodDecl:{TypedText getInt}{HorizontalSpace }{LeftBrace {}{VerticalSpace
|
||||
// CHECK-CC5: ObjCInstanceMethodDecl:{TypedText getSecondValue}{HorizontalSpace }{LeftBrace {}{VerticalSpace
|
||||
// CHECK-CC5-NOT: {TypedText getSelf}{HorizontalSpace }{LeftBrace {}{VerticalSpace
|
||||
// CHECK-CC5: ObjCInstanceMethodDecl:{TypedText setValue}{Colon :}{LeftParen (}{Text int}{RightParen )}{Text x}{HorizontalSpace }{LeftBrace {}{VerticalSpace
|
||||
// RUN: c-index-test -code-completion-at=%s:37:7 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC6 %s
|
||||
// RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test -code-completion-at=%s:37:7 %s | FileCheck -check-prefix=CHECK-CC6 %s
|
||||
// CHECK-CC6: ObjCInstanceMethodDecl:{TypedText abc}{HorizontalSpace }{LeftBrace {}{VerticalSpace
|
||||
// CHECK-CC6-NOT: getSelf
|
||||
// CHECK-CC6: ObjCInstanceMethodDecl:{TypedText initWithInt}{Colon :}{LeftParen (}{Text int}{RightParen )}{Text x}{HorizontalSpace }{LeftBrace {}{VerticalSpace
|
||||
// CHECK-CC6: ObjCInstanceMethodDecl:{TypedText initWithTwoInts}{Colon :}{LeftParen (}{Text int}{RightParen )}{Text x}{HorizontalSpace }{Text second}{Colon :}{LeftParen (}{Text int}{RightParen )}{Text y}{HorizontalSpace }{LeftBrace {}{VerticalSpace
|
||||
// RUN: c-index-test -code-completion-at=%s:42:3 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC7 %s
|
||||
// RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test -code-completion-at=%s:42:3 %s | FileCheck -check-prefix=CHECK-CC7 %s
|
||||
// CHECK-CC7: ObjCInstanceMethodDecl:{LeftParen (}{Text id}{RightParen )}{TypedText categoryFunction}{Colon :}{LeftParen (}{Text int}{RightParen )}{Text x}{HorizontalSpace }{LeftBrace {}{VerticalSpace
|
||||
// RUN: c-index-test -code-completion-at=%s:52:21 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC8 %s
|
||||
// RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test -code-completion-at=%s:52:21 %s | FileCheck -check-prefix=CHECK-CC8 %s
|
||||
// CHECK-CC8: ObjCInstanceMethodDecl:{ResultType id}{Informative first:}{TypedText second2:}{Text (float)y2}{HorizontalSpace }{Text third:}{Text (double)z} (20)
|
||||
// CHECK-CC8: ObjCInstanceMethodDecl:{ResultType void *}{Informative first:}{TypedText second3:}{Text (float)y3}{HorizontalSpace }{Text third:}{Text (double)z} (20)
|
||||
// CHECK-CC8: ObjCInstanceMethodDecl:{ResultType int}{Informative first:}{TypedText second:}{Text (float)y}{HorizontalSpace }{Text third:}{Text (double)z} (5)
|
||||
// RUN: c-index-test -code-completion-at=%s:52:19 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC9 %s
|
||||
// RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test -code-completion-at=%s:52:19 %s | FileCheck -check-prefix=CHECK-CC9 %s
|
||||
// CHECK-CC9: NotImplemented:{TypedText x} (30)
|
||||
// CHECK-CC9: NotImplemented:{TypedText xx} (30)
|
||||
// CHECK-CC9: NotImplemented:{TypedText xxx} (30)
|
||||
// RUN: c-index-test -code-completion-at=%s:52:36 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CCA %s
|
||||
// RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test -code-completion-at=%s:52:36 %s | FileCheck -check-prefix=CHECK-CCA %s
|
||||
// CHECK-CCA: NotImplemented:{TypedText y2} (30)
|
||||
// RUN: c-index-test -code-completion-at=%s:56:3 %s | FileCheck -check-prefix=CHECK-CCB %s
|
||||
// CHECK-CCB: ObjCInstanceMethodDecl:{LeftParen (}{Text int}{RightParen )}{TypedText first}{Colon :}{LeftParen (}{Text int}{RightParen )}{Text x}{HorizontalSpace }{Text second2}{Colon :}{LeftParen (}{Text float}{RightParen )}{Text y}{HorizontalSpace }{Text third}{Colon :}{LeftParen (}{Text double}{RightParen )}{Text z} (30)
|
||||
|
|
|
@ -16,20 +16,20 @@
|
|||
}
|
||||
@end
|
||||
|
||||
// RUN: c-index-test -code-completion-at=%s:9:20 -Xclang -code-completion-patterns %s 2>%t | FileCheck -check-prefix=CHECK-CC1 %s
|
||||
// RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test -code-completion-at=%s:9:20 %s 2>%t | FileCheck -check-prefix=CHECK-CC1 %s
|
||||
// RUN: not grep error %t
|
||||
// CHECK-CC1: NotImplemented:{TypedText @encode}{LeftParen (}{Placeholder type-name}{RightParen )}
|
||||
// CHECK-CC1-NOT: NotImplemented:{TypedText _Bool}
|
||||
// CHECK-CC1: VarDecl:{ResultType A *}{TypedText a}
|
||||
// CHECK-CC1: NotImplemented:{TypedText sizeof}{LeftParen (}{Placeholder expression-or-type}{RightParen )}
|
||||
|
||||
// RUN: c-index-test -code-completion-at=%s:10:24 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC2 %s
|
||||
// RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test -code-completion-at=%s:10:24 %s | FileCheck -check-prefix=CHECK-CC2 %s
|
||||
// CHECK-CC2: NotImplemented:{TypedText @encode}{LeftParen (}{Placeholder type-name}{RightParen )}
|
||||
// CHECK-CC2: NotImplemented:{TypedText _Bool}
|
||||
// CHECK-CC2: VarDecl:{ResultType A *}{TypedText a}
|
||||
// CHECK-CC2: NotImplemented:{TypedText sizeof}{LeftParen (}{Placeholder expression-or-type}{RightParen )}
|
||||
// RUN: c-index-test -code-completion-at=%s:12:11 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC3 %s
|
||||
// RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test -code-completion-at=%s:12:11 %s | FileCheck -check-prefix=CHECK-CC3 %s
|
||||
// CHECK-CC3: ObjCInstanceMethodDecl:{ResultType void}{TypedText method:}{Placeholder (int)} (17)
|
||||
// RUN: c-index-test -code-completion-at=%s:13:22 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC3 %s
|
||||
// RUN: c-index-test -code-completion-at=%s:14:16 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC3 %s
|
||||
// RUN: c-index-test -code-completion-at=%s:15:14 -Xclang -code-completion-patterns %s | FileCheck -check-prefix=CHECK-CC3 %s
|
||||
// RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test -code-completion-at=%s:13:22 %s | FileCheck -check-prefix=CHECK-CC3 %s
|
||||
// RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test -code-completion-at=%s:14:16 %s | FileCheck -check-prefix=CHECK-CC3 %s
|
||||
// RUN: env CINDEXTEST_CODE_COMPLETE_PATTERNS=1 c-index-test -code-completion-at=%s:15:14 %s | FileCheck -check-prefix=CHECK-CC3 %s
|
||||
|
|
|
@ -817,7 +817,7 @@ static int perform_file_scan(const char *ast_file, const char *source_file,
|
|||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/* Logic for testing clang_codeComplete(). */
|
||||
/* Logic for testing clang code completion. */
|
||||
/******************************************************************************/
|
||||
|
||||
/* Parse file:line:column from the input string. Returns 0 on success, non-zero
|
||||
|
@ -1002,6 +1002,11 @@ int perform_code_completion(int argc, const char **argv, int timing_only) {
|
|||
int num_unsaved_files = 0;
|
||||
CXCodeCompleteResults *results = 0;
|
||||
CXTranslationUnit TU = 0;
|
||||
unsigned I, Repeats = 1;
|
||||
unsigned completionOptions = clang_defaultCodeCompleteOptions();
|
||||
|
||||
if (getenv("CINDEXTEST_CODE_COMPLETE_PATTERNS"))
|
||||
completionOptions |= CXCodeComplete_IncludeCodePatterns;
|
||||
|
||||
if (timing_only)
|
||||
input += strlen("-code-completion-timing=");
|
||||
|
@ -1015,34 +1020,31 @@ int perform_code_completion(int argc, const char **argv, int timing_only) {
|
|||
if (parse_remapped_files(argc, argv, 2, &unsaved_files, &num_unsaved_files))
|
||||
return -1;
|
||||
|
||||
CIdx = clang_createIndex(0, 1);
|
||||
if (getenv("CINDEXTEST_EDITING")) {
|
||||
unsigned I, Repeats = 5;
|
||||
TU = clang_parseTranslationUnit(CIdx, 0,
|
||||
argv + num_unsaved_files + 2,
|
||||
argc - num_unsaved_files - 2,
|
||||
0, 0, getDefaultParsingOptions());
|
||||
if (!TU) {
|
||||
fprintf(stderr, "Unable to load translation unit!\n");
|
||||
CIdx = clang_createIndex(0, 0);
|
||||
|
||||
if (getenv("CINDEXTEST_EDITING"))
|
||||
Repeats = 5;
|
||||
|
||||
TU = clang_parseTranslationUnit(CIdx, 0,
|
||||
argv + num_unsaved_files + 2,
|
||||
argc - num_unsaved_files - 2,
|
||||
0, 0, getDefaultParsingOptions());
|
||||
if (!TU) {
|
||||
fprintf(stderr, "Unable to load translation unit!\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (I = 0; I != Repeats; ++I) {
|
||||
results = clang_codeCompleteAt(TU, filename, line, column,
|
||||
unsaved_files, num_unsaved_files,
|
||||
completionOptions);
|
||||
if (!results) {
|
||||
fprintf(stderr, "Unable to perform code completion!\n");
|
||||
return 1;
|
||||
}
|
||||
for (I = 0; I != Repeats; ++I) {
|
||||
results = clang_codeCompleteAt(TU, filename, line, column,
|
||||
unsaved_files, num_unsaved_files,
|
||||
clang_defaultCodeCompleteOptions());
|
||||
if (!results) {
|
||||
fprintf(stderr, "Unable to perform code completion!\n");
|
||||
return 1;
|
||||
}
|
||||
if (I != Repeats-1)
|
||||
clang_disposeCodeCompleteResults(results);
|
||||
}
|
||||
} else
|
||||
results = clang_codeComplete(CIdx,
|
||||
argv[argc - 1], argc - num_unsaved_files - 3,
|
||||
argv + num_unsaved_files + 2,
|
||||
num_unsaved_files, unsaved_files,
|
||||
filename, line, column);
|
||||
if (I != Repeats-1)
|
||||
clang_disposeCodeCompleteResults(results);
|
||||
}
|
||||
|
||||
if (results) {
|
||||
unsigned i, n = results->NumResults;
|
||||
|
|
|
@ -559,29 +559,58 @@ CXCodeCompleteResults *clang_codeComplete(CXIndex CIdx,
|
|||
namespace {
|
||||
class CaptureCompletionResults : public CodeCompleteConsumer {
|
||||
AllocatedCXCodeCompleteResults &AllocatedResults;
|
||||
|
||||
llvm::SmallVector<CXCompletionResult, 16> StoredResults;
|
||||
|
||||
public:
|
||||
explicit CaptureCompletionResults(AllocatedCXCodeCompleteResults &Results)
|
||||
: CodeCompleteConsumer(true, false, true, false),
|
||||
AllocatedResults(Results) { }
|
||||
|
||||
~CaptureCompletionResults() { Finish(); }
|
||||
|
||||
virtual void ProcessCodeCompleteResults(Sema &S,
|
||||
CodeCompletionContext Context,
|
||||
CodeCompletionResult *Results,
|
||||
unsigned NumResults) {
|
||||
AllocatedResults.Results = new CXCompletionResult [NumResults];
|
||||
AllocatedResults.NumResults = NumResults;
|
||||
StoredResults.reserve(StoredResults.size() + NumResults);
|
||||
for (unsigned I = 0; I != NumResults; ++I) {
|
||||
CXStoredCodeCompletionString *StoredCompletion
|
||||
= new CXStoredCodeCompletionString(Results[I].Priority,
|
||||
Results[I].Availability);
|
||||
(void)Results[I].CreateCodeCompletionString(S, StoredCompletion);
|
||||
AllocatedResults.Results[I].CursorKind = Results[I].CursorKind;
|
||||
AllocatedResults.Results[I].CompletionString = StoredCompletion;
|
||||
|
||||
CXCompletionResult R;
|
||||
R.CursorKind = Results[I].CursorKind;
|
||||
R.CompletionString = StoredCompletion;
|
||||
StoredResults.push_back(R);
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME: Add ProcessOverloadCandidates?
|
||||
virtual void ProcessOverloadCandidates(Sema &S, unsigned CurrentArg,
|
||||
OverloadCandidate *Candidates,
|
||||
unsigned NumCandidates) {
|
||||
StoredResults.reserve(StoredResults.size() + NumCandidates);
|
||||
for (unsigned I = 0; I != NumCandidates; ++I) {
|
||||
// FIXME: Set priority, availability appropriately.
|
||||
CXStoredCodeCompletionString *StoredCompletion
|
||||
= new CXStoredCodeCompletionString(1, CXAvailability_Available);
|
||||
(void)Candidates[I].CreateSignatureString(CurrentArg, S,
|
||||
StoredCompletion);
|
||||
|
||||
CXCompletionResult R;
|
||||
R.CursorKind = CXCursor_NotImplemented;
|
||||
R.CompletionString = StoredCompletion;
|
||||
StoredResults.push_back(R);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
void Finish() {
|
||||
AllocatedResults.Results = new CXCompletionResult [StoredResults.size()];
|
||||
AllocatedResults.NumResults = StoredResults.size();
|
||||
std::memcpy(AllocatedResults.Results, StoredResults.data(),
|
||||
StoredResults.size() * sizeof(CXCompletionResult));
|
||||
StoredResults.clear();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue