如何限制方法和函数的行数
How to set a limit on the number of lines for methods and functions?
我想检查一个(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
相关文章:
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- 如何获取指向受概念限制的函数的函数指针?
- 如何使用类型特征将函数的通用引用参数限制为 r 值引用?
- 限制函数调用
- 超过了三次函数根平分搜索时间限制
- 限制多模板参数朋友函数可访问的类实例的范围
- 限制variadic模板类中的构造函数访问
- "virtual"对C++析构函数有何影响?
- 将函数参数限制为某些枚举值
- C++ 友元函数在内存位置上有何不同?
- C++,如何创建线程限制/受保护的变量和函数
- 无法使用"enable_if"和"is_base_of"将模板函数"operator+"的重载限制到我的类层次结构
- std :: unordered_map对哈希函数的限制是什么?
- 构造函数的限制函数
- DLL函数名限制-函数名末尾的数字OK
- 将函数模板限制为特定类型
- 内联是否将函数/方法限制在其当前源文件的范围内
- 在构造函数中限制可变模板的可接受方法
- 在常量初始化器中调用constexpr构造函数的限制