UNPKG

jsdoc-type-pratt-parser

Version:

[![Npm Package](https://badgen.net/npm/v/jsdoc-type-pratt-parser)](https://www.npmjs.com/package/jsdoc-type-pratt-parser) [![Test Status](https://github.com/jsdoc-type-pratt-parser/jsdoc-type-pratt-parser/actions/workflows/test.yml/badge.svg?branch=main)]

60 lines (50 loc) 1.8 kB
import { composeParslet } from './Parslet.js' import { Precedence } from '../Precedence.js' import { UnexpectedTypeError } from '../errors.js' import type { FunctionResult } from '../result/RootResult.js' import type { TypeParameterResult } from '../result/NonRootResult.js' export const genericArrowFunctionParslet = composeParslet({ name: 'genericArrowFunctionParslet', accept: type => type === '<', parsePrefix: (parser) => { const typeParameters: TypeParameterResult[] = [] parser.consume('<') do { let defaultValue = undefined let name = parser.parseIntermediateType(Precedence.SYMBOL) if (name.type === 'JsdocTypeOptional') { name = name.element defaultValue = parser.parseType(Precedence.SYMBOL) } if (name.type !== 'JsdocTypeName') { throw new UnexpectedTypeError(name) } let constraint = undefined if (parser.consume('extends')) { constraint = parser.parseType(Precedence.SYMBOL) // Got an equal sign if (constraint.type === 'JsdocTypeOptional') { constraint = constraint.element defaultValue = parser.parseType(Precedence.SYMBOL) } } const typeParameter: TypeParameterResult = { type: 'JsdocTypeTypeParameter', name } if (constraint !== undefined) { typeParameter.constraint = constraint } if (defaultValue !== undefined) { typeParameter.defaultValue = defaultValue } typeParameters.push(typeParameter) if (parser.consume('>')) { break } } while (parser.consume(',')) const functionBase = parser.parseIntermediateType(Precedence.SYMBOL) as FunctionResult functionBase.typeParameters = typeParameters return functionBase } })