Sto cercando di creare file virtuali per il completamento del codice in clang. Sfortunatamente, la mia applicazione segfaults. Ho la seguente configurazione:come creare un file virtuale in clang per codecompletion
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);
};
Una volta che il file viene creato a configurare una 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;
};
invoco queste due funzioni seguente modo ed eseguire una sintassi unica azione:
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);
}
Apprezzo qualsiasi suggerimento.
[OT] std :: move in 'return std :: move (MB);' deve essere rimosso. (proibisce solo RVO). – Jarod42
[OT] MB è un unique_ptr, non è necessario esplicitare lo spostamento della proprietà? – Gaetano
Guarda [when-should-stdmove-be-used-on-a-function-return-value] (http://stackoverflow.com/questions/14856344/when-should-stdmove-be-used-on-a -funzione-ritorno-value) – Jarod42