public async Task<List<CodeCompletionData>> CodeCompleteAtAsync(ISourceFile file, int line, int column,
List<UnsavedFile> unsavedFiles, string filter)
{
var clangUnsavedFiles = new List<ClangUnsavedFile>();
foreach (var unsavedFile in unsavedFiles)
{
clangUnsavedFiles.Add(new ClangUnsavedFile(unsavedFile.FileName, unsavedFile.Contents));
}
var result = new List<CodeCompletionData>();
await clangAccessJobRunner.InvokeAsync(() =>
{
var translationUnit = GetAndParseTranslationUnit(file, clangUnsavedFiles);
var completionResults = translationUnit.CodeCompleteAt(file.Location, line, column, clangUnsavedFiles.ToArray(),
CodeCompleteFlags.IncludeBriefComments | CodeCompleteFlags.IncludeMacros | CodeCompleteFlags.IncludeCodePatterns);
completionResults.Sort();
foreach (var codeCompletion in completionResults.Results)
{
var typedText = string.Empty;
var hint = string.Empty;
foreach (var chunk in codeCompletion.CompletionString.Chunks)
{
if (chunk.Kind == CompletionChunkKind.TypedText)
{
typedText = chunk.Text;
}
hint += chunk.Text;
switch (chunk.Kind)
{
case CompletionChunkKind.LeftParen:
case CompletionChunkKind.LeftAngle:
case CompletionChunkKind.LeftBrace:
case CompletionChunkKind.LeftBracket:
case CompletionChunkKind.RightAngle:
case CompletionChunkKind.RightBrace:
case CompletionChunkKind.RightBracket:
case CompletionChunkKind.RightParen:
case CompletionChunkKind.Placeholder:
case CompletionChunkKind.Comma:
break;
default:
hint += " ";
break;
}
}
if (filter == string.Empty || typedText.StartsWith(filter))
{
result.Add(new CodeCompletionData
{
Suggestion = typedText,
Priority = codeCompletion.CompletionString.Priority,
Kind = FromClangKind(codeCompletion.CursorKind),
Hint = hint,
BriefComment = codeCompletion.CompletionString.BriefComment
});
}
}
completionResults.Dispose();
});
return result;
}