什么clang-format选项控制方法调用参数的格式?

时间:2014-03-05 13:58:03

标签: objective-c formatting clang clang-format

我知道人们对如何在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);
    }];

3 个答案:

答案 0 :(得分:10)

我查看了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?

答案 1 :(得分: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];

这意味着clang格式化将所有参数放在不同的行上并对齐冒号。

答案 2 :(得分:1)

我有同样的问题:我想在块参数的方法中禁用冒号对齐。

最后,我通过改变Clang-Format源代码中的行为来解决它:
我在ContinuationIndenter.cpp的任何地方都将BreakBeforeParamater = true更改为BreakBeforeParameter = false(感谢@Matthias参考代码)。

这个解决方案并不美观但有效。现在,Clang-Format不会将ObjC参数分割为新行。

您可以从Dropbox下载修改后的工具。

PS。原始代码是从此repo克隆的:http://llvm.org/git/clang.git