diff options
author | mattkae <mattkae@protonmail.com> | 2022-06-07 08:23:47 -0400 |
---|---|---|
committer | mattkae <mattkae@protonmail.com> | 2022-06-07 08:23:47 -0400 |
commit | bd18a38c2898548a3664a9ddab9f79c84f2caf4a (patch) | |
tree | 95b9933376770381bd8859782ae763be81c2d72b /elpa/irony-20220110.849/server/src/Command.cpp | |
parent | b07628dddf418d4f47b858e6c35fd3520fbaeed2 (diff) | |
parent | ef160dea332af4b4fe5e2717b962936c67e5fe9e (diff) |
Merge conflict
Diffstat (limited to 'elpa/irony-20220110.849/server/src/Command.cpp')
-rw-r--r-- | elpa/irony-20220110.849/server/src/Command.cpp | 278 |
1 files changed, 0 insertions, 278 deletions
diff --git a/elpa/irony-20220110.849/server/src/Command.cpp b/elpa/irony-20220110.849/server/src/Command.cpp deleted file mode 100644 index 363b6cb..0000000 --- a/elpa/irony-20220110.849/server/src/Command.cpp +++ /dev/null @@ -1,278 +0,0 @@ -/** - * \file - * \author Guillaume Papin <guillaume.papin@epitech.eu> - * - * \brief Command parser definitions. - * - * This file is distributed under the GNU General Public License. See - * COPYING for details. - */ - -#include "Command.h" - -#include "support/CommandLineParser.h" - -#include <algorithm> -#include <cstdlib> -#include <functional> -#include <iostream> -#include <limits> -#include <map> - - -namespace { - -struct StringConverter { - StringConverter(std::string *dest) : dest_(dest) { - } - - bool operator()(const std::string &str) { - *dest_ = str; - return true; - } - -private: - std::string *dest_; -}; - -struct UnsignedIntConverter { - UnsignedIntConverter(unsigned *dest) : dest_(dest) { - } - - bool operator()(const std::string &str) { - char *end; - long num = std::strtol(str.c_str(), &end, 10); - - if (end != (str.c_str() + str.size())) - return false; - - if (errno == ERANGE) - return false; - - if (num < 0) - return false; - - unsigned long unum = static_cast<unsigned long>(num); - if (unum > std::numeric_limits<unsigned>::max()) - return false; - - *dest_ = unum; - return true; - } - -private: - unsigned *dest_; -}; - -/// Convert "on" and "off" to a boolean -struct OptionConverter { - OptionConverter(bool *dest) : dest_(dest) { - } - - bool operator()(const std::string &str) { - if (str == "on") { - *dest_ = true; - } else if (str == "off") { - *dest_ = false; - } else { - return false; - } - return true; - } - -private: - bool *dest_; -}; - -const std::map<std::string, PrefixMatchStyle> PREFIX_MATCH_STYLE_MAP = { - { "exact", PrefixMatchStyle::Exact }, - { "case-insensitive", PrefixMatchStyle::CaseInsensitive }, - { "smart-case", PrefixMatchStyle::SmartCase}, -}; - -/// Convert style to a PrefixMatchStyle -struct PrefixMatchStyleConverter { - PrefixMatchStyleConverter(PrefixMatchStyle *dest) : dest_(dest) { - } - - bool operator()(const std::string &str) { - auto res = PREFIX_MATCH_STYLE_MAP.find(str); - - if (res == PREFIX_MATCH_STYLE_MAP.cend()) { - return false; - } - *dest_ = res->second; - return true; - } - -private: - PrefixMatchStyle *dest_; -}; - -std::ostream &operator<<(std::ostream &os, PrefixMatchStyle style) { - for (auto it : PREFIX_MATCH_STYLE_MAP) { - if (it.second == style) { - os << it.first; - return os; - } - } - os << "UnknownStyle"; - return os; -} - - -} // unnamed namespace - -std::ostream &operator<<(std::ostream &os, const Command::Action &action) { - os << "Command::"; - - switch (action) { -#define X(sym, str, help) \ - case Command::sym: \ - os << #sym; \ - break; -#include "Commands.def" - } - return os; -} - -std::ostream &operator<<(std::ostream &os, const Command &command) { - os << "Command{action=" << command.action << ", " - << "file='" << command.file << "', " - << "unsavedFile='" << command.unsavedFile << "', " - << "dir='" << command.dir << "', " - << "line=" << command.line << ", " - << "column=" << command.column << ", " - << "prefix='" << command.prefix << "', " - << "caseStyle='" << command.style << "', " - << "flags=["; - bool first = true; - for (const std::string &flag : command.flags) { - if (!first) - os << ", "; - os << "'" << flag << "'"; - first = false; - } - os << "], " - << "opt=" << (command.opt ? "on" : "off"); - - return os << "}"; -} - -static Command::Action actionFromString(const std::string &actionStr) { -#define X(sym, str, help) \ - if (actionStr == str) \ - return Command::sym; - -#include "Commands.def" - - return Command::Unknown; -} - -CommandParser::CommandParser() : tempFile_("irony-server") { -} - -Command *CommandParser::parse(const std::vector<std::string> &argv) { - command_.clear(); - - if (argv.begin() == argv.end()) { - std::clog << "error: no command specified.\n" - "See 'irony-server help' to list available commands\n"; - return 0; - } - - const std::string &actionStr = argv[0]; - - command_.action = actionFromString(actionStr); - - bool readCompileOptions = false; - std::vector<std::function<bool(const std::string &)>> positionalArgs; - - switch (command_.action) { - case Command::SetDebug: - positionalArgs.push_back(OptionConverter(&command_.opt)); - break; - - case Command::Parse: - positionalArgs.push_back(StringConverter(&command_.file)); - readCompileOptions = true; - break; - - case Command::Complete: - positionalArgs.push_back(StringConverter(&command_.file)); - positionalArgs.push_back(UnsignedIntConverter(&command_.line)); - positionalArgs.push_back(UnsignedIntConverter(&command_.column)); - readCompileOptions = true; - break; - - case Command::GetType: - positionalArgs.push_back(UnsignedIntConverter(&command_.line)); - positionalArgs.push_back(UnsignedIntConverter(&command_.column)); - break; - - case Command::SetUnsaved: - positionalArgs.push_back(StringConverter(&command_.file)); - positionalArgs.push_back(StringConverter(&command_.unsavedFile)); - break; - - case Command::ResetUnsaved: - positionalArgs.push_back(StringConverter(&command_.file)); - break; - - case Command::Candidates: - positionalArgs.push_back(StringConverter(&command_.prefix)); - positionalArgs.push_back(PrefixMatchStyleConverter(&command_.style)); - break; - case Command::CompletionDiagnostics: - case Command::Diagnostics: - case Command::Help: - case Command::Exit: - // no-arguments commands - break; - - case Command::GetCompileOptions: - positionalArgs.push_back(StringConverter(&command_.dir)); - positionalArgs.push_back(StringConverter(&command_.file)); - break; - - case Command::Unknown: - std::clog << "error: invalid command specified: " << actionStr << "\n"; - return 0; - } - - auto argsBegin = argv.begin() + 1; - const auto argsEnd = std::find(argsBegin, argv.end(), "--"); - const int argCount = std::distance(argsBegin, argsEnd); - - // compile options are provided after '--' - if (readCompileOptions && argsEnd != argv.end()) { - command_.flags.assign(std::next(argsEnd), argv.end()); - } - - if (argCount != static_cast<int>(positionalArgs.size())) { - std::clog << "error: invalid number of arguments for '" << actionStr - << "' (requires " << positionalArgs.size() << " got " << argCount - << ")\n"; - return 0; - } - - for (auto fn : positionalArgs) { - if (!fn(*argsBegin)) { - std::clog << "error: parsing command '" << actionStr - << "': invalid argument '" << *argsBegin << "'\n"; - return 0; - } - ++argsBegin; - } - - // '-' is used as a special file to inform that the buffer hasn't been saved - // on disk and only the buffer content is available. libclang needs a file, so - // this is treated as a special value for irony-server to create a temporary - // file for this. note that libclang will gladly accept '-' as a filename but - // we don't want to let this happen since irony already reads stdin. - if (command_.file == "-") { - command_.file = tempFile_.getPath(); - } - - return &command_; -} |