1#!/usr/bin/python3 2# -*- coding: utf-8 -*- 3""" 4Copyright (c) 2021 Huawei Device Co., Ltd. 5Licensed under the Apache License, Version 2.0 (the "License"); 6you may not use this file except in compliance with the License. 7You may obtain a copy of the License at 8 9 http://www.apache.org/licenses/LICENSE-2.0 10 11Unless required by applicable law or agreed to in writing, software 12distributed under the License is distributed on an "AS IS" BASIS, 13WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14See the License for the specific language governing permissions and 15limitations under the License. 16 17""" 18import re 19 20class Module(): 21 def __init__(self, module_name, subsystem_name, part_name, deps, external_deps, raw_data): 22 self._module_name = module_name 23 self._subsystem_name = subsystem_name 24 self._part_name = part_name 25 self._deps = deps 26 self._external_deps = external_deps 27 self._raw_data = raw_data 28 29 @property 30 def module_name(self): 31 return self._module_name 32 33 @module_name.setter 34 def module_name(self, value): 35 self._module_name = value 36 37 @property 38 def subsystem_name(self): 39 return self._subsystem_name 40 41 @subsystem_name.setter 42 def subsystem_name(self, value): 43 self._subsystem_name = value 44 45 @property 46 def part_name(self): 47 return self._part_name 48 49 @part_name.setter 50 def part_name(self, value): 51 self._part_name = value 52 53 @property 54 def deps(self): 55 return self._deps 56 57 @deps.setter 58 def deps(self, value): 59 self._deps = value 60 61 @property 62 def external_deps(self): 63 return self._external_deps 64 65 @external_deps.setter 66 def external_deps(self, value): 67 self._external_deps = value 68 69 @property 70 def raw_data(self): 71 return self._raw_data 72 73 @raw_data.setter 74 def raw_data(self, value): 75 self._raw_data = value 76 77 @staticmethod 78 def create_module_by_string(ohos_string, is_so): 79 module_name = '' 80 subsystem_name = '' 81 part_name = '' 82 83 module_pattern = re.compile(r'(?<=ohos_shared_library\(").+(?="\))') if is_so else \ 84 re.compile(r'(?<=ohos_executable\(").+(?="\))') 85 try: 86 module_name = module_pattern.search(ohos_string).group() 87 except AttributeError as e: 88 print('The BUILD.gn file is not written in a standard format and cannot be parsed, The error snippet is :') 89 print(ohos_string) 90 91 subsystem_pattern = re.compile(r'(?<=subsystem_name = ").+?(?="\n)') 92 if subsystem_pattern.search(ohos_string) != None: 93 subsystem_name = subsystem_pattern.search(ohos_string).group() 94 95 part_pattern = re.compile(r'(?<=part_name = ").+?(?="\n)') 96 if part_pattern.search(ohos_string) != None: 97 part_name = part_pattern.search(ohos_string).group() 98 99 deps_pattern = re.compile(r'(?<=deps = \[).+?(?=])', re.DOTALL) 100 deps_raw = deps_pattern.search(ohos_string).group() if deps_pattern.search(ohos_string) != None \ 101 else '' 102 deps_list = [] 103 deps_raw_list = deps_raw.replace('\n','').replace(' ','').replace('"','').split(',') 104 for dep in deps_raw_list: 105 dep = dep.split('/')[-1] 106 deps_list.append(dep) 107 108 external_deps_pattern = re.compile(r'(?<=external_deps = \[).+?(?=])', re.DOTALL) 109 external_deps_raw = external_deps_pattern.search(ohos_string).group() if external_deps_pattern.search(ohos_string) != None \ 110 else '' 111 external_deps_list = [] 112 external_deps_raw_list = external_deps_raw.replace('\n','').replace(' ','').replace('"','').split(',') 113 for dep in external_deps_raw_list: 114 dep = dep.split('/')[-1] 115 external_deps_list.append(dep) 116 117 if external_deps_list.__contains__(''): 118 external_deps_list.remove('') 119 if deps_list.__contains__(''): 120 deps_list.remove('') 121 external_deps = set(external_deps_list) 122 deps = set(set(deps_list)-external_deps) 123 return Module(module_name, subsystem_name, part_name, deps, external_deps, ohos_string) 124 125 126class Node(): 127 def __init__(self, component_name): 128 self._components_name = component_name 129 self._modules = {} 130 self._deps = set() 131 self._external_deps = set() 132 133 @property 134 def components_name(self): 135 return self._components_name 136 137 @components_name.setter 138 def components_name(self, value): 139 self._components_name = value 140 141 @property 142 def deps(self): 143 return self._deps 144 145 @deps.setter 146 def deps(self, value): 147 self._deps = value 148 149 def add_module(self, module): 150 self._modules[module.module_name] = module 151 self._deps = self._deps | module.deps 152 self._external_deps = self._external_deps | module.external_deps 153 154