• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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