UNPKG

@appium/typedoc-plugin-appium

Version:

TypeDoc plugin for Appium & its extensions

89 lines (84 loc) 3.1 kB
import {Comment} from 'typedoc'; import {isDeclarationReflection, isReflectionType} from '../../guards'; import {CommentSource} from '../types'; import {CommentFinder} from './types'; const knownDeclarationRefComments: Map<string, Comment> = new Map(); /** * Array of strategies for finding comments. They can come from a variety of places depending on * where a variable is declared, if it overrides a method, if it implements a method in an * interface, etc. * * These have an order (of precedence), which is why this is an array. */ const MethodCommentFinders: Readonly<CommentFinder[]> = [ { /** * @returns The comment on the method itself */ getter({refl}) { return refl?.comment?.hasVisibleComponent() ? refl.comment : undefined; }, commentSource: CommentSource.Method, }, { /** * @returns The comment from the method's signature (may be inherited or from a `ReflectionType`'s declaration) */ getter: ({refl}) => { if (isDeclarationReflection(refl)) { let comment = refl.getAllSignatures().find((sig) => sig.comment?.summary)?.comment; if (comment) { return comment; } if (isReflectionType(refl.type)) { comment = refl.type.declaration .getAllSignatures() .find((sig) => sig.comment?.summary)?.comment; } return comment; } }, commentSource: CommentSource.MethodSignature, }, { /** * @returns The comment from some method that this one implements or overwrites or w/e; * typically coming from interfaces in `@appium/types` */ getter: ({refl, knownBuiltinMethods}) => { if (!refl) { return; } if (knownDeclarationRefComments.has(refl.name)) { return knownDeclarationRefComments.get(refl.name); } // if the `refl` is a known command, it should be in `knownMethods`; // if it isn't (or doesn't exist) we aren't going to display it anyway, so abort const otherRefl = refl && knownBuiltinMethods?.get(refl.name); if (!otherRefl) { return; } // if `otherRefl` exists, then the comment could live in several places, // which happen to be findable by the _other_ `CommentFinder`s. we avoid // `CommentSourceType.OtherMethod`, which corresponds to _this_ `CommentFinder` // to avoid recursion (for now). // // after looping thru the finders, if we have a comment in the list of `commentData` // objects, return the first one found. const comment = MethodCommentFinders.filter( ({commentSource}) => commentSource !== CommentSource.OtherMethod ) .map(({getter, commentSource}) => ({ comment: getter({refl: otherRefl, knownBuiltinMethods}), commentSource, })) .find(({comment}) => Boolean(comment))?.comment; if (comment) { knownDeclarationRefComments.set(refl.name, comment); } return comment; }, commentSource: CommentSource.OtherMethod, }, ]; export default MethodCommentFinders;