Какие параметры формата 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);
}];
Ответы
Ответ 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