1fb726d48Sopenharmony_ci/*
2fb726d48Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd.
3fb726d48Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fb726d48Sopenharmony_ci * you may not use this file except in compliance with the License.
5fb726d48Sopenharmony_ci * You may obtain a copy of the License at
6fb726d48Sopenharmony_ci *
7fb726d48Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8fb726d48Sopenharmony_ci *
9fb726d48Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fb726d48Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fb726d48Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fb726d48Sopenharmony_ci * See the License for the specific language governing permissions and
13fb726d48Sopenharmony_ci * limitations under the License.
14fb726d48Sopenharmony_ci */
15fb726d48Sopenharmony_ci
16fb726d48Sopenharmony_ciimport { SpSystemTrace } from '../SpSystemTrace';
17fb726d48Sopenharmony_ciimport { TraceRow } from '../trace/base/TraceRow';
18fb726d48Sopenharmony_ciimport { renders } from '../../database/ui-worker/ProcedureWorker';
19fb726d48Sopenharmony_ciimport { SampleStruct, SampleRender } from '../../database/ui-worker/ProcedureWorkerBpftrace';
20fb726d48Sopenharmony_ciimport { queryStartTime } from '../../database/sql/SqlLite.sql';
21fb726d48Sopenharmony_ciimport { SpStatisticsHttpUtil } from '../../../statistics/util/SpStatisticsHttpUtil';
22fb726d48Sopenharmony_ci
23fb726d48Sopenharmony_ciexport class SpBpftraceChart {
24fb726d48Sopenharmony_ci  private trace: SpSystemTrace;
25fb726d48Sopenharmony_ci
26fb726d48Sopenharmony_ci  constructor(trace: SpSystemTrace) {
27fb726d48Sopenharmony_ci    this.trace = trace;
28fb726d48Sopenharmony_ci  }
29fb726d48Sopenharmony_ci
30fb726d48Sopenharmony_ci  async init(file: File | null) {
31fb726d48Sopenharmony_ci    if (!file) {
32fb726d48Sopenharmony_ci      let startTime = await queryStartTime();
33fb726d48Sopenharmony_ci      //@ts-ignore
34fb726d48Sopenharmony_ci      let folder = await this.initSample(startTime[0].start_ts, file);
35fb726d48Sopenharmony_ci      this.trace.rowsEL?.appendChild(folder);
36fb726d48Sopenharmony_ci    } else {
37fb726d48Sopenharmony_ci      let folder = await this.initSample(-1, file);
38fb726d48Sopenharmony_ci      this.trace.rowsEL?.appendChild(folder);
39fb726d48Sopenharmony_ci    }
40fb726d48Sopenharmony_ci  }
41fb726d48Sopenharmony_ci
42fb726d48Sopenharmony_ci  async initSample(start_ts: number, file: unknown): Promise<TraceRow<SampleStruct>> {
43fb726d48Sopenharmony_ci    let traceRow = TraceRow.skeleton<SampleStruct>();
44fb726d48Sopenharmony_ci    traceRow.rowId = 'bpftrace';
45fb726d48Sopenharmony_ci    traceRow.index = 0;
46fb726d48Sopenharmony_ci    traceRow.rowType = TraceRow.ROW_TYPE_SAMPLE;
47fb726d48Sopenharmony_ci    traceRow.rowParentId = '';
48fb726d48Sopenharmony_ci    traceRow.folder = false;
49fb726d48Sopenharmony_ci    traceRow.style.height = '40px';
50fb726d48Sopenharmony_ci    traceRow.name = 'bpftrace';
51fb726d48Sopenharmony_ci    traceRow.selectChangeHandler = this.trace.selectChangeHandler;
52fb726d48Sopenharmony_ci    traceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler;
53fb726d48Sopenharmony_ci    //添加上传按钮
54fb726d48Sopenharmony_ci    if (!file) {
55fb726d48Sopenharmony_ci      traceRow.addRowSampleUpload();
56fb726d48Sopenharmony_ci    }
57fb726d48Sopenharmony_ci    this.addTraceRowEventListener(traceRow, start_ts);
58fb726d48Sopenharmony_ci    //单独上传
59fb726d48Sopenharmony_ci    if (file) {
60fb726d48Sopenharmony_ci      this.getJsonData(file).then((res: unknown) => {
61fb726d48Sopenharmony_ci        // @ts-ignore
62fb726d48Sopenharmony_ci        const propertyData = res.data;
63fb726d48Sopenharmony_ci        // @ts-ignore
64fb726d48Sopenharmony_ci        const treeNodes = res.relation.children || [res.relation.RS.children[0]];
65fb726d48Sopenharmony_ci        const uniqueProperty = this.removeDuplicates(propertyData);
66fb726d48Sopenharmony_ci        const flattenTreeArray = this.getFlattenTreeData(treeNodes);
67fb726d48Sopenharmony_ci        // @ts-ignore
68fb726d48Sopenharmony_ci        const height = (Math.max(...flattenTreeArray.map((obj: unknown) => obj.depth)) + 1) * 20;
69fb726d48Sopenharmony_ci        // @ts-ignore
70fb726d48Sopenharmony_ci        const sampleProperty = this.setRelationDataProperty(flattenTreeArray, uniqueProperty);
71fb726d48Sopenharmony_ci        // @ts-ignore
72fb726d48Sopenharmony_ci        const startTS = flattenTreeArray[0].property[0].begin;
73fb726d48Sopenharmony_ci        traceRow.supplier = () =>
74fb726d48Sopenharmony_ci          new Promise((resolve): void => {
75fb726d48Sopenharmony_ci            // @ts-ignore
76fb726d48Sopenharmony_ci            resolve(sampleProperty);
77fb726d48Sopenharmony_ci          });
78fb726d48Sopenharmony_ci        traceRow.onThreadHandler = (useCache) => {
79fb726d48Sopenharmony_ci          let context: CanvasRenderingContext2D;
80fb726d48Sopenharmony_ci          if (traceRow.currentContext) {
81fb726d48Sopenharmony_ci            context = traceRow.currentContext;
82fb726d48Sopenharmony_ci          } else {
83fb726d48Sopenharmony_ci            context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!;
84fb726d48Sopenharmony_ci          }
85fb726d48Sopenharmony_ci          traceRow.canvasSave(context);
86fb726d48Sopenharmony_ci          (renders.sample as SampleRender).renderMainThread(
87fb726d48Sopenharmony_ci            {
88fb726d48Sopenharmony_ci              context: context,
89fb726d48Sopenharmony_ci              useCache: useCache,
90fb726d48Sopenharmony_ci              type: 'bpftrace',
91fb726d48Sopenharmony_ci              start_ts: startTS,
92fb726d48Sopenharmony_ci              uniqueProperty: uniqueProperty,
93fb726d48Sopenharmony_ci              // @ts-ignore
94fb726d48Sopenharmony_ci              flattenTreeArray: flattenTreeArray,
95fb726d48Sopenharmony_ci            },
96fb726d48Sopenharmony_ci            traceRow
97fb726d48Sopenharmony_ci          );
98fb726d48Sopenharmony_ci          traceRow.canvasRestore(context);
99fb726d48Sopenharmony_ci        };
100fb726d48Sopenharmony_ci        traceRow.style.height = `${height}px`;
101fb726d48Sopenharmony_ci      });
102fb726d48Sopenharmony_ci    } else {
103fb726d48Sopenharmony_ci      traceRow.supplier = () =>
104fb726d48Sopenharmony_ci        new Promise((resolve): void => {
105fb726d48Sopenharmony_ci          resolve([]);
106fb726d48Sopenharmony_ci        });
107fb726d48Sopenharmony_ci      traceRow.onThreadHandler = (useCache) => {
108fb726d48Sopenharmony_ci        let context: CanvasRenderingContext2D;
109fb726d48Sopenharmony_ci        if (traceRow.currentContext) {
110fb726d48Sopenharmony_ci          context = traceRow.currentContext;
111fb726d48Sopenharmony_ci        } else {
112fb726d48Sopenharmony_ci          context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!;
113fb726d48Sopenharmony_ci        }
114fb726d48Sopenharmony_ci        traceRow.canvasSave(context);
115fb726d48Sopenharmony_ci        (renders.sample as SampleRender).renderMainThread(
116fb726d48Sopenharmony_ci          {
117fb726d48Sopenharmony_ci            context: context,
118fb726d48Sopenharmony_ci            useCache: useCache,
119fb726d48Sopenharmony_ci            type: 'bpftrace',
120fb726d48Sopenharmony_ci            start_ts: 0,
121fb726d48Sopenharmony_ci            uniqueProperty: [],
122fb726d48Sopenharmony_ci            flattenTreeArray: [],
123fb726d48Sopenharmony_ci          },
124fb726d48Sopenharmony_ci          traceRow
125fb726d48Sopenharmony_ci        );
126fb726d48Sopenharmony_ci        traceRow.canvasRestore(context);
127fb726d48Sopenharmony_ci      };
128fb726d48Sopenharmony_ci    }
129fb726d48Sopenharmony_ci    return traceRow;
130fb726d48Sopenharmony_ci  }
131fb726d48Sopenharmony_ci
132fb726d48Sopenharmony_ci  /**
133fb726d48Sopenharmony_ci   * 监听文件上传事件
134fb726d48Sopenharmony_ci   * @param row
135fb726d48Sopenharmony_ci   * @param start_ts
136fb726d48Sopenharmony_ci   */
137fb726d48Sopenharmony_ci  // @ts-ignore
138fb726d48Sopenharmony_ci  addTraceRowEventListener(row: TraceRow<unknown>, start_ts: number): void {
139fb726d48Sopenharmony_ci    row.uploadEl?.addEventListener('sample-file-change', (e: unknown) => {
140fb726d48Sopenharmony_ci      this.getJsonData(e).then((res: unknown) => {
141fb726d48Sopenharmony_ci        this.resetChartData(row);
142fb726d48Sopenharmony_ci        // @ts-ignore
143fb726d48Sopenharmony_ci        const propertyData = res.data;
144fb726d48Sopenharmony_ci        // @ts-ignore
145fb726d48Sopenharmony_ci        const treeNodes = res.relation.children || [res.relation.RS.children[0]];
146fb726d48Sopenharmony_ci        const uniqueProperty = this.removeDuplicates(propertyData);
147fb726d48Sopenharmony_ci        const flattenTreeArray = this.getFlattenTreeData(treeNodes);
148fb726d48Sopenharmony_ci        // @ts-ignore
149fb726d48Sopenharmony_ci        const height = (Math.max(...flattenTreeArray.map((obj: unknown) => obj.depth)) + 1) * 20;
150fb726d48Sopenharmony_ci        const sampleProperty = this.setRelationDataProperty(flattenTreeArray, uniqueProperty);
151fb726d48Sopenharmony_ci        // @ts-ignore
152fb726d48Sopenharmony_ci        const startTS = start_ts > 0 ? start_ts : flattenTreeArray[0].property[0].begin;
153fb726d48Sopenharmony_ci        row.supplier = () =>
154fb726d48Sopenharmony_ci          new Promise((resolve): void => {
155fb726d48Sopenharmony_ci            resolve(sampleProperty);
156fb726d48Sopenharmony_ci          });
157fb726d48Sopenharmony_ci        row.onThreadHandler = (useCache) => {
158fb726d48Sopenharmony_ci          let context: CanvasRenderingContext2D;
159fb726d48Sopenharmony_ci          if (row.currentContext) {
160fb726d48Sopenharmony_ci            context = row.currentContext;
161fb726d48Sopenharmony_ci          } else {
162fb726d48Sopenharmony_ci            context = row.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!;
163fb726d48Sopenharmony_ci          }
164fb726d48Sopenharmony_ci          row.canvasSave(context);
165fb726d48Sopenharmony_ci          (renders.sample as SampleRender).renderMainThread(
166fb726d48Sopenharmony_ci            {
167fb726d48Sopenharmony_ci              context: context,
168fb726d48Sopenharmony_ci              useCache: useCache,
169fb726d48Sopenharmony_ci              type: 'bpftrace',
170fb726d48Sopenharmony_ci              start_ts: startTS,
171fb726d48Sopenharmony_ci              uniqueProperty: uniqueProperty,
172fb726d48Sopenharmony_ci              // @ts-ignore
173fb726d48Sopenharmony_ci              flattenTreeArray: flattenTreeArray,
174fb726d48Sopenharmony_ci            },
175fb726d48Sopenharmony_ci            row
176fb726d48Sopenharmony_ci          );
177fb726d48Sopenharmony_ci          row.canvasRestore(context);
178fb726d48Sopenharmony_ci        };
179fb726d48Sopenharmony_ci        row.style.height = `${height}px`;
180fb726d48Sopenharmony_ci      });
181fb726d48Sopenharmony_ci    });
182fb726d48Sopenharmony_ci  }
183fb726d48Sopenharmony_ci
184fb726d48Sopenharmony_ci  /**
185fb726d48Sopenharmony_ci   * 清空缓存
186fb726d48Sopenharmony_ci   * @param row
187fb726d48Sopenharmony_ci   */
188fb726d48Sopenharmony_ci  // @ts-ignore
189fb726d48Sopenharmony_ci  resetChartData(row: TraceRow<unknown>): void {
190fb726d48Sopenharmony_ci    row.dataList = [];
191fb726d48Sopenharmony_ci    row.dataList2 = [];
192fb726d48Sopenharmony_ci    row.dataListCache = [];
193fb726d48Sopenharmony_ci    row.isComplete = false;
194fb726d48Sopenharmony_ci  }
195fb726d48Sopenharmony_ci
196fb726d48Sopenharmony_ci  /**
197fb726d48Sopenharmony_ci   * 获取上传的文件内容 转为json格式
198fb726d48Sopenharmony_ci   * @param file
199fb726d48Sopenharmony_ci   * @returns
200fb726d48Sopenharmony_ci   */
201fb726d48Sopenharmony_ci  getJsonData(file: unknown): Promise<unknown> {
202fb726d48Sopenharmony_ci    return new Promise((resolve, reject) => {
203fb726d48Sopenharmony_ci      let reader = new FileReader();
204fb726d48Sopenharmony_ci      // @ts-ignore
205fb726d48Sopenharmony_ci      reader.readAsText(file.detail || file);
206fb726d48Sopenharmony_ci      reader.onloadend = (e: unknown): void => {
207fb726d48Sopenharmony_ci        // @ts-ignore
208fb726d48Sopenharmony_ci        const fileContent = e.target?.result;
209fb726d48Sopenharmony_ci        try {
210fb726d48Sopenharmony_ci          resolve(JSON.parse(fileContent));
211fb726d48Sopenharmony_ci          document.dispatchEvent(new CustomEvent('file-correct'));
212fb726d48Sopenharmony_ci          SpStatisticsHttpUtil.addOrdinaryVisitAction({
213fb726d48Sopenharmony_ci            event: 'bpftrace',
214fb726d48Sopenharmony_ci            action: 'bpftrace',
215fb726d48Sopenharmony_ci          });
216fb726d48Sopenharmony_ci        } catch (error) {
217fb726d48Sopenharmony_ci          document.dispatchEvent(new CustomEvent('file-error'));
218fb726d48Sopenharmony_ci        }
219fb726d48Sopenharmony_ci      };
220fb726d48Sopenharmony_ci    });
221fb726d48Sopenharmony_ci  }
222fb726d48Sopenharmony_ci
223fb726d48Sopenharmony_ci  /**
224fb726d48Sopenharmony_ci   * 树结构扁平化
225fb726d48Sopenharmony_ci   * @param treeData
226fb726d48Sopenharmony_ci   * @param depth
227fb726d48Sopenharmony_ci   * @param parentName
228fb726d48Sopenharmony_ci   * @returns
229fb726d48Sopenharmony_ci   */
230fb726d48Sopenharmony_ci  getFlattenTreeData(treeData: Array<unknown>, depth: number = 0, parentName: string = ''): Array<unknown> {
231fb726d48Sopenharmony_ci    let result: Array<object> = [];
232fb726d48Sopenharmony_ci    treeData.forEach((node) => {
233fb726d48Sopenharmony_ci      // @ts-ignore
234fb726d48Sopenharmony_ci      const name: string = node.function_name;
235fb726d48Sopenharmony_ci      const newNode: unknown = {};
236fb726d48Sopenharmony_ci      if (name.indexOf('unknown') > -1) {
237fb726d48Sopenharmony_ci        // @ts-ignore
238fb726d48Sopenharmony_ci        newNode.children = this.getUnknownAllChildrenNames(node);
239fb726d48Sopenharmony_ci      }
240fb726d48Sopenharmony_ci      // @ts-ignore
241fb726d48Sopenharmony_ci      newNode.detail = node.detail;
242fb726d48Sopenharmony_ci      // @ts-ignore
243fb726d48Sopenharmony_ci      newNode.depth = depth;
244fb726d48Sopenharmony_ci      // @ts-ignore
245fb726d48Sopenharmony_ci      newNode.name = name;
246fb726d48Sopenharmony_ci      // @ts-ignore
247fb726d48Sopenharmony_ci      newNode.parentName = parentName;
248fb726d48Sopenharmony_ci      // @ts-ignore
249fb726d48Sopenharmony_ci      newNode.property = [];
250fb726d48Sopenharmony_ci      // @ts-ignore
251fb726d48Sopenharmony_ci      result.push(newNode);
252fb726d48Sopenharmony_ci      // @ts-ignore
253fb726d48Sopenharmony_ci      if (node.children) {
254fb726d48Sopenharmony_ci        // @ts-ignore
255fb726d48Sopenharmony_ci        result = result.concat(this.getFlattenTreeData(node.children, depth + 1, node.function_name));
256fb726d48Sopenharmony_ci      }
257fb726d48Sopenharmony_ci    });
258fb726d48Sopenharmony_ci    return result;
259fb726d48Sopenharmony_ci  }
260fb726d48Sopenharmony_ci
261fb726d48Sopenharmony_ci  /**
262fb726d48Sopenharmony_ci   * 查找重复项
263fb726d48Sopenharmony_ci   * @param propertyData
264fb726d48Sopenharmony_ci   * @returns
265fb726d48Sopenharmony_ci   */
266fb726d48Sopenharmony_ci  removeDuplicates(propertyData: Array<unknown>): Array<unknown> {
267fb726d48Sopenharmony_ci    const result: Array<unknown> = [];
268fb726d48Sopenharmony_ci    propertyData.forEach((propertyGroup) => {
269fb726d48Sopenharmony_ci      const groups: Array<unknown> = [];
270fb726d48Sopenharmony_ci      // @ts-ignore
271fb726d48Sopenharmony_ci      propertyGroup.forEach((property: unknown) => {
272fb726d48Sopenharmony_ci        // @ts-ignore
273fb726d48Sopenharmony_ci        const duplicateObj = groups.find((group) => group.func_name === property.func_name);
274fb726d48Sopenharmony_ci        if (duplicateObj) {
275fb726d48Sopenharmony_ci          // @ts-ignore
276fb726d48Sopenharmony_ci          duplicateObj.begin = Math.min(duplicateObj.begin, property.begin);
277fb726d48Sopenharmony_ci          // @ts-ignore
278fb726d48Sopenharmony_ci          duplicateObj.end = Math.max(duplicateObj.end, property.end);
279fb726d48Sopenharmony_ci        } else {
280fb726d48Sopenharmony_ci          groups.push(property);
281fb726d48Sopenharmony_ci        }
282fb726d48Sopenharmony_ci      });
283fb726d48Sopenharmony_ci      result.push(groups);
284fb726d48Sopenharmony_ci    });
285fb726d48Sopenharmony_ci    return result;
286fb726d48Sopenharmony_ci  }
287fb726d48Sopenharmony_ci
288fb726d48Sopenharmony_ci  /**
289fb726d48Sopenharmony_ci   * 关系树赋值
290fb726d48Sopenharmony_ci   * @param relationData
291fb726d48Sopenharmony_ci   * @param propertyData
292fb726d48Sopenharmony_ci   */
293fb726d48Sopenharmony_ci  setRelationDataProperty(relationData: Array<unknown>, propertyData: Array<unknown>): Array<unknown> {
294fb726d48Sopenharmony_ci    const sampleProperty = relationData;
295fb726d48Sopenharmony_ci    //数组每一项进行比对
296fb726d48Sopenharmony_ci    propertyData.forEach((propertyGroup) => {
297fb726d48Sopenharmony_ci      // @ts-ignore
298fb726d48Sopenharmony_ci      propertyGroup.forEach((property: unknown) => {
299fb726d48Sopenharmony_ci        // @ts-ignore
300fb726d48Sopenharmony_ci        const relation = sampleProperty.find((relation) => relation.name === property.func_name);
301fb726d48Sopenharmony_ci        //property属性存储每帧数据
302fb726d48Sopenharmony_ci        // @ts-ignore
303fb726d48Sopenharmony_ci        relation?.property.push({
304fb726d48Sopenharmony_ci          // @ts-ignore
305fb726d48Sopenharmony_ci          name: property.func_name,
306fb726d48Sopenharmony_ci          // @ts-ignore
307fb726d48Sopenharmony_ci          detail: relation.detail,
308fb726d48Sopenharmony_ci          // @ts-ignore
309fb726d48Sopenharmony_ci          end: property.end,
310fb726d48Sopenharmony_ci          // @ts-ignore
311fb726d48Sopenharmony_ci          begin: property.begin,
312fb726d48Sopenharmony_ci          // @ts-ignore
313fb726d48Sopenharmony_ci          depth: relation.depth,
314fb726d48Sopenharmony_ci          // @ts-ignore
315fb726d48Sopenharmony_ci          instructions: property.instructions,
316fb726d48Sopenharmony_ci          // @ts-ignore
317fb726d48Sopenharmony_ci          cycles: property.cycles,
318fb726d48Sopenharmony_ci        });
319fb726d48Sopenharmony_ci      });
320fb726d48Sopenharmony_ci    });
321fb726d48Sopenharmony_ci
322fb726d48Sopenharmony_ci    //获取所有名字为unknown的数据
323fb726d48Sopenharmony_ci    // @ts-ignore
324fb726d48Sopenharmony_ci    const unknownRelation = sampleProperty.filter((relation) => relation.name.indexOf('unknown') > -1);
325fb726d48Sopenharmony_ci    //二维数组 用于存放unknown下所有子节点的数据
326fb726d48Sopenharmony_ci    let twoDimensionalArray: Array<unknown> = [];
327fb726d48Sopenharmony_ci    let result: Array<unknown> = [];
328fb726d48Sopenharmony_ci    unknownRelation.forEach((unknownItem) => {
329fb726d48Sopenharmony_ci      result = [];
330fb726d48Sopenharmony_ci      twoDimensionalArray = [];
331fb726d48Sopenharmony_ci      // @ts-ignore
332fb726d48Sopenharmony_ci      const children = unknownItem.children;
333fb726d48Sopenharmony_ci      //先获取到unknwon节点下每个子节点的property
334fb726d48Sopenharmony_ci      Object.keys(children).forEach((key) => {
335fb726d48Sopenharmony_ci        // @ts-ignore
336fb726d48Sopenharmony_ci        unknownItem.children[key] = sampleProperty.find((relation) => relation.name === key).property;
337fb726d48Sopenharmony_ci      });
338fb726d48Sopenharmony_ci      //将每个子节点的property加到二维数组中
339fb726d48Sopenharmony_ci      Object.values(children).forEach((value: unknown) => {
340fb726d48Sopenharmony_ci        // @ts-ignore
341fb726d48Sopenharmony_ci        if (value.length > 0) {
342fb726d48Sopenharmony_ci          twoDimensionalArray.push(value);
343fb726d48Sopenharmony_ci        }
344fb726d48Sopenharmony_ci      });
345fb726d48Sopenharmony_ci      if (twoDimensionalArray.length > 0) {
346fb726d48Sopenharmony_ci        //取每列的最大值和最小值
347fb726d48Sopenharmony_ci        // @ts-ignore
348fb726d48Sopenharmony_ci        for (let i = 0; i < twoDimensionalArray[0].length; i++) {
349fb726d48Sopenharmony_ci          const data = {
350fb726d48Sopenharmony_ci            // @ts-ignore
351fb726d48Sopenharmony_ci            name: unknownItem.name,
352fb726d48Sopenharmony_ci            // @ts-ignore
353fb726d48Sopenharmony_ci            detail: unknownItem.detail,
354fb726d48Sopenharmony_ci            // @ts-ignore
355fb726d48Sopenharmony_ci            begin: twoDimensionalArray[0][i].begin,
356fb726d48Sopenharmony_ci            end: 0,
357fb726d48Sopenharmony_ci            // @ts-ignore
358fb726d48Sopenharmony_ci            depth: unknownItem.depth,
359fb726d48Sopenharmony_ci          };
360fb726d48Sopenharmony_ci          for (let j = 0; j < twoDimensionalArray.length; j++) {
361fb726d48Sopenharmony_ci            // @ts-ignore
362fb726d48Sopenharmony_ci            data.end = Math.max(twoDimensionalArray[j][i].end, data.end);
363fb726d48Sopenharmony_ci            // @ts-ignore
364fb726d48Sopenharmony_ci            data.begin = Math.min(twoDimensionalArray[j][i].begin, data.begin);
365fb726d48Sopenharmony_ci          }
366fb726d48Sopenharmony_ci          result.push(data);
367fb726d48Sopenharmony_ci        }
368fb726d48Sopenharmony_ci        // @ts-ignore
369fb726d48Sopenharmony_ci        unknownItem.property = result;
370fb726d48Sopenharmony_ci      }
371fb726d48Sopenharmony_ci    });
372fb726d48Sopenharmony_ci    return sampleProperty;
373fb726d48Sopenharmony_ci  }
374fb726d48Sopenharmony_ci
375fb726d48Sopenharmony_ci  /**
376fb726d48Sopenharmony_ci   * 获取unknown节点下所有孩子节点的名称
377fb726d48Sopenharmony_ci   * @param node
378fb726d48Sopenharmony_ci   * @param names
379fb726d48Sopenharmony_ci   */
380fb726d48Sopenharmony_ci  getUnknownAllChildrenNames(node: unknown, names: unknown = {}): object {
381fb726d48Sopenharmony_ci    // @ts-ignore
382fb726d48Sopenharmony_ci    if (node.children) {
383fb726d48Sopenharmony_ci      // @ts-ignore
384fb726d48Sopenharmony_ci      node.children.forEach((child: unknown) => {
385fb726d48Sopenharmony_ci        // @ts-ignore
386fb726d48Sopenharmony_ci        if (child.function_name.indexOf('unknown') < 0) {
387fb726d48Sopenharmony_ci          // @ts-ignore
388fb726d48Sopenharmony_ci          names[child.function.name] = [];
389fb726d48Sopenharmony_ci        } else {
390fb726d48Sopenharmony_ci          this.getUnknownAllChildrenNames(child, names);
391fb726d48Sopenharmony_ci        }
392fb726d48Sopenharmony_ci      });
393fb726d48Sopenharmony_ci    }
394fb726d48Sopenharmony_ci    // @ts-ignore
395fb726d48Sopenharmony_ci    return names;
396fb726d48Sopenharmony_ci  }
397fb726d48Sopenharmony_ci}
398