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