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)]

50 lines (42 loc) 1.35 kB
import { composeParslet, type ParsletFunction } from './Parslet.js' import { Precedence } from '../Precedence.js' import { UnexpectedTypeError } from '../errors.js' export function createKeyValueParslet ({ allowOptional, allowVariadic, acceptParameterList }: { allowOptional: boolean allowVariadic: boolean, acceptParameterList?: boolean }): ParsletFunction { return composeParslet({ name: 'keyValueParslet', precedence: Precedence.KEY_VALUE, accept: type => type === ':', parseInfix: (parser, left) => { let optional = false let variadic = false if (allowOptional && left.type === 'JsdocTypeNullable') { optional = true left = left.element } if (allowVariadic && left.type === 'JsdocTypeVariadic' && left.element !== undefined) { variadic = true left = left.element } if (left.type !== 'JsdocTypeName') { if (acceptParameterList !== undefined && left.type === 'JsdocTypeParameterList') { parser.consume(':') return left } throw new UnexpectedTypeError(left) } parser.consume(':') const right = parser.parseType(Precedence.KEY_VALUE) return { type: 'JsdocTypeKeyValue', key: left.value, right, optional, variadic } } }) }