diff options
| author | David Zarzycki <dave@znu.io> | 2018-02-26 20:21:30 +0000 |
|---|---|---|
| committer | David Zarzycki <dave@znu.io> | 2018-02-26 20:21:30 +0000 |
| commit | 6daad9da6d87f806050c44cd8a96a7631e14f6a4 (patch) | |
| tree | 4903f0ca15a51f978ffc2b83380e034d07bb7b35 | |
| parent | b44e2b75e88c4112c33ca66df595f798c661fd32 (diff) | |
| download | bcm5719-llvm-6daad9da6d87f806050c44cd8a96a7631e14f6a4.tar.gz bcm5719-llvm-6daad9da6d87f806050c44cd8a96a7631e14f6a4.zip | |
Fix for LLVM r326109
llvm-svn: 326118
| -rw-r--r-- | clang-tools-extra/clang-query/QueryParser.cpp | 54 | ||||
| -rw-r--r-- | clang-tools-extra/clang-query/QueryParser.h | 1 |
2 files changed, 24 insertions, 31 deletions
diff --git a/clang-tools-extra/clang-query/QueryParser.cpp b/clang-tools-extra/clang-query/QueryParser.cpp index c64d810a7d2..bb3d1b3a3ff 100644 --- a/clang-tools-extra/clang-query/QueryParser.cpp +++ b/clang-tools-extra/clang-query/QueryParser.cpp @@ -50,25 +50,35 @@ StringRef QueryParser::lexWord() { // This is the StringSwitch-alike used by lexOrCompleteWord below. See that // function for details. template <typename T> struct QueryParser::LexOrCompleteWord { + StringRef Word; StringSwitch<T> Switch; QueryParser *P; - StringRef Word; // Set to the completion point offset in Word, or StringRef::npos if // completion point not in Word. size_t WordCompletionPos; - LexOrCompleteWord(QueryParser *P, StringRef Word, size_t WCP) - : Switch(Word), P(P), Word(Word), WordCompletionPos(WCP) {} + // Lexes a word and stores it in Word. Returns a LexOrCompleteWord<T> object + // that can be used like a llvm::StringSwitch<T>, but adds cases as possible + // completions if the lexed word contains the completion point. + LexOrCompleteWord(QueryParser *P, StringRef &OutWord) + : Word(P->lexWord()), Switch(Word), P(P), + WordCompletionPos(StringRef::npos) { + OutWord = Word; + if (P->CompletionPos && P->CompletionPos <= Word.data() + Word.size()) { + if (P->CompletionPos < Word.data()) + WordCompletionPos = 0; + else + WordCompletionPos = P->CompletionPos - Word.data(); + } + } - template <unsigned N> - LexOrCompleteWord &Case(const char (&S)[N], const T &Value, + LexOrCompleteWord &Case(llvm::StringLiteral CaseStr, const T &Value, bool IsCompletion = true) { - StringRef CaseStr(S, N - 1); if (WordCompletionPos == StringRef::npos) - Switch.Case(S, Value); - else if (N != 1 && IsCompletion && WordCompletionPos <= CaseStr.size() && + Switch.Case(CaseStr, Value); + else if (CaseStr.size() != 0 && IsCompletion && WordCompletionPos <= CaseStr.size() && CaseStr.substr(0, WordCompletionPos) == Word.substr(0, WordCompletionPos)) P->Completions.push_back(LineEditor::Completion( @@ -76,29 +86,12 @@ template <typename T> struct QueryParser::LexOrCompleteWord { return *this; } - T Default(const T &Value) const { return Switch.Default(Value); } + T Default(T Value) { return Switch.Default(Value); } }; -// Lexes a word and stores it in Word. Returns a LexOrCompleteWord<T> object -// that can be used like a llvm::StringSwitch<T>, but adds cases as possible -// completions if the lexed word contains the completion point. -template <typename T> -QueryParser::LexOrCompleteWord<T> -QueryParser::lexOrCompleteWord(StringRef &Word) { - Word = lexWord(); - size_t WordCompletionPos = StringRef::npos; - if (CompletionPos && CompletionPos <= Word.data() + Word.size()) { - if (CompletionPos < Word.data()) - WordCompletionPos = 0; - else - WordCompletionPos = CompletionPos - Word.data(); - } - return LexOrCompleteWord<T>(this, Word, WordCompletionPos); -} - QueryRef QueryParser::parseSetBool(bool QuerySession::*Var) { StringRef ValStr; - unsigned Value = lexOrCompleteWord<unsigned>(ValStr) + unsigned Value = LexOrCompleteWord<unsigned>(this, ValStr) .Case("false", 0) .Case("true", 1) .Default(~0u); @@ -110,7 +103,7 @@ QueryRef QueryParser::parseSetBool(bool QuerySession::*Var) { QueryRef QueryParser::parseSetOutputKind() { StringRef ValStr; - unsigned OutKind = lexOrCompleteWord<unsigned>(ValStr) + unsigned OutKind = LexOrCompleteWord<unsigned>(this, ValStr) .Case("diag", OK_Diag) .Case("print", OK_Print) .Case("dump", OK_Dump) @@ -166,7 +159,7 @@ QueryRef QueryParser::completeMatcherExpression() { QueryRef QueryParser::doParse() { StringRef CommandStr; - ParsedQueryKind QKind = lexOrCompleteWord<ParsedQueryKind>(CommandStr) + ParsedQueryKind QKind = LexOrCompleteWord<ParsedQueryKind>(this, CommandStr) .Case("", PQK_NoOp) .Case("help", PQK_Help) .Case("m", PQK_Match, /*IsCompletion=*/false) @@ -221,7 +214,8 @@ QueryRef QueryParser::doParse() { case PQK_Set: { StringRef VarStr; - ParsedQueryVariable Var = lexOrCompleteWord<ParsedQueryVariable>(VarStr) + ParsedQueryVariable Var = LexOrCompleteWord<ParsedQueryVariable>(this, + VarStr) .Case("output", PQV_Output) .Case("bind-root", PQV_BindRoot) .Default(PQV_Invalid); diff --git a/clang-tools-extra/clang-query/QueryParser.h b/clang-tools-extra/clang-query/QueryParser.h index 20591815b9f..67f907d1c44 100644 --- a/clang-tools-extra/clang-query/QueryParser.h +++ b/clang-tools-extra/clang-query/QueryParser.h @@ -42,7 +42,6 @@ private: StringRef lexWord(); template <typename T> struct LexOrCompleteWord; - template <typename T> LexOrCompleteWord<T> lexOrCompleteWord(StringRef &Str); QueryRef parseSetBool(bool QuerySession::*Var); QueryRef parseSetOutputKind(); |

