• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16import ts from 'typescript';
17
18import { Comment } from '../../typedef/parser/Comment';
19import { StringConstant } from '../../utils/Constant';
20import {
21  ApiInfo,
22  ApiType,
23  BasicApiInfo,
24  ContainerApiInfo,
25  containerApiTypes,
26  ClassInfo,
27  ConstantInfo,
28  EnumInfo,
29  EnumValueInfo,
30  ExportDeclareInfo,
31  ExportDefaultInfo,
32  ExportImportValue,
33  ImportInfo,
34  InterfaceInfo,
35  MethodInfo,
36  MethodType,
37  ModifierProcessorInterface,
38  ModuleInfo,
39  NamespaceInfo,
40  NodeProcessorInterface,
41  ParamInfo,
42  PropertyInfo,
43  PropertyNode,
44  TypeAliasInfo,
45  TypeAliasType,
46} from '../../typedef/parser/ApiInfoDefination';
47import * as ResultsInfo from '../../typedef/parser/ResultsInfo';
48import { ApiInfosMap, BasicApiInfoMap, FileInfoMap, FilesMap } from './parser';
49
50/**
51 * 处理解析完节点数据的方法
52 */
53export class ResultsProcessHelper {
54  // 如果是字符串的话,会出现单双引号重复的情况
55  static regQuotation: RegExp = /^[\'|\"](.*)[\'|\"]$/;
56  /**
57   * 获取fileMap里的对应的apiinfos
58   *
59   * @param { FileInfoMap } fileMap 文件解析结果
60   * @param { string } apiKey 获取api名称
61   * @return {BasicApiInfo[]} apiInfo
62   */
63  static getApiInfosInFileMap(fileMap: FileInfoMap, apiKey: string): BasicApiInfo[] {
64    if (apiKey === StringConstant.SELF) {
65      return [];
66    }
67    const apiInfoMap: ApiInfosMap = fileMap.get(apiKey) as ApiInfosMap;
68    return apiInfoMap.get(StringConstant.SELF) as BasicApiInfo[];
69  }
70
71  /**
72   * 获取SourceFile节点下的第一层节点解析后的对象
73   *
74   * @param { FileInfoMap } fileMap 获取到的一个文件解析到的map对象
75   * @return {BasicApiInfo[]}  SourceFile节点下的第一层节点解析后的对象
76   */
77  static processFileApiMap(fileMap: FileInfoMap): BasicApiInfo[] {
78    const apis: BasicApiInfo[] = [];
79    for (const apiKey of fileMap.keys()) {
80      const apiInfos: BasicApiInfo[] = ResultsProcessHelper.getApiInfosInFileMap(fileMap, apiKey);
81      apiInfos.forEach((apiInfo: BasicApiInfo) => {
82        ResultsProcessHelper.processApiInfo(apiInfo);
83        apis.push(apiInfo);
84      });
85    }
86    return apis;
87  }
88
89  /**
90   * 将每一个节点解析后的对象的parentApi属性置为undefined,防止循环引用
91   *
92   * @param { BasicApiInfo } basicApiInfo 解析后的api对象
93   */
94  static processApiInfo(basicApiInfo: BasicApiInfo): void {
95    basicApiInfo.setParentApi(undefined);
96    basicApiInfo.removeNode();
97    ResultsProcessHelper.processJsDocInfos(basicApiInfo as ApiInfo);
98    if (!containerApiTypes.has(basicApiInfo.getApiType())) {
99      return;
100    }
101    const containerApiInfo: ContainerApiInfo = basicApiInfo as ContainerApiInfo;
102    containerApiInfo.getChildApis().forEach((childApiInfo: BasicApiInfo) => {
103      ResultsProcessHelper.processApiInfo(childApiInfo);
104    });
105  }
106
107  /**
108   * 判断jsdoc节点,去除tag数组
109   *
110   * @param {ApiInfo} apiInfo
111   * @return {void}
112   */
113  static processJsDocInfos(apiInfo: ApiInfo): void {
114    if (!(apiInfo instanceof ApiInfo)) {
115      return;
116    }
117    const jsDocInfos: Comment.JsDocInfo[] = apiInfo.getJsDocInfos();
118    jsDocInfos.forEach((jsDocInfo: Comment.JsDocInfo) => {
119      jsDocInfo.removeTags();
120    });
121  }
122
123  /**
124   * 解析整个文件所有api
125   *
126   * @param {FileInfoMap} fileMap 文件对象
127   * @return {BasicApiInfo[]} 整个文件的所有api
128   */
129  static processFileApiMapForGetBasicApi(fileMap: FileInfoMap): BasicApiInfo[] {
130    let apis: BasicApiInfo[] = [];
131    for (const apiKey of fileMap.keys()) {
132      const apiInfos: BasicApiInfo[] = ResultsProcessHelper.getApiInfosInFileMap(fileMap, apiKey);
133      apiInfos.forEach((apiInfo: BasicApiInfo) => {
134        apis = apis.concat(ResultsProcessHelper.processApiInfoForGetBasicApi(apiInfo));
135      });
136    }
137    return apis;
138  }
139
140  /**
141   * 获取一个api的所有子节点,例如NamespaceInfo | ClassInfo | InterfaceInfo | EnumInfo | ModuleInfo | StructInfo
142   *
143   * @param { BasicApiInfo } basicApiInfo 解析后的api对象
144   * @return { BasicApiInfo[] } 递归获取有子节点的api的所有api
145   */
146  static processApiInfoForGetBasicApi(basicApiInfo: BasicApiInfo): BasicApiInfo[] {
147    let apis: BasicApiInfo[] = [];
148    apis = apis.concat(basicApiInfo);
149    if (!containerApiTypes.has(basicApiInfo.getApiType())) {
150      return apis;
151    }
152    const containerApiInfo: ContainerApiInfo = basicApiInfo as ContainerApiInfo;
153    containerApiInfo.getChildApis().forEach((childApiInfo: BasicApiInfo) => {
154      apis = apis.concat(ResultsProcessHelper.processApiInfoForGetBasicApi(childApiInfo));
155    });
156    return apis;
157  }
158  /**
159   * 获取SourceFile节点下的第一层节点解析后的对象,需要将JsDoc按照since的版本进行拆分
160   * 1、子节点的since必须大于等于父节点的since,小于的进行剔除
161   * 2、一个节点出现多段JsDoc时,将会拆分成多个节点,每个节点包含对应版本的子节点
162   * 3、JsDoc中since默认为-1,可以存在一段没有since的JsDoc
163   * 3、当节点没有JsDoc时设置since默认为-1,其他信息默认
164   *
165   * @param { FileInfoMap } fileMap
166   * @return  { Array<Comment.jsDocEachSince> }
167   */
168  static processFileApiMapForEachSince(fileMap: FileInfoMap): Array<ResultsInfo.BasicApiInfo> {
169    const apis: ResultsInfo.BasicApiInfo[] = [];
170    for (const apiKey of fileMap.keys()) {
171      const apiInfos: BasicApiInfo[] = ResultsProcessHelper.getApiInfosInFileMap(fileMap, apiKey);
172      apiInfos.forEach((apiInfo: BasicApiInfo) => {
173        const api: ResultsInfo.BasicApiInfo[] = ResultsProcessHelper.processApiInfoForEachSince(apiInfo);
174        if (api.length === 0) {
175          return;
176        }
177        apis.push(...api);
178      });
179    }
180    return apis;
181  }
182
183  /**
184   * 获取到文件下每个节点的数据,解析jsdoc中的since信息,根据规则提取出对应数组
185   *
186   * @param {BasicApiInfo} basicApiInfo 一级节点信息
187   * @return {ResultsInfo.BasicApiInfo[]}
188   */
189  static processApiInfoForEachSince(basicApiInfo: BasicApiInfo): ResultsInfo.BasicApiInfo[] {
190    const resultApis: ResultsInfo.BasicApiInfo[] = ResultsProcessHelper.getNodeInfo(basicApiInfo);
191    if (!containerApiTypes.has(basicApiInfo.getApiType())) {
192      return resultApis;
193    }
194    const containerApiInfo: ContainerApiInfo = basicApiInfo as ContainerApiInfo;
195    containerApiInfo.getChildApis().forEach((childApiInfo: BasicApiInfo) => {
196      const childApis: ResultsInfo.BasicApiInfo[] = ResultsProcessHelper.processApiInfoForEachSince(childApiInfo);
197      ResultsProcessHelper.mergeResultApis(resultApis, childApis);
198    });
199    return resultApis;
200  }
201
202  /**
203   * 根据父节点和子节点,将子节点中满足父节点的版本要求的数据填充到父节点
204   *
205   * @param {ResultsInfo.BasicApiInfo[]} parentApis 父节点信息,根据jsdoc分段
206   * @param {ResultsInfo.BasicApiInfo[]} childApis 子节点信息,根据jsdoc分段
207   */
208  static mergeResultApis(parentApis: ResultsInfo.BasicApiInfo[], childApis: ResultsInfo.BasicApiInfo[]): void {
209    parentApis.forEach((parentApi: ResultsInfo.BasicApiInfo) => {
210      const containerApiInfo: ResultsInfo.NamespaceEnumInfo = parentApi as ResultsInfo.NamespaceEnumInfo;
211      const cApis: ResultsInfo.BasicApiInfo[] = ResultsProcessHelper.getResultApisVersion(
212        childApis,
213        Number(containerApiInfo.getSince())
214      );
215      containerApiInfo.addChildApi(cApis);
216    });
217  }
218
219  /**
220   * 在多段jsdoc数据中提取符合版本的数据
221   *
222   * @param {ResultsInfo.BasicApiInfo[]} resultApis
223   * @param {number} version
224   * @return {ResultsInfo.BasicApiInfo[]}
225   */
226  static getResultApisVersion(resultApis: ResultsInfo.BasicApiInfo[], version: number): ResultsInfo.BasicApiInfo[] {
227    return resultApis.filter((resultApi: ResultsInfo.BasicApiInfo) => {
228      const apiInfo: ResultsInfo.ApiInfo = resultApi as ResultsInfo.ApiInfo;
229      const since: number = Number(apiInfo.getSince());
230      return since === -1 || since >= version;
231    });
232  }
233
234  /**
235   * 按节点的类型分类处理,拆分多段jsdoc
236   *
237   * @param {BasicApiInfo} apiInfo 节点信息
238   * @return {ResultsInfo.BasicApiInfo[]}
239   */
240  static getNodeInfo(apiInfo: BasicApiInfo): ResultsInfo.BasicApiInfo[] {
241    let apiType: string = apiInfo.getApiType();
242    const nodeProcessor: ResultsInfo.NodeProcessorInterface | undefined = resultsProcessMethod.get(apiType);
243    if (!nodeProcessor) {
244      return [];
245    }
246    const newApiInfos: ResultsInfo.BasicApiInfo[] = nodeProcessor(apiInfo);
247    return newApiInfos;
248  }
249
250  static processProperty(apiInfo: BasicApiInfo): ResultsInfo.BasicApiInfo[] {
251    const infos: ResultsInfo.PropertyInfo[] = [];
252    const propertyInfo: PropertyInfo = apiInfo as PropertyInfo;
253    const jsDocInfos: Comment.JsDocInfo[] = propertyInfo.getJsDocInfos();
254    if (jsDocInfos.length === 0) {
255      const newInfo: ResultsInfo.PropertyInfo = new ResultsInfo.PropertyInfo(
256        apiInfo.getApiType(),
257        new Comment.JsDocInfo()
258      );
259      newInfo.setType(propertyInfo.getType().join(' | '));
260      newInfo.setName(apiInfo.getApiName());
261      newInfo.setIsRequired(propertyInfo.getIsRequired());
262      newInfo.setIsReadOnly(propertyInfo.getIsReadOnly());
263      newInfo.setIsStatic(propertyInfo.getIsStatic());
264      infos.push(newInfo);
265    }
266    jsDocInfos.forEach((jsDocInfo: Comment.JsDocInfo) => {
267      const newInfo: ResultsInfo.PropertyInfo = new ResultsInfo.PropertyInfo(apiInfo.getApiType(), jsDocInfo);
268      const typeInfo: string = jsDocInfo.getTypeInfo();
269      const isRequired: boolean = !/\?/.test(typeInfo);
270      newInfo.setType(typeInfo ? typeInfo.replace(/^[\?]*[\(](.*)[\)]$/, '$1') : propertyInfo.getType().join(' | '));
271      newInfo.setName(apiInfo.getApiName());
272      newInfo.setIsRequired(isRequired ? true : propertyInfo.getIsRequired());
273      newInfo.setIsReadOnly(propertyInfo.getIsReadOnly());
274      newInfo.setIsStatic(propertyInfo.getIsStatic());
275      infos.push(newInfo);
276    });
277    return infos;
278  }
279
280  static processClass(apiInfo: BasicApiInfo): ResultsInfo.BasicApiInfo[] {
281    const infos: ResultsInfo.ClassInterfaceInfo[] = [];
282    const classInfo: ClassInfo = apiInfo as ClassInfo;
283    const jsDocInfos: Comment.JsDocInfo[] = classInfo.getJsDocInfos();
284    if (jsDocInfos.length === 0) {
285      const newInfo: ResultsInfo.ClassInterfaceInfo = new ResultsInfo.ClassInterfaceInfo(
286        apiInfo.getApiType(),
287        new Comment.JsDocInfo()
288      );
289      newInfo.setName(apiInfo.getApiName());
290      newInfo.setParentClasses(classInfo.getParentClasses());
291      infos.push(newInfo);
292    }
293    jsDocInfos.forEach((jsDocInfo: Comment.JsDocInfo) => {
294      const newInfo: ResultsInfo.ClassInterfaceInfo = new ResultsInfo.ClassInterfaceInfo(
295        apiInfo.getApiType(),
296        jsDocInfo
297      );
298      newInfo.setName(apiInfo.getApiName());
299      newInfo.setParentClasses(classInfo.getParentClasses());
300      infos.push(newInfo);
301    });
302    return infos;
303  }
304
305  static processInterface(apiInfo: BasicApiInfo): ResultsInfo.BasicApiInfo[] {
306    const infos: ResultsInfo.ClassInterfaceInfo[] = [];
307    const interfaceInfo: InterfaceInfo = apiInfo as InterfaceInfo;
308    const jsDocInfos: Comment.JsDocInfo[] = interfaceInfo.getJsDocInfos();
309    if (jsDocInfos.length === 0) {
310      const newInfo: ResultsInfo.ClassInterfaceInfo = new ResultsInfo.ClassInterfaceInfo(
311        apiInfo.getApiType(),
312        new Comment.JsDocInfo()
313      );
314      newInfo.setName(apiInfo.getApiName());
315      newInfo.setParentClasses(interfaceInfo.getParentClasses());
316      infos.push(newInfo);
317    }
318    jsDocInfos.forEach((jsDocInfo: Comment.JsDocInfo) => {
319      const newInfo: ResultsInfo.ClassInterfaceInfo = new ResultsInfo.ClassInterfaceInfo(
320        apiInfo.getApiType(),
321        jsDocInfo
322      );
323      newInfo.setName(apiInfo.getApiName());
324      newInfo.setParentClasses(interfaceInfo.getParentClasses());
325      infos.push(newInfo);
326    });
327    return infos;
328  }
329
330  static processNamespace(apiInfo: BasicApiInfo): ResultsInfo.BasicApiInfo[] {
331    const infos: ResultsInfo.NamespaceEnumInfo[] = [];
332    const interfaceInfo: NamespaceInfo = apiInfo as NamespaceInfo;
333    const jsDocInfos: Comment.JsDocInfo[] = interfaceInfo.getJsDocInfos();
334    if (jsDocInfos.length === 0) {
335      const newInfo: ResultsInfo.NamespaceEnumInfo = new ResultsInfo.NamespaceEnumInfo(
336        apiInfo.getApiType(),
337        new Comment.JsDocInfo()
338      );
339      newInfo.setName(apiInfo.getApiName());
340      infos.push(newInfo);
341    }
342    jsDocInfos.forEach((jsDocInfo: Comment.JsDocInfo) => {
343      const newInfo: ResultsInfo.NamespaceEnumInfo = new ResultsInfo.NamespaceEnumInfo(apiInfo.getApiType(), jsDocInfo);
344      newInfo.setName(apiInfo.getApiName());
345      infos.push(newInfo);
346    });
347    return infos;
348  }
349
350  static processMethod(apiInfo: BasicApiInfo): ResultsInfo.BasicApiInfo[] {
351    const infos: ResultsInfo.MethodInfo[] = [];
352    const methodInfo: MethodInfo = apiInfo as MethodInfo;
353    const jsDocInfos: Comment.JsDocInfo[] = methodInfo.getJsDocInfos();
354    if (jsDocInfos.length === 0) {
355      const newInfo: ResultsInfo.MethodInfo = new ResultsInfo.MethodInfo(apiInfo.getApiType(), new Comment.JsDocInfo());
356      newInfo.setName(apiInfo.getApiName());
357      newInfo.setCallForm(methodInfo.getCallForm());
358      newInfo.setReturnValue(methodInfo.getReturnValue().join(' | '));
359      methodInfo.getParams().forEach((param: ParamInfo) => {
360        const newParam: ResultsInfo.ParamInfo = new ResultsInfo.ParamInfo(param.getApiType(), new Comment.JsDocInfo());
361        newParam.setName(param.getApiName());
362        newParam.setType(param.getType().join(' | '));
363        newParam.setIsRequired(param.getIsRequired());
364        newInfo.addParam(newParam);
365      });
366      newInfo.setIsStatic(methodInfo.getIsStatic());
367      infos.push(newInfo);
368    }
369    jsDocInfos.forEach((jsDocInfo: Comment.JsDocInfo) => {
370      const newInfo: ResultsInfo.MethodInfo = new ResultsInfo.MethodInfo(apiInfo.getApiType(), jsDocInfo);
371      newInfo.setName(apiInfo.getApiName());
372      newInfo.setCallForm(methodInfo.getCallForm());
373      newInfo.setReturnValue(methodInfo.getReturnValue().join(' | '));
374      methodInfo.getParams().forEach((param: ParamInfo) => {
375        const newParam: ResultsInfo.ParamInfo = new ResultsInfo.ParamInfo(param.getApiType(), new Comment.JsDocInfo());
376        newParam.setName(param.getApiName());
377        newParam.setType(param.getType().join(' | '));
378        newParam.setIsRequired(param.getIsRequired());
379        newInfo.addParam(newParam);
380      });
381      newInfo.setIsStatic(methodInfo.getIsStatic());
382      infos.push(newInfo);
383    });
384    return infos;
385  }
386
387  static processExportDefault(apiInfo: BasicApiInfo): ResultsInfo.BasicApiInfo[] {
388    const infos: ResultsInfo.ExportDefaultInfo[] = [];
389    const newInfo: ResultsInfo.ExportDefaultInfo = new ResultsInfo.ExportDefaultInfo(apiInfo.getApiType());
390    newInfo.setName(apiInfo.getApiName());
391    infos.push(newInfo);
392    return infos;
393  }
394
395  static processImportInfo(apiInfo: BasicApiInfo): ResultsInfo.BasicApiInfo[] {
396    const infos: ResultsInfo.ImportInfo[] = [];
397    const importInfo: ImportInfo = apiInfo as ImportInfo;
398    const newInfo: ResultsInfo.ImportInfo = new ResultsInfo.ImportInfo(apiInfo.getApiType());
399    importInfo.getImportValues().forEach((importValue: ExportImportValue) => {
400      newInfo.addImportValue(importValue.key, importValue.value);
401    });
402    infos.push(newInfo);
403    return infos;
404  }
405
406  static processConstant(apiInfo: BasicApiInfo): ResultsInfo.BasicApiInfo[] {
407    const infos: ResultsInfo.ConstantInfo[] = [];
408    const constantInfo: ConstantInfo = apiInfo as ConstantInfo;
409    const jsDocInfos: Comment.JsDocInfo[] = constantInfo.getJsDocInfos();
410    if (jsDocInfos.length === 0) {
411      const newInfo: ResultsInfo.ConstantInfo = new ResultsInfo.ConstantInfo(
412        apiInfo.getApiType(),
413        new Comment.JsDocInfo()
414      );
415      newInfo.setName(apiInfo.getApiName());
416      const value: string = constantInfo.getValue();
417      newInfo.setValue(value.replace(ResultsProcessHelper.regQuotation, '$1'));
418      newInfo.setType(isNaN(Number(value)) ? 'string' : 'number');
419      const declarationNode: ts.VariableDeclaration = constantInfo.getNode() as ts.VariableDeclaration;
420      if (declarationNode.initializer) {
421        const typeOfLiteral: string | undefined = typeMap.get(declarationNode.initializer.kind);
422        newInfo.setType(typeOfLiteral ? typeOfLiteral : '');
423      }
424      infos.push(newInfo);
425    }
426    jsDocInfos.forEach((jsDocInfo: Comment.JsDocInfo) => {
427      const newInfo: ResultsInfo.ConstantInfo = new ResultsInfo.ConstantInfo(apiInfo.getApiType(), jsDocInfo);
428      newInfo.setName(apiInfo.getApiName());
429      const value: string = constantInfo.getValue();
430      newInfo.setValue(value.replace(ResultsProcessHelper.regQuotation, '$1'));
431      newInfo.setType(isNaN(Number(value)) ? 'string' : 'number');
432      const declarationNode: ts.VariableDeclaration = constantInfo.getNode() as ts.VariableDeclaration;
433      if (declarationNode.initializer) {
434        const typeOfLiteral: string | undefined = typeMap.get(declarationNode.initializer.kind);
435        newInfo.setType(typeOfLiteral ? typeOfLiteral : '');
436      }
437      infos.push(newInfo);
438    });
439    return infos;
440  }
441
442  static processDeclareConstant(apiInfo: BasicApiInfo): ResultsInfo.BasicApiInfo[] {
443    const infos: ResultsInfo.DeclareConstInfo[] = [];
444    const constantInfo: ConstantInfo = apiInfo as ConstantInfo;
445    const jsDocInfos: Comment.JsDocInfo[] = constantInfo.getJsDocInfos();
446    if (jsDocInfos.length === 0) {
447      const newInfo: ResultsInfo.DeclareConstInfo = new ResultsInfo.DeclareConstInfo(
448        apiInfo.getApiType(),
449        new Comment.JsDocInfo()
450      );
451      newInfo.setName(apiInfo.getApiName());
452      newInfo.setType(constantInfo.getValue());
453      const declarationNode: ts.VariableDeclaration = constantInfo.getNode() as ts.VariableDeclaration;
454      if (declarationNode.initializer) {
455        const typeOfLiteral: string | undefined = typeMap.get(declarationNode.initializer.kind);
456        newInfo.setType(typeOfLiteral ? typeOfLiteral : '');
457      }
458      infos.push(newInfo);
459    }
460    jsDocInfos.forEach((jsDocInfo: Comment.JsDocInfo) => {
461      const newInfo: ResultsInfo.DeclareConstInfo = new ResultsInfo.DeclareConstInfo(apiInfo.getApiType(), jsDocInfo);
462      newInfo.setName(apiInfo.getApiName());
463      newInfo.setType(constantInfo.getValue());
464      const declarationNode: ts.VariableDeclaration = constantInfo.getNode() as ts.VariableDeclaration;
465      if (declarationNode.initializer) {
466        const typeOfLiteral: string | undefined = typeMap.get(declarationNode.initializer.kind);
467        newInfo.setType(typeOfLiteral ? typeOfLiteral : '');
468      }
469      infos.push(newInfo);
470    });
471    return infos;
472  }
473
474  static processEnum(apiInfo: BasicApiInfo): ResultsInfo.BasicApiInfo[] {
475    const infos: ResultsInfo.NamespaceEnumInfo[] = [];
476    const enumInfo: EnumInfo = apiInfo as EnumInfo;
477    const jsDocInfos: Comment.JsDocInfo[] = enumInfo.getJsDocInfos();
478    if (jsDocInfos.length === 0) {
479      const newInfo: ResultsInfo.NamespaceEnumInfo = new ResultsInfo.NamespaceEnumInfo(
480        apiInfo.getApiType(),
481        new Comment.JsDocInfo()
482      );
483      newInfo.setName(apiInfo.getApiName());
484      infos.push(newInfo);
485    }
486    jsDocInfos.forEach((jsDocInfo: Comment.JsDocInfo) => {
487      const newInfo: ResultsInfo.NamespaceEnumInfo = new ResultsInfo.NamespaceEnumInfo(apiInfo.getApiType(), jsDocInfo);
488      newInfo.setName(apiInfo.getApiName());
489      infos.push(newInfo);
490    });
491    return infos;
492  }
493
494  static processEnumMember(apiInfo: BasicApiInfo): ResultsInfo.BasicApiInfo[] {
495    const infos: ResultsInfo.EnumValueInfo[] = [];
496    const enumValueInfo: EnumValueInfo = apiInfo as EnumValueInfo;
497    const jsDocInfos: Comment.JsDocInfo[] = enumValueInfo.getJsDocInfos();
498    if (jsDocInfos.length === 0) {
499      const newInfo: ResultsInfo.EnumValueInfo = new ResultsInfo.EnumValueInfo(
500        apiInfo.getApiType(),
501        new Comment.JsDocInfo()
502      );
503      newInfo.setName(apiInfo.getApiName());
504      newInfo.setValue(enumValueInfo.getValue());
505      infos.push(newInfo);
506    }
507    jsDocInfos.forEach((jsDocInfo: Comment.JsDocInfo) => {
508      const newInfo: ResultsInfo.EnumValueInfo = new ResultsInfo.EnumValueInfo(apiInfo.getApiType(), jsDocInfo);
509      newInfo.setName(apiInfo.getApiName());
510      newInfo.setValue(enumValueInfo.getValue());
511      infos.push(newInfo);
512    });
513    return infos;
514  }
515
516  static processTypeAlias(apiInfo: BasicApiInfo): ResultsInfo.BasicApiInfo[] {
517    const infos: ResultsInfo.BasicApiInfo[] = [];
518    const typeAliasInfo: TypeAliasInfo = apiInfo as TypeAliasInfo;
519    const jsDocInfos: Comment.JsDocInfo[] = typeAliasInfo.getJsDocInfos();
520    if (jsDocInfos.length === 0) {
521      const newInfo: ResultsInfo.BasicApiInfo = ResultsProcessHelper.processTypeAliasGetNewInfo(
522        typeAliasInfo,
523        new Comment.JsDocInfo()
524      );
525      infos.push(newInfo);
526    }
527    jsDocInfos.forEach((jsDocInfo: Comment.JsDocInfo) => {
528      const newInfo: ResultsInfo.BasicApiInfo = ResultsProcessHelper.processTypeAliasGetNewInfo(
529        typeAliasInfo,
530        jsDocInfo
531      );
532      infos.push(newInfo);
533    });
534    return infos;
535  }
536  static processTypeAliasGetNewInfo(
537    typeAliasInfo: TypeAliasInfo,
538    jsDocInfo: Comment.JsDocInfo
539  ): ResultsInfo.BasicApiInfo {
540    if (typeAliasInfo.getTypeName() === TypeAliasType.UNION_TYPE) {
541      const newInfo: ResultsInfo.UnionTypeInfo = new ResultsInfo.UnionTypeInfo(typeAliasInfo.getTypeName(), jsDocInfo);
542      newInfo.setName(typeAliasInfo.getApiName());
543      newInfo.addValueRanges(
544        typeAliasInfo.getType().map((type: string) => {
545          return type.replace(ResultsProcessHelper.regQuotation, '$1');
546        })
547      );
548      return newInfo;
549    }
550    const newInfo: ResultsInfo.TypeAliasInfo = new ResultsInfo.TypeAliasInfo(typeAliasInfo.getApiType(), jsDocInfo);
551    newInfo.setName(typeAliasInfo.getApiName());
552    newInfo.setType(typeAliasInfo.getType().join(' | '));
553    return newInfo;
554  }
555}
556
557const typeMap: Map<ts.SyntaxKind, string> = new Map([
558  [ts.SyntaxKind.StringLiteral, 'string'],
559  [ts.SyntaxKind.NumericLiteral, 'number'],
560]);
561
562/**
563 * api节点类型对应的处理方法,获取diff信息
564 */
565export const resultsProcessMethod: Map<string, ResultsInfo.NodeProcessorInterface> = new Map([
566  [ApiType.PROPERTY, ResultsProcessHelper.processProperty],
567  [ApiType.CLASS, ResultsProcessHelper.processClass],
568  [ApiType.INTERFACE, ResultsProcessHelper.processInterface],
569  [ApiType.NAMESPACE, ResultsProcessHelper.processNamespace],
570  [ApiType.METHOD, ResultsProcessHelper.processMethod],
571  // [ApiType.PARAM, ResultsProcessHelper.processParam],
572  // [ApiType.MODULE, ResultsProcessHelper.processModule],
573  // [ApiType.EXPORT, ResultsProcessHelper.processExport],
574  [ApiType.EXPORT_DEFAULT, ResultsProcessHelper.processExportDefault],
575  [ApiType.IMPORT, ResultsProcessHelper.processImportInfo],
576  [ApiType.CONSTANT, ResultsProcessHelper.processConstant],
577  [ApiType.DECLARE_CONST, ResultsProcessHelper.processDeclareConstant],
578  [ApiType.ENUM, ResultsProcessHelper.processEnum],
579  [ApiType.ENUM_VALUE, ResultsProcessHelper.processEnumMember],
580  [ApiType.TYPE_ALIAS, ResultsProcessHelper.processTypeAlias],
581]);
582