-
Notifications
You must be signed in to change notification settings - Fork 13
/
cppheader.py
140 lines (111 loc) · 3.97 KB
/
cppheader.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# -*- coding: utf-8 -*-
import re
import CppHeaderParser
def getCppHeader(filename,ignoreSymbols=[]):
'''
通过一个文件名获得一个CppHeader结构数据
filename 文件名称(含路径)
ignoreSymbols 需要忽略的符号
返回 CppHeader结构
'''
#TODO : 这里存在一个问题,如果使用了ignoreSymbols由于使用CppHeaderParser.ignoreSymbols.extend(ignoreSymbols)
# 将影响到后续的调用,这个影响无法清楚,一直要等到重启解释器。
if ignoreSymbols and type(ignoreSymbols) == list:
CppHeaderParser.ignoreSymbols.extend(ignoreSymbols)
return CppHeaderParser.CppHeader(filename)
def getClass(header,className):
'''
通过一个类名称在一个CppHeader中查找一个Class结构(含struct)
header CppHeader结构
className 要查找的类名称
返回 Class结构
'''
return header.classes[className]
def getClasses(header):
'''
通过头文件获取所有类和结构体的定义
'''
return header.classes
def getClassMethod(aclass,methodType,methodName):
'''
通过方法的类型和名称查找方法在一个class结构中查找一个结构
acalss Class结构
methodType 方法类型(指public,protected,private)
methodName 方法名称
返回 Method结构
'''
# TODO : 这里存在一个问题,就是在c++类中方法可以重载,方法名称不唯一
# 在CTP接口函数中不存在这种情况,暂时忽略
return {method['name']:method for method in aclass['methods'][methodType]}[methodName]
def getClassMethods(aclass,methodType):
'''
给定一个class结构获取所有的下挂方法
acalss Class结构
methodType 方法类型(指public,protected,private)
'''
return {method['name']:method for method in aclass['methods'][methodType]}
def getStructFields(struct):
'''
获取一个结构体的字段列表
struct 结构体数据
返回 字段列表
'''
return [field for field in struct['properties']['public']]
def getMethodParameters(method):
'''
给定一个method结构返回其所有参数
method Method结构
返回 参数列表
'''
return [parameter for parameter in method['parameters'] ]
def getTypedefDict(filename):
'''
从一个C++头文件中获取所有的typedef数据
filename 要读取的文件名称
返回 一个typedef信息字典,其格式为:
'''
pattern = r'\s*typedef\s+(?P<type>\w+(\s+\*\s+)*)\s+(?P<name>\w+)\s*(\[\s*(?P<len>\w+)\s*\]){0,1}\s*;'
regex = re.compile(pattern)
with open(filename) as f :
header = f.read()
typedefDict = {m.groupdict()['name']:m.groupdict() for m in regex.finditer(header)}
return typedefDict
def getEnumDict(filename):
'''
从一个c++头文件中获取所有的枚举类型的值
filename 要读取的文件名称
返回 一个枚举数据字段,
其格式为{'类型名称':[{'name':'枚举名称1','value':'枚举对应值','remark':'说明'},...],...}
'''
# TODO 注意该函数功能并不通用,其基于CTP头文件的特性结构
# 先读取所有的typedef定义
typedefs = getTypedefDict(filename)
# 定义正则表达式
definePattern = r'///(?P<remark>\S+)\s+#define\s+(?P<name>\S+)\s+(?P<value>\S+)\s+'
defineRegex = re.compile(definePattern)
# 读取对应的头文件信息
with open(filename) as f:
header = f.read()
# 为每个类型尝试寻找其对应枚举值(如果存在的话)
enumDict = {}
for tdname in typedefs:
enumPattern = r'T%s[\S\s]*?typedef\s*\S+\s+%s;' % (tdname[6:],tdname)
enumDefineStringList = re.findall(enumPattern ,header)
if enumDefineStringList :
enumDefineString= enumDefineStringList [0]
enumDict[tdname ] = [m.groupdict()for m in defineRegex .finditer(enumDefineString)]
return enumDict
#def getMethodReturn(method):
# '''
# 给定一个method结构获取其返回值类型
# method Method结构
# 返回 返回值类型名称
# '''
# return method['returns']
#def getParameterType(parameter):
# '''
# 给定一个方法的参数结构,返回其类型
# parameter 方法的参数结构
# 返回 参数的类型名称
# '''
# return parameter['type']