1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
#include "CompilerLocatorCLANG.h"
#include "LSPClangdDetector.hpp"
#include "clFilesCollector.h"
#include "file_logger.h"
#include "globals.h"
#include <wx/filename.h>
#include <wx/regex.h>
LSPClangdDetector::LSPClangdDetector()
: LSPDetector("clangd")
{
}
LSPClangdDetector::~LSPClangdDetector() {}
bool LSPClangdDetector::DoLocate()
{
CompilerLocatorCLANG locator;
wxFileName fnClangd;
#if defined(__WXMSW__)
fnClangd.SetExt("exe");
#endif
if(locator.Locate()) {
static wxRegEx reClangd("clangd([0-9\\-]*)", wxRE_DEFAULT);
const auto& compilers = locator.GetCompilers();
if(compilers.empty()) {
return false;
}
for(const auto& compiler : compilers) {
wxFileName cxx = compiler->GetTool("CXX");
if(!cxx.IsOk()) {
continue;
}
clFilesScanner scanner;
clFilesScanner::EntryData::Vec_t files;
if(scanner.ScanNoRecurse(cxx.GetPath(), files, "clangd*")) {
// Check for the existence of clangd
for(const auto& d : files) {
if(!(d.flags & clFilesScanner::kIsFile)) {
continue;
}
fnClangd = d.fullpath;
clDEBUG() << "==> Found" << fnClangd;
wxString command;
command << fnClangd.GetFullPath();
::WrapWithQuotes(command);
command << " -limit-results=100 -header-insertion-decorators=0";
SetCommand(command);
// Add support for the languages
GetLangugaes().Add("c");
GetLangugaes().Add("cpp");
SetConnectionString("stdio");
SetPriority(90); // clangd should override the default cc engine
// Stop at the first match
return true;
}
}
}
}
return false;
}
|