7
我試圖在clang中爲codecompletion創建虛擬文件。不幸的是,我的應用程序段錯誤。 我有以下設置:如何在clang中爲代碼完成創建虛擬文件
auto createVirtualFile = [](
clang::CompilerInstance& ci,
std::string name,
llvm::StringRef input
) {
std::unique_ptr<llvm::MemoryBuffer>
MB(llvm::MemoryBuffer::getMemBuffer(input, name));
return std::move(MB);
};
一旦文件被我設置一個CodeCompletConsumer創建:
auto setupCodeComplete = [](
clang::CompilerInstance& ci,
std::string File,
int Line,
int Column
) {
auto& F = ci.getFrontendOpts();
F.CodeCompletionAt.FileName = File;
F.CodeCompletionAt.Line = Line;
F.CodeCompletionAt.Column = Column;
clang::FrontendInputFile FrontFile(File, clang::IK_CXX);
//F.Inputs.push_back(FrontFile);
ci.createCodeCompletionConsumer();
return FrontFile;
};
我調用這兩個函數通過以下方式和執行語法的作用:
auto runCodeCompleteAt = [] (
clang::CompilerInstance& ci,
std::string Filename,
std::string Code,
int Line,
int Column
) {
auto fid = createVirtualFile(ci, Filename, Code);
auto File = setupCodeComplete(ci, Filename, Line, Column);
clang::SyntaxOnlyAction Act;
if (Act.BeginSourceFile(ci, File)) {
Act.Execute(); // segfault
Act.EndSourceFile();
}
};
auto runExample = [](auto& ci){
runCodeCompleterAt(ci, "test.cpp", "std::cou", 1, 7);
}
我欣賞任何提示。
[OT] std :: move in'return std :: move(MB);'應該被移除。 (它只禁止RVO)。 – Jarod42
[OT] MB是一個unique_ptr,我不清楚移動所有權嗎? – Gaetano
看看[什麼時候應該stdmove被使用的函數返回值](http://stackoverflow.com/questions/14856344/when-should-stdmove-be-used-on-a - 函數返回值) – Jarod42