diff --git a/build-tools/capi_parser/src/coreImpl/diff/diff_file.py b/build-tools/capi_parser/src/coreImpl/diff/diff_file.py index 00d41aed7067c6ac397383f6eae967457d1d39dc..a0ba88c79c338dae18503c574181bcdaba0bcb05 100644 --- a/build-tools/capi_parser/src/coreImpl/diff/diff_file.py +++ b/build-tools/capi_parser/src/coreImpl/diff/diff_file.py @@ -16,9 +16,8 @@ import filecmp import json import os - +from collections import OrderedDict import openpyxl as op - from coreImpl.parser.parser import parser_include_ast from coreImpl.diff.diff_processor_node import judgment_entrance from typedef.diff.diff import OutputJson @@ -148,7 +147,8 @@ def get_same_file_diff(target_file, old_file_list, new_file_list, old_dir, new_d def get_file_result_diff(old_target_file, new_target_file): old_file_result_map = parse_file_result(parser_include_ast(global_old_dir, [old_target_file])) new_file_result_map = parse_file_result(parser_include_ast(global_new_dir, [new_target_file])) - all_key_list = old_file_result_map.keys() | new_file_result_map.keys() + merged_dict = OrderedDict(list(old_file_result_map.items()) + list(new_file_result_map.items())) + all_key_list = merged_dict.keys() for key in all_key_list: diff_info_list.extend(judgment_entrance(old_file_result_map.get(key), new_file_result_map.get(key))) diff --git a/build-tools/capi_parser/src/coreImpl/diff/diff_processor_node.py b/build-tools/capi_parser/src/coreImpl/diff/diff_processor_node.py index 1d2707898dc21e9641676c574f9a2659ee543e55..6554ce32fab511b1ae125921a499d16816ca737e 100644 --- a/build-tools/capi_parser/src/coreImpl/diff/diff_processor_node.py +++ b/build-tools/capi_parser/src/coreImpl/diff/diff_processor_node.py @@ -16,6 +16,7 @@ import json import subprocess import os +from collections import OrderedDict from clang.cindex import CursorKind from coreImpl.diff.diff_processor_permission import compare_permission, RangeChange from typedef.diff.diff import TAGS, DiffType, DiffInfo, Scene @@ -38,20 +39,30 @@ def wrap_diff_info(old_info, new_info, diff_info: DiffInfo): return diff_info +def parse_file_result(result): + result_map = {} + for member in result: + if member["name"] == '': + continue + result_map.setdefault(f'{member["name"]}-{member["kind"]}', member) + return result_map + + +def get_member_result_diff(old_target, new_target): + old_member_result_map = parse_file_result(old_target) + new_member_result_map = parse_file_result(new_target) + merged_dict = OrderedDict(list(old_member_result_map.items()) + list(new_member_result_map.items())) + all_key_list = merged_dict.keys() + return old_member_result_map, new_member_result_map, all_key_list + + def process_function(old, new): diff_info_list = [] - process_func_name(old, new, diff_info_list) # 处理name process_func_return(old, new, diff_info_list) # 处理返回值 process_func_param(old, new, diff_info_list) # 处理参数 return diff_info_list -def process_func_name(old, new, diff_info_list): - if old['name'] != new['name']: - diff_info = wrap_diff_info(old, new, DiffInfo(DiffType.FUNCTION_NAME_CHANGE)) - diff_info_list.append(diff_info) - - def process_func_return(old, new, diff_info_list): if old['return_type'] != new['return_type']: diff_info = wrap_diff_info(old, new, DiffInfo(DiffType.FUNCTION_RETURN_CHANGE)) @@ -136,19 +147,20 @@ def process_struct_name(old, new, diff_struct_list): def process_struct_member(old, new, diff_struct_list): if 'members' in old and 'members' in new: # 都有 - old_len = len(old['members']) - new_len = len(new['members']) - for i in range(max(old_len, new_len)): # 处理type和name - if (i + 1) > new_len: # 减少成员 - diff_info = wrap_diff_info(old['members'][i], new, - DiffInfo(DiffType.STRUCT_MEMBER_REDUCE)) - diff_struct_list.append(diff_info) - elif (i + 1) > old_len: # 增加成员 - diff_info = wrap_diff_info(old, new['members'][i], + old_member_result, new_member_result, all_key_result = get_member_result_diff(old['members'], + new['members']) + for key in all_key_result: + if old_member_result.get(key) is None: + diff_info = wrap_diff_info(old_member_result.get(key), new_member_result.get(key), DiffInfo(DiffType.STRUCT_MEMBER_ADD)) diff_struct_list.append(diff_info) + elif new_member_result.get(key) is None: + diff_info = wrap_diff_info(old_member_result.get(key), new_member_result.get(key), + DiffInfo(DiffType.STRUCT_MEMBER_REDUCE)) + diff_struct_list.append(diff_info) else: - process_struct_member_scene(old['members'], new['members'], i, diff_struct_list) + process_struct_member_scene(old_member_result.get(key), + new_member_result.get(key), diff_struct_list) elif 'members' not in old and 'members' in new: # 旧无新有 diff_info = wrap_diff_info(old, new, DiffInfo(DiffType.STRUCT_MEMBER_ADD)) @@ -159,28 +171,28 @@ def process_struct_member(old, new, diff_struct_list): diff_struct_list.append(diff_info) -def process_struct_member_scene(old_member, new_member, index, diff_struct_list): +def process_struct_member_scene(old_member, new_member, diff_struct_list): special_data = [] # 存储嵌套的体系 - if (old_member[index]['kind'] == Scene.STRUCT_DECL.value) and \ - (new_member[index]['kind'] == Scene.STRUCT_DECL.value): # 结构体套结构体 - special_data = process_struct(old_member[index], new_member[index]) + if (old_member['kind'] == Scene.STRUCT_DECL.value) and \ + (new_member['kind'] == Scene.STRUCT_DECL.value): # 结构体套结构体 + special_data = process_struct(old_member, new_member) - elif (old_member[index]['kind'] == Scene.UNION_DECL.value) and \ - (new_member[index]['kind'] == Scene.UNION_DECL.value): # 结构体套联合体 - special_data = process_union(old_member[index], new_member[index]) + elif (old_member['kind'] == Scene.UNION_DECL.value) and \ + (new_member['kind'] == Scene.UNION_DECL.value): # 结构体套联合体 + special_data = process_union(old_member, new_member) - elif (old_member[index]['kind'] == Scene.ENUM_DECL.value) and \ - (new_member[index]['kind'] == Scene.ENUM_DECL.value): # 结构体套枚举 - special_data = process_enum(old_member[index], new_member[index]) + elif (old_member['kind'] == Scene.ENUM_DECL.value) and \ + (new_member['kind'] == Scene.ENUM_DECL.value): # 结构体套枚举 + special_data = process_enum(old_member, new_member) diff_struct_list.extend(special_data) - if old_member[index]['type'] != new_member[index]['type']: - diff_info = wrap_diff_info(old_member[index], new_member[index], + if old_member['type'] != new_member['type']: + diff_info = wrap_diff_info(old_member, new_member, DiffInfo(DiffType.STRUCT_MEMBER_TYPE_CHANGE)) diff_struct_list.append(diff_info) - if old_member[index]['name'] != new_member[index]['name']: - diff_info = wrap_diff_info(old_member[index], new_member[index], + if old_member['name'] != new_member['name']: + diff_info = wrap_diff_info(old_member, new_member, DiffInfo(DiffType.STRUCT_MEMBER_NAME_CHANGE)) diff_struct_list.append(diff_info) @@ -200,19 +212,20 @@ def process_union_name(old, new, diff_union_list): def process_union_member(old, new, diff_union_list): if 'members' in old and 'members' in new: # 都有 - old_len = len(old['members']) - new_len = len(new['members']) - for i in range(max(old_len, new_len)): # 处理type和name - if (i + 1) > new_len: # 减少成员 - diff_info = wrap_diff_info(old['members'][i], new, - DiffInfo(DiffType.UNION_MEMBER_REDUCE)) - diff_union_list.append(diff_info) - elif (i + 1) > old_len: # 增加成员 - diff_info = wrap_diff_info(old, new['members'][i], + old_member_result, new_member_result, all_key_result = get_member_result_diff(old['members'], + new['members']) + for key in all_key_result: + if old_member_result.get(key) is None: + diff_info = wrap_diff_info(old_member_result.get(key), new_member_result.get(key), DiffInfo(DiffType.UNION_MEMBER_ADD)) diff_union_list.append(diff_info) + elif new_member_result.get(key) is None: + diff_info = wrap_diff_info(old_member_result.get(key), new_member_result.get(key), + DiffInfo(DiffType.UNION_MEMBER_REDUCE)) + diff_union_list.append(diff_info) else: - process_union_member_scene(old['members'], new['members'], i, diff_union_list) + process_union_member_scene(old_member_result.get(key), + new_member_result.get(key), diff_union_list) elif 'members' not in old and 'members' in new: # 旧无新有 diff_info = wrap_diff_info(old, new, DiffInfo(DiffType.UNION_MEMBER_ADD)) @@ -223,28 +236,28 @@ def process_union_member(old, new, diff_union_list): diff_union_list.append(diff_info) -def process_union_member_scene(old_member, new_member, i, diff_union_list): +def process_union_member_scene(old_member, new_member, diff_union_list): special_data = [] # 存储嵌套的体系 - if (old_member[i]['kind'] == Scene.STRUCT_DECL.value) and \ - (new_member[i]['kind'] == Scene.STRUCT_DECL.value): # 联合体套结构体 - special_data = process_struct(old_member[i], new_member[i]) + if (old_member['kind'] == Scene.STRUCT_DECL.value) and \ + (new_member['kind'] == Scene.STRUCT_DECL.value): # 联合体套结构体 + special_data = process_struct(old_member, new_member) - elif (old_member[i]['kind'] == Scene.UNION_DECL.value) and \ - (new_member[i]['kind'] == Scene.UNION_DECL.value): # 联合体套联合体 - special_data = process_union(old_member[i], new_member[i]) + elif (old_member['kind'] == Scene.UNION_DECL.value) and \ + (new_member['kind'] == Scene.UNION_DECL.value): # 联合体套联合体 + special_data = process_union(old_member, new_member) - elif (old_member[i]['kind'] == Scene.ENUM_DECL.value) and \ - (new_member[i]['kind'] == Scene.ENUM_DECL.value): # 联合体套枚举 - special_data = process_enum(old_member[i], new_member[i]) + elif (old_member['kind'] == Scene.ENUM_DECL.value) and \ + (new_member['kind'] == Scene.ENUM_DECL.value): # 联合体套枚举 + special_data = process_enum(old_member, new_member) diff_union_list.extend(special_data) - if old_member[i]['type'] != new_member[i]['type']: - diff_info = wrap_diff_info(old_member[i], new_member[i], + if old_member['type'] != new_member['type']: + diff_info = wrap_diff_info(old_member, new_member, DiffInfo(DiffType.UNION_MEMBER_TYPE_CHANGE)) diff_union_list.append(diff_info) - if old_member[i]['name'] != new_member[i]['name']: - diff_info = wrap_diff_info(old_member[i], new_member[i], + if old_member['name'] != new_member['name']: + diff_info = wrap_diff_info(old_member, new_member, DiffInfo(DiffType.UNION_MEMBER_NAME_CHANGE)) diff_union_list.append(diff_info) @@ -264,19 +277,20 @@ def process_enum_name(old, new, diff_enum_list): def process_enum_member(old, new, diff_enum_list): if 'members' in old and 'members' in new: # 都有 - old_len = len(old['members']) - new_len = len(new['members']) - for i in range(max(old_len, new_len)): # 处理value和name - if (i + 1) > new_len: # 减少成员 - diff_info = wrap_diff_info(old['members'][i], new, - DiffInfo(DiffType.ENUM_MEMBER_REDUCE)) - diff_enum_list.append(diff_info) - elif (i + 1) > old_len: # 增加成员 - diff_info = wrap_diff_info(old, new['members'][i], + old_member_result, new_member_result, all_key_result = get_member_result_diff(old['members'], + new['members']) + for key in all_key_result: + if old_member_result.get(key) is None: + diff_info = wrap_diff_info(old_member_result.get(key), new_member_result.get(key), DiffInfo(DiffType.ENUM_MEMBER_ADD)) diff_enum_list.append(diff_info) + elif new_member_result.get(key) is None: + diff_info = wrap_diff_info(old_member_result.get(key), new_member_result.get(key), + DiffInfo(DiffType.ENUM_MEMBER_REDUCE)) + diff_enum_list.append(diff_info) else: - process_enum_member_scene(old['members'], new['members'], i, diff_enum_list) + process_enum_member_scene(old_member_result.get(key), + new_member_result.get(key), diff_enum_list) elif 'members' not in old and 'members' in new: # 旧无新有 diff_info = wrap_diff_info(old, new, DiffInfo(DiffType.ENUM_MEMBER_ADD)) @@ -287,14 +301,14 @@ def process_enum_member(old, new, diff_enum_list): diff_enum_list.append(diff_info) -def process_enum_member_scene(old_member, new_member, i, diff_union_list): - if old_member[i]['value'] != new_member[i]['value']: - diff_info = wrap_diff_info(old_member[i], new_member[i], +def process_enum_member_scene(old_member, new_member, diff_union_list): + if old_member['value'] != new_member['value']: + diff_info = wrap_diff_info(old_member, new_member, DiffInfo(DiffType.ENUM_MEMBER_VALUE_CHANGE)) diff_union_list.append(diff_info) - if old_member[i]['name'] != new_member[i]['name']: - diff_info = wrap_diff_info(old_member[i], new_member[i], + if old_member['name'] != new_member['name']: + diff_info = wrap_diff_info(old_member, new_member, DiffInfo(DiffType.ENUM_MEMBER_NAME_CHANGE)) diff_union_list.append(diff_info) diff --git a/build-tools/capi_parser/src/coreImpl/parser/parser.py b/build-tools/capi_parser/src/coreImpl/parser/parser.py index b7e00e5d95330567e39f8b94df3ff6845708803a..5bc825b6595c8aa93fb1bd1061e54e9abf602387 100644 --- a/build-tools/capi_parser/src/coreImpl/parser/parser.py +++ b/build-tools/capi_parser/src/coreImpl/parser/parser.py @@ -20,6 +20,7 @@ import os import glob import re import shutil +import stat from utils.constants import StringConstant, RegularExpressions from typedef.parser.parser import ParserGetResultTable from coreImpl.parser import parse_include, generating_tables # 引入解析文件 # 引入得到结果表格文件 @@ -265,6 +266,17 @@ def parser(directory_path): # 目录路径 def parser_include_ast(gn_file_path, include_path): # 对于单独的.h解析接口 + correct_include_path = [] link_path = [StringConstant.INCLUDE_LIB.value] - data = parse_include.get_include_file(include_path, link_path, gn_file_path) + modes = stat.S_IRWXO | stat.S_IRWXG | stat.S_IRWXU + fd = os.open('include_file_suffix.txt', os.O_WRONLY | os.O_CREAT, mode=modes) + for item in include_path: + split_path = os.path.splitext(item) + if split_path[1] == '.h': # 判断.h结尾 + correct_include_path.append(item) + else: + exc = 'The file does not end with.h: {}\n'.format(item) + os.write(fd, exc.encode()) + os.close(fd) + data = parse_include.get_include_file(correct_include_path, link_path, gn_file_path) return data