clang-format: [JS] support closures in container literals.

Before:
  return {body: {setAttribute: function(key, val) {this[key] = val;
  }
  , getAttribute : function(key) { return this[key]; }
  , style : {
  direction:
    ''
  }
  }
  }
  ;

After:
  return {
    body: {
      setAttribute: function(key, val) { this[key] = val; },
      getAttribute: function(key) { return this[key]; },
      style: {direction: ''}
    }
  };

llvm-svn: 208292
This commit is contained in:
Daniel Jasper 2014-05-08 09:25:39 +00:00
parent 5ee9fd5f45
commit c03e16a7bc
3 changed files with 29 additions and 3 deletions

View File

@ -886,6 +886,22 @@ bool UnwrappedLineParser::tryToParseLambdaIntroducer() {
return false;
}
void UnwrappedLineParser::tryToParseJSFunction() {
nextToken();
if (FormatTok->isNot(tok::l_paren))
return;
nextToken();
while (FormatTok->isNot(tok::l_brace)) {
// Err on the side of caution in order to avoid consuming the full file in
// case of incomplete code.
if (!FormatTok->isOneOf(tok::identifier, tok::comma, tok::r_paren,
tok::comment))
return;
nextToken();
}
parseChildBlock();
}
bool UnwrappedLineParser::tryToParseBracedList() {
if (FormatTok->BlockKind == BK_Unknown)
calculateBraceTypes();
@ -903,9 +919,11 @@ bool UnwrappedLineParser::parseBracedList(bool ContinueOnSemicolons) {
// FIXME: Once we have an expression parser in the UnwrappedLineParser,
// replace this by using parseAssigmentExpression() inside.
do {
// FIXME: When we start to support lambdas, we'll want to parse them away
// here, otherwise our bail-out scenarios below break. The better solution
// might be to just implement a more or less complete expression parser.
if (Style.Language == FormatStyle::LK_JavaScript &&
FormatTok->TokenText == "function") {
tryToParseJSFunction();
continue;
}
switch (FormatTok->Tok.getKind()) {
case tok::caret:
nextToken();

View File

@ -100,6 +100,7 @@ private:
void parseObjCProtocol();
bool tryToParseLambda();
bool tryToParseLambdaIntroducer();
void tryToParseJSFunction();
void addUnwrappedLine();
bool eof() const;
void nextToken();

View File

@ -101,6 +101,13 @@ TEST_F(FormatTestJS, GoogScopes) {
TEST_F(FormatTestJS, Closures) {
verifyFormat("doFoo(function() { return 1; });");
verifyFormat("var func = function() { return 1; };");
verifyFormat("return {\n"
" body: {\n"
" setAttribute: function(key, val) { this[key] = val; },\n"
" getAttribute: function(key) { return this[key]; },\n"
" style: {direction: ''}\n"
" }\n"
"};");
}
TEST_F(FormatTestJS, ReturnStatements) {