Ich versuche, virtuelle Dateien für Codecompletion in Clang zu erstellen. Leider segmentiert meine Anwendung. Ich habe folgendes Setup:Wie erstellt man eine virtuelle Datei in clang für 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);
};
Sobald die Datei i-Setup ein CodeCompletConsumer erstellt:
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;
};
ich diese beiden Funktionen die folgende Art und Weise aufrufen und eine Syntax einzige Aktion ausführen:
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);
}
Ich freue mich über Hinweise.
[OT] std :: move in 'Rückkehr std :: move (MB);' sollte entfernt werden. (es verbietet nur RVO). – Jarod42
[OT] MB ist ein unique_ptr, sollte ich nicht explizit über den Besitz von Eigentumsrechten sein? – Gaetano
Sehen Sie sich an, [wann-sollte-stdmove-verwendet-on-a-Funktion-Rückgabewert] (http://stackoverflow.com/questions/14856344/when-should-stdmove-be-used-on-a- -function-return-Wert – Jarod42