mirror of
https://gitee.com/openharmony/interface_sdk_c
synced 2024-11-24 07:09:59 +00:00
commit
88af4abac2
@ -19,6 +19,7 @@ from typedef.check.check import ApiResultInfo, FileDocInfo, OutputTxt
|
|||||||
from coreImpl.check.check_doc import process_comment, process_file_doc_info
|
from coreImpl.check.check_doc import process_comment, process_file_doc_info
|
||||||
from coreImpl.check.check_name import check_file_name, check_ndk_name
|
from coreImpl.check.check_name import check_file_name, check_ndk_name
|
||||||
from coreImpl.parser.parser import parser_include_ast
|
from coreImpl.parser.parser import parser_include_ast
|
||||||
|
from coreImpl.check.check_syntax import check_syntax
|
||||||
|
|
||||||
|
|
||||||
def process_api_json(api_info, file_doc_info: FileDocInfo, api_result_info_list):
|
def process_api_json(api_info, file_doc_info: FileDocInfo, api_result_info_list):
|
||||||
@ -59,31 +60,41 @@ def process_all_json(python_obj):
|
|||||||
return api_result_info_list
|
return api_result_info_list
|
||||||
|
|
||||||
|
|
||||||
def write_in_txt(check_result):
|
def write_in_txt(check_result, output_path):
|
||||||
|
result_json = result_to_json(check_result)
|
||||||
|
fs = open(output_path, 'w', encoding='utf-8')
|
||||||
|
fs.write(result_json)
|
||||||
|
fs.close()
|
||||||
|
|
||||||
|
|
||||||
|
def result_to_json(check_result):
|
||||||
txtResul = []
|
txtResul = []
|
||||||
if len(check_result) == 0:
|
if len(check_result) == 0:
|
||||||
txtResul.append('api_check: false')
|
txtResul.append('api_check: false')
|
||||||
else:
|
else:
|
||||||
for result in check_result:
|
for result in check_result:
|
||||||
location = '{}(line:{}, col:{})'.format(result.location, result.locationLine, result.locationColumn)
|
location = f'{result.location}(line:{result.locationLine}, col:{result.locationColumn})'
|
||||||
message = 'API check error of [{}]:{}'.format(result.errorType['description'], result.errorInfo)
|
message = 'API check error of [{}]:{}'.format(result.errorType['description'], result.errorInfo)
|
||||||
txtResul.append(OutputTxt(result.errorType['id'], result.level, location, result.fileName, message))
|
txtResul.append(OutputTxt(result.errorType['id'], result.level, location, result.fileName, message))
|
||||||
txtResul.append('api_check: false')
|
txtResul.append('api_check: false')
|
||||||
result_json = json.dumps(txtResul, default=lambda obj: obj.__dict__, indent=4)
|
return json.dumps(txtResul, default=lambda obj: obj.__dict__, indent=4)
|
||||||
fs = open(r'./Error.txt', 'w', encoding='utf-8')
|
|
||||||
fs.write(result_json)
|
|
||||||
fs.close()
|
|
||||||
|
|
||||||
|
|
||||||
def curr_entry(pr_id):
|
def curr_entry(pr_id):
|
||||||
file_path = os.path.abspath(os.path.join(os.getcwd(), "..{}..{}all_files.txt".format(os.sep, os.sep)))
|
file_path = os.path.abspath(os.path.join(os.getcwd(), f'..{os.sep}..{os.sep}all_files.txt'))
|
||||||
file_list = get_md_files(file_path)
|
file_list = get_md_files(file_path)
|
||||||
check_result = []
|
check_result_list = get_check_result_list(file_list)
|
||||||
|
write_in_txt(check_result_list, r'./Error.txt')
|
||||||
|
|
||||||
|
|
||||||
|
def get_check_result_list(file_list):
|
||||||
|
check_result_list = []
|
||||||
for file in file_list:
|
for file in file_list:
|
||||||
root_path = file.split('sdk_c')[0] + 'sdk_c'
|
root_path = file.split('sdk_c')[0] + 'sdk_c'
|
||||||
python_obj = parser_include_ast(root_path, [file])
|
python_obj = parser_include_ast(root_path, [file])
|
||||||
check_result.extend(process_all_json(python_obj))
|
check_result_list.extend(process_all_json(python_obj))
|
||||||
write_in_txt(check_result)
|
check_result_list.extend(check_syntax(file))
|
||||||
|
return check_result_list
|
||||||
|
|
||||||
|
|
||||||
def get_md_files(url):
|
def get_md_files(url):
|
||||||
|
103
capi_parser/src/coreImpl/check/check_syntax.py
Normal file
103
capi_parser/src/coreImpl/check/check_syntax.py
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (c) 2023 Huawei Device Co., Ltd.
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
import re
|
||||||
|
import subprocess
|
||||||
|
from typedef.check.check import ApiResultInfo, ErrorMessage, ErrorType, LogType
|
||||||
|
|
||||||
|
|
||||||
|
def check_syntax(file_path):
|
||||||
|
cmd_list = ['clang', r'-I sysroot\ndk_musl_include_files', '-std=c99']
|
||||||
|
result_list = []
|
||||||
|
command = cmd_list + [file_path]
|
||||||
|
run_result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
|
result_list.extend(processing_data(run_result, file_path))
|
||||||
|
return result_list
|
||||||
|
|
||||||
|
|
||||||
|
def processing_data(run_result, result_file):
|
||||||
|
api_result_info_list = []
|
||||||
|
for run_result_child in run_result.stderr.decode().split('^'):
|
||||||
|
result_child = run_result_child.replace('~', '')
|
||||||
|
ret = re.findall('\\d+:\\d+', result_child)
|
||||||
|
if len(ret) != 0:
|
||||||
|
error_message = get_specified_string(result_child)
|
||||||
|
if len(error_message) == 1:
|
||||||
|
continue
|
||||||
|
position = ret[0]
|
||||||
|
api_result_info = ApiResultInfo(ErrorType.SYNTAX_ERRORS.value,
|
||||||
|
error_message[1], result_file)
|
||||||
|
line_column = get_line_and_column(position)
|
||||||
|
api_result_info.set_location_line(line_column[0])
|
||||||
|
api_result_info.set_location_column(line_column[1])
|
||||||
|
api_result_info.set_location(result_file)
|
||||||
|
api_result_info.set_type(LogType.LOG_API.value)
|
||||||
|
api_result_info.set_level(2)
|
||||||
|
api_result_info.set_file_name(result_file)
|
||||||
|
api_result_info_list.append(api_result_info)
|
||||||
|
return api_result_info_list
|
||||||
|
|
||||||
|
|
||||||
|
def get_line_and_column(location):
|
||||||
|
if location is not None:
|
||||||
|
return location.split(':')
|
||||||
|
return ['', '']
|
||||||
|
|
||||||
|
|
||||||
|
def get_original(result_child):
|
||||||
|
if len(result_child) == 0:
|
||||||
|
return result_child
|
||||||
|
original = result_child.lstrip().split("\r\n")
|
||||||
|
if len(original) == 2:
|
||||||
|
return ''
|
||||||
|
if len(original) == 3:
|
||||||
|
return original[1]
|
||||||
|
if len(original) == 4:
|
||||||
|
return original[2]
|
||||||
|
|
||||||
|
|
||||||
|
def get_specified_string(target_string):
|
||||||
|
message_type = 'error'
|
||||||
|
function_result = []
|
||||||
|
pattern = r'error: (.*?)\r\n'
|
||||||
|
global matches
|
||||||
|
matches = re.findall(pattern, target_string, re.DOTALL)
|
||||||
|
if len(matches) == 0:
|
||||||
|
pattern = r'warning: (.*?)\r\n'
|
||||||
|
matches = re.findall(pattern, target_string, re.DOTALL)
|
||||||
|
message_type = 'warning'
|
||||||
|
if len(matches) == 0:
|
||||||
|
pattern = r'note: (.*?)\r\n'
|
||||||
|
matches = re.findall(pattern, target_string, re.DOTALL)
|
||||||
|
message_type = 'note'
|
||||||
|
function_result.append(message_type)
|
||||||
|
for match in matches:
|
||||||
|
function_result.append(match)
|
||||||
|
if len(function_result[1]) == 0:
|
||||||
|
function_result.append('')
|
||||||
|
return function_result
|
||||||
|
|
||||||
|
|
||||||
|
def get_file_path(file_path):
|
||||||
|
if len(file_path) == 0:
|
||||||
|
return file_path
|
||||||
|
path_split_len = len(file_path.split('\r\n'))
|
||||||
|
path_list = file_path.split('\r\n')
|
||||||
|
if path_split_len == 1:
|
||||||
|
return file_path
|
||||||
|
if path_split_len == 2:
|
||||||
|
return path_list[1]
|
||||||
|
if path_split_len == 3:
|
||||||
|
return path_list[2]
|
@ -51,6 +51,10 @@ class ErrorType(enum.Enum):
|
|||||||
'id': 2,
|
'id': 2,
|
||||||
'description': 'naming errors',
|
'description': 'naming errors',
|
||||||
}
|
}
|
||||||
|
SYNTAX_ERRORS = {
|
||||||
|
'id': 3,
|
||||||
|
'description': 'syntax errors',
|
||||||
|
}
|
||||||
UNKNOW_DEPRECATED = {
|
UNKNOW_DEPRECATED = {
|
||||||
'id': 5,
|
'id': 5,
|
||||||
'description': 'unknow deprecated',
|
'description': 'unknow deprecated',
|
||||||
|
Loading…
Reference in New Issue
Block a user