clang-format: [JS] Add a special case for indenting function literals.

Before:
  var func =
      function() {
        doSomething();
      };

After:
  var func =
      function() {
    doSomething();
  };

This is a very narrow special case which fixes most of the discrepency
with what our users do. In the long run, we should try to come up with
a more generic fix for indenting these.

llvm-svn: 240014
This commit is contained in:
Daniel Jasper 2015-06-18 12:32:59 +00:00
parent 1739421893
commit ed3f395773
2 changed files with 19 additions and 1 deletions

View File

@ -418,7 +418,21 @@ unsigned ContinuationIndenter::addTokenOnNewLine(LineState &State,
Penalty += Style.PenaltyBreakFirstLessLess;
State.Column = getNewLineColumn(State);
State.Stack.back().NestedBlockIndent = State.Column;
// Indent nested blocks relative to this column, unless in a very specific
// JavaScript special case where:
//
// var loooooong_name =
// function() {
// // code
// }
//
// is common and should be formatted like a free-standing function.
if (Style.Language != FormatStyle::LK_JavaScript ||
Current.NestingLevel != 0 || !PreviousNonComment->is(tok::equal) ||
!Current.is(Keywords.kw_function))
State.Stack.back().NestedBlockIndent = State.Column;
if (NextNonComment->isMemberAccess()) {
if (State.Stack.back().CallContinuation == 0)
State.Stack.back().CallContinuation = State.Column;

View File

@ -294,6 +294,10 @@ TEST_F(FormatTestJS, FunctionLiterals) {
verifyFormat("var func = function() {\n"
" return 1;\n"
"};");
verifyFormat("var func = //\n"
" function() {\n"
" return 1;\n"
"};");
verifyFormat("return {\n"
" body: {\n"
" setAttribute: function(key, val) { this[key] = val; },\n"