clang-format: [JS] nested and tagged template strings.
authorMartin Probst <martin@probst.io>
Thu, 25 Aug 2016 10:13:21 +0000 (10:13 +0000)
committerMartin Probst <martin@probst.io>
Thu, 25 Aug 2016 10:13:21 +0000 (10:13 +0000)
commit6181da4796ef8c095e3e5250413ff7e82878cba4
treed15bbe889e7006f431ffc90df9825ee54d81319a
parent86ce267a4ace2ec170653611099786324808d68e
clang-format: [JS] nested and tagged template strings.

JavaScript template strings can be nested arbitrarily:

    foo = `text ${es.map(e => { return `<${e}>`; })} text`;

This change lexes nested template strings using a stack of lexer states to
correctly switch back to template string lexing on closing braces.

Also, reuse the same stack for the token-stashed logic.

Reviewers: djasper

Subscribers: cfe-commits, klimek

Differential Revision: https://reviews.llvm.org/D22431

llvm-svn: 279727
clang/lib/Format/FormatTokenLexer.cpp
clang/lib/Format/FormatTokenLexer.h
clang/lib/Format/TokenAnnotator.cpp
clang/unittests/Format/FormatTestJS.cpp