Подтвердить что ты не робот

Какие параметры формата clang определяют формат параметров вызова метода?

Я знаю, что у людей разные мнения о том, как форматировать вызовы методов в Objective-C, т.е.

[self presentViewController:scanViewController
                   animated:YES
                 completion:nil];

vs

[self presentViewController:scanViewController animated:YES completion:nil];

Какие параметры в моем файле .clang-формате я использую для управления этим отступом? (Если я этого не хочу, двоеточия выстраиваются в линию и т.д.)

Кроме того, это только я или этот форматирующий, не осведомленный о блоках? Обратите внимание, что оператор if для блока успеха не имеет отступов, а также функция NSLog в блоке отказов.

[self.client getPath:path
    parameters:parameters
    success:^(AFHTTPRequestOperation *operation, id responseObject) {
    if ([from_id isEqualToString:self.from_id]) {
        self.image.image = [UIImage imageWithData:responseObject];
    }
    }
    failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(error.description);
    }];
4b9b3361

Ответ 1

Я просмотрел исходный код формата clang, в котором выполняется форматирование выражений метода objective-c и найдено его здесь: http://llvm.org/svn/llvm-project/cfe/trunk/lib/Format/ContinuationIndenter.cpp

Код:

// If this '[' opens an ObjC call, determine whether all parameters fit
// into one line and put one per line if they don't.
if (Current.Type == TT_ObjCMethodExpr &&
    getLengthToMatchingParen(Current) + State.Column >
        getColumnLimit(State))
  BreakBeforeParameter = true;

Как вы видите, поведение управляется только параметром конфигурации ColumnLimit. Вы можете установить его на 0 для подавления разрывов строк. К сожалению, это, конечно, влияет на полное форматирование.

Относительно проблемы с отсутствующим отступлением в блоках: я не смог воспроизвести это с помощью последнего плагина Visual Studio (SVN r203967). Возможно, вы играли с ContinuationIndentWidth?

Ответ 2

Моя переменная ColumnLimit равна нулю. Вызов метода отформатирован следующим образом:

[self presentViewController:scanViewController animated:YES completion:nil];

Я хотел бы отформатировать их следующим образом, не изменяя переменную ColumnLimit:

[self presentViewController:scanViewController
               animated:YES
             completion:nil];

Кажется, что для этого не существует опции конфигурации clang. Однако я нашел решение, которое работает для меня:

Если я добавлю//и разрыв строки сразу после первого параметра (scanViewController здесь), форматирование кода с помощью clang дает желаемый результат:

[self presentViewController:scanViewController //
                   animated:YES
                 completion:nil];

Это означает, что форматирование клана ставит все параметры на отдельные строки и выравнивает двоеточия.

Ответ 3

У меня была такая же проблема: я хотел отключить выравнивание двоеточия в методах с параметрами блока.

Наконец, я решил его, изменив его поведение в Clang-Format исходном коде:
Я изменил BreakBeforeParamater = true на BreakBeforeParameter = false всюду в ContinuationIndenter.cpp (Спасибо @Matthias за ссылку на код).

Это решение не красиво, но работает. Теперь Clang-Format не разбивает параметры ObjC на новые строки.

Вы можете загрузить модифицированный инструмент из Dropbox.

PS. Исходный код был клонирован из этого репо: http://llvm.org/git/clang.git