diff options
Diffstat (limited to 'lib/Format/FormatTokenLexer.h')
-rw-r--r-- | lib/Format/FormatTokenLexer.h | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/lib/Format/FormatTokenLexer.h b/lib/Format/FormatTokenLexer.h index fa8c8882574f7..c47b0e725d366 100644 --- a/lib/Format/FormatTokenLexer.h +++ b/lib/Format/FormatTokenLexer.h @@ -23,9 +23,17 @@ #include "clang/Format/Format.h" #include "llvm/Support/Regex.h" +#include <stack> + namespace clang { namespace format { +enum LexerState { + NORMAL, + TEMPLATE_STRING, + TOKEN_STASHED, +}; + class FormatTokenLexer { public: FormatTokenLexer(const SourceManager &SourceMgr, FileID ID, @@ -53,7 +61,16 @@ private: // its text if successful. void tryParseJSRegexLiteral(); - void tryParseTemplateString(); + // Handles JavaScript template strings. + // + // JavaScript template strings use backticks ('`') as delimiters, and allow + // embedding expressions nested in ${expr-here}. Template strings can be + // nested recursively, i.e. expressions can contain template strings in turn. + // + // The code below parses starting from a backtick, up to a closing backtick or + // an opening ${. It also maintains a stack of lexing contexts to handle + // nested template parts by balancing curly braces. + void handleTemplateStrings(); bool tryMerge_TMacro(); @@ -65,7 +82,7 @@ private: FormatToken *FormatTok; bool IsFirstToken; - bool GreaterStashed, LessStashed; + std::stack<LexerState> StateStack; unsigned Column; unsigned TrailingWhitespace; std::unique_ptr<Lexer> Lex; |