import type { KeyValueResult, NonRootResult } from '../result/NonRootResult.js' import type { FunctionResult, RootResult } from '../result/RootResult.js' export type TransformFunction = (parseResult: NonRootResult) => TransformResult export type TransformRule = (parseResult: InputType, transform: TransformFunction) => TransformResult export type TransformRules = { [P in NonRootResult as P['type']]: TransformRule } export function transform (rules: TransformRules, parseResult: NonRootResult): TransformResult { const rule = rules[parseResult.type] as TransformRule if (rule === undefined) { throw new Error(`In this set of transform rules exists no rule for type ${parseResult.type}.`) } return rule(parseResult, aParseResult => transform(rules, aParseResult)) } export function notAvailableTransform (parseResult: NonRootResult): TransformResult { throw new Error('This transform is not available. Are you trying the correct parsing mode?') } interface SpecialFunctionParams { params: Array this?: RootResult new?: RootResult } export function extractSpecialParams (source: FunctionResult): SpecialFunctionParams { const result: SpecialFunctionParams = { params: [] } for (const param of source.parameters) { if (param.type === 'JsdocTypeKeyValue') { if (param.key === 'this') { result.this = param.right } else if (param.key === 'new') { result.new = param.right } else { result.params.push(param) } } else { result.params.push(param) } } return result }