如何限制方法和函数的行数

How to set a limit on the number of lines for methods and functions?

本文关键字:函数 何限制 方法      更新时间:2023-10-16

我想检查一个(git)提交是否遵守某个方法长度限制。

理想情况下,它应该检查提交所涉及的任何方法是否超过了某个阈值。

我想集成c++代码中的行计数和git差异的工具可能不容易获得,但我很高兴发现相反的情况是正确的。

如果这样的工具不存在,那么在文件中拥有方法长度,开始行和结束行列表的最方便的方法是什么?

我将排除使用正则表达式或简单解析器将在所有情况下与C, c++, c++ 11和可能的未来版本的语言工作,所以使用真正的解析器的一些解决方案将是首选。

你可以像这样使用Google Style Guide Checker:

cpplint.py --filter=readability/fn_size

这将限制它只检查函数大小规则

经过进一步的研究,使用合适的C++解析器的最可行的选择似乎是通过python绑定使用clang。

首先用cmake生成compile_commands.json或以其他方式生成

cmake .. -DCMAKE_EXPORT_COMPILE_COMMANDS=On

然后运行这个简单的概念证明:

import json
import clang.cindex
from ctypes.util import find_library
clang.cindex.Config.set_library_file(find_library('clang-3.6'))
index = clang.cindex.Index.create()
commands = json.load(open('compile_commands.json', 'r'))
for command in commands:
    args = command['command'].split()
    filename = command['file']
    tu = index.parse(args[-1], args[:-1])
    curs = tu.cursor
    for x in curs.walk_preorder():
        # Print only functions/methods with a source file 
        # in the home folder :)
        if x.type.kind == clang.cindex.TypeKind.FUNCTIONPROTO and x.location.file.name[0:5] == "/home" :
            # print only the definitions
            if x.get_definition() and x.get_definition() == x:
                print x.extent.end.line-x.extent.start.line, 't', 
                    x.extent.start.line, 't', 
                    x.extent.end.line, 't', 
                    x.location.file.name, 't', 
                    x.displayname

我对clang API仍然很陌生,但我在一个相当大的C++代码库上尝试了类似的东西(有更多的检查),没有出现故障。

如果你使用git,你可以添加git钩子来检查你的需求是否满足。

例如

:如果你想在客户端检查,你可以添加一个预提交钩子。或者在服务器端有一个预接收/更新(在处理客户端推送时调用)钩子,如果你的要求没有得到满足,它会拒绝推送。

查看更多细节:https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks