Skip to content

Commit

Permalink
clang-format: [JS] space between pseudo keywords and template literals.
Browse files Browse the repository at this point in the history
Summary:
Before:
  yield`foo`;

After:
  yield `foo`;

This reinstates commit 71d3b5cd91 / r307023 and fixes the logic by
introducing an explicit table of JavaScript pseudo keywords.

Reviewers: djasper

Subscribers: klimek

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

llvm-svn: 307087
  • Loading branch information
mprobst committed Jul 4, 2017
1 parent 505941e commit 37a7f91
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 1 deletion.
20 changes: 20 additions & 0 deletions clang/lib/Format/FormatToken.h
Expand Up @@ -21,6 +21,7 @@
#include "clang/Format/Format.h"
#include "clang/Lex/Lexer.h"
#include <memory>
#include <unordered_set>

namespace clang {
namespace format {
Expand Down Expand Up @@ -645,6 +646,13 @@ struct AdditionalKeywords {
kw_var = &IdentTable.get("var");
kw_yield = &IdentTable.get("yield");

JsExtraKeywords = std::unordered_set<IdentifierInfo *>(
{kw_as, kw_async, kw_await, kw_declare, kw_finally, kw_from,
kw_function, kw_get, kw_import, kw_is, kw_let, kw_module, kw_set,
kw_type, kw_var, kw_yield,
// Keywords from the Java section.
kw_abstract, kw_extends, kw_implements, kw_instanceof, kw_interface});

kw_abstract = &IdentTable.get("abstract");
kw_assert = &IdentTable.get("assert");
kw_extends = &IdentTable.get("extends");
Expand Down Expand Up @@ -733,6 +741,18 @@ struct AdditionalKeywords {
IdentifierInfo *kw_qsignals;
IdentifierInfo *kw_slots;
IdentifierInfo *kw_qslots;

/// \brief Returns \c true if \p Tok is a true JavaScript identifier, returns
/// \c false if it is a keyword or a pseudo keyword.
bool IsJavaScriptIdentifier(const FormatToken &Tok) const {
return Tok.is(tok::identifier) &&
JsExtraKeywords.find(Tok.Tok.getIdentifierInfo()) ==
JsExtraKeywords.end();
}

private:
/// \brief The JavaScript keywords beyond the C++ keyword set.
std::unordered_set<IdentifierInfo *> JsExtraKeywords;
};

} // namespace format
Expand Down
6 changes: 5 additions & 1 deletion clang/lib/Format/TokenAnnotator.cpp
Expand Up @@ -2319,7 +2319,11 @@ bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line,
if ((Left.is(TT_TemplateString) && Left.TokenText.endswith("${")) ||
(Right.is(TT_TemplateString) && Right.TokenText.startswith("}")))
return false;
if (Left.is(tok::identifier) && Right.is(TT_TemplateString))
// In tagged template literals ("html`bar baz`"), there is no space between
// the tag identifier and the template string. getIdentifierInfo makes sure
// that the identifier is not a pseudo keyword like `yield`, either.
if (Left.is(tok::identifier) && Keywords.IsJavaScriptIdentifier(Left) &&
Right.is(TT_TemplateString))
return false;
if (Right.is(tok::star) &&
Left.isOneOf(Keywords.kw_function, Keywords.kw_yield))
Expand Down
1 change: 1 addition & 0 deletions clang/unittests/Format/FormatTestJS.cpp
Expand Up @@ -1622,6 +1622,7 @@ TEST_F(FormatTestJS, NestedTemplateStrings) {

TEST_F(FormatTestJS, TaggedTemplateStrings) {
verifyFormat("var x = html`<ul>`;");
verifyFormat("yield `hello`;");
}

TEST_F(FormatTestJS, CastSyntax) {
Expand Down

0 comments on commit 37a7f91

Please sign in to comment.