UNPKG

xdoc-parser

Version:
1,551 lines (1,484 loc) 106 kB
import * as chai from 'chai'; import XDocASTVisitor from "../src/XDocASTVisitor"; import XDocASTGenerator from '../src/XDocASTGenerator'; import { createDocumentationNode, createTagNode, createTagNameNode, createIdentifierNode, createBodyNode, TagNode, DocumentationNode, createDescriptionNode, createTagIdentifierNode, createTypeNode, createPrimaryTypeNode, createUnionTypeNode, createIntersectTypeNode, createLambdaTypeNode, createParameterNode, createFormalParemeterSequenceNode, createTupleTypeNode, createParenthesizedTypeNode, createUnaryTypeNode, createPropertyIdentifierNode, createObjectTypeNode, createObjectPairTypeNode, createArrayTypeNode, createExpressionNode, createLiteralExpressionNode, createUnaryExpressionNode, createBinaryExpressionNode, createArrayExpressionNode, createObjectExpressionNode, createObjectPairExpressionNode, createLambdaExpressionNode, createParenthesizedExpressioneNode, createInlineTagNode, createTupleExtendedTypeNode } from '../src/XDocASTNode'; import * as FS from 'fs'; import { DocumentationContext } from '../src/XDocSyntaxParser'; import { type } from 'os'; /* Helpers */ const equal = chai.assert.deepEqual; const generate = (source) => new XDocASTGenerator(source).generate(); const parse = (source: string) => new XDocASTVisitor(generate(source)).visit(); const documentation = (annotations: TagNode[]): Partial<DocumentationNode> => createDocumentationNode( createBodyNode( annotations ) ) // console.log(JSON.stringify(parse(`@tag id: (type & type) | type - Description`), null, 2)); describe('XDoc Syntax Parser (Tom)', () => { describe('parse simple annotations', () => { it('should parse @tag', () => equal( parse('@tag'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), null, null, null, null )]) )); it('should parse @tag - description', () => equal( parse('@tag - description'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), null, null, null, createDescriptionNode('description', []) )]) )); it('should parse @tag id', () => equal( parse('@tag id'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), null, null, null )]) )); it('should parse @tag id - description', () => equal( parse('@tag id - description'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), null, null, createDescriptionNode('description') )]) )); }); describe('parse complex annotations (the ones JSDoc can\'t do)', () => { describe('parse typed annotations', () => { /* * ==================== * Parse primary type * ==================== */ describe('parse primary type', () => { it('should parse @tag id: type', () => equal( parse('@tag id: type'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ), null, null )]) )); it('should parse @tag id: type - description', () => equal( parse('@tag id: type - description'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ), null, createDescriptionNode('description') )]) )); it('should parse @tag id?: type', () => equal( parse('@tag id?: type'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id', true), ), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ), null, null )]) )); it('should parse @tag id?: type - description', () => equal( parse('@tag id?: type - description'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id', true), ), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ), null, createDescriptionNode('description') )]) )); it('should parse @tag id: type.type.type', () => equal( parse('@tag id: type.type.type'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createPrimaryTypeNode( createPropertyIdentifierNode([ createIdentifierNode('type'), createIdentifierNode('type'), createIdentifierNode('type') ], 'type.type.type') ) ), null, null )]) )); it('should parse @tag id: type.type.type - description', () => equal( parse('@tag id: type.type.type - description'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createPrimaryTypeNode( createPropertyIdentifierNode([ createIdentifierNode('type'), createIdentifierNode('type'), createIdentifierNode('type') ], 'type.type.type') ) ), null, createDescriptionNode('description') )]) )); }); /* * ==================== * Parse union type * ==================== */ describe('parse union type', () => { it('should parse @tag id: type & type', () => equal( parse('@tag id: type & type'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createUnionTypeNode( createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ) ), null, null )]) )); it('should parse @tag id: type & type - description', () => equal( parse('@tag id: type & type - description'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createUnionTypeNode( createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ) ), null, createDescriptionNode('description') )]) )); }) /* * ==================== * Parse intersection type * ==================== */ describe('parse intersection type', () => { it('should parse @tag id: type | type', () => equal( parse('@tag id: type | type'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createIntersectTypeNode( createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ) ), null, null )]) )); it('should parse @tag id: type | type - description', () => equal( parse('@tag id: type | type - description'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createIntersectTypeNode( createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ) ), null, createDescriptionNode('description') )]) )); }) /* * ==================== * Parse lambda type * ==================== */ describe('parse lambda type', () => { it('should parse @tag id: () => type', () => equal( parse('@tag id: () => type'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createLambdaTypeNode( null, createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ) ), null, null )]) )); it('should parse @tag id: () => type - description', () => equal( parse('@tag id: () => type - description'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createLambdaTypeNode( null, createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ) ), null, createDescriptionNode('description') )]) )); it('should parse @tag id: () => type[]', () => equal( parse('@tag id: () => type[]'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createLambdaTypeNode( null, createTypeNode( createArrayTypeNode( createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ), null ) ) ) ), null, null )]) )); it('should parse @tag id: () => type[] - description', () => equal( parse('@tag id: () => type[] - description'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createLambdaTypeNode( null, createTypeNode( createArrayTypeNode( createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ), null ) ) ) ), null, createDescriptionNode('description') )]) )); it('should parse @tag id: (id) => type', () => equal( parse('@tag id: (id) => type'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createLambdaTypeNode( createFormalParemeterSequenceNode([ createParameterNode( createIdentifierNode('id'), null ) ]), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ) ), null, null )]) )); it('should parse @tag id: (id) => type - description', () => equal( parse('@tag id: (id) => type - description'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createLambdaTypeNode( createFormalParemeterSequenceNode([ createParameterNode( createIdentifierNode('id'), null ) ]), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ) ), null, createDescriptionNode('description') )]) )); it('should parse @tag id: (id, id) => type', () => equal( parse('@tag id: (id, id) => type'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createLambdaTypeNode( createFormalParemeterSequenceNode([ createParameterNode( createIdentifierNode('id'), null ), createParameterNode( createIdentifierNode('id'), null ) ]), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ) ), null, null )]) )); it('should parse @tag id: (id, id) => type - description', () => equal( parse('@tag id: (id, id) => type - description'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createLambdaTypeNode( createFormalParemeterSequenceNode([ createParameterNode( createIdentifierNode('id'), null ), createParameterNode( createIdentifierNode('id'), null ) ]), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ) ), null, createDescriptionNode('description') )]) )); it('should parse @tag id: (id, id) => type', () => equal( parse('@tag id: (id, id) => type'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createLambdaTypeNode( createFormalParemeterSequenceNode([ createParameterNode( createIdentifierNode('id'), null ), createParameterNode( createIdentifierNode('id'), null ) ]), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ) ), null, null )]) )); it('should parse @tag id: (id: type, id: type) => type - description', () => equal( parse('@tag id: (id: type, id: type) => type - description'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createLambdaTypeNode( createFormalParemeterSequenceNode([ createParameterNode( createIdentifierNode('id'), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ), createParameterNode( createIdentifierNode('id'), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ) ]), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ) ), null, createDescriptionNode('description') )]) )); it('should parse @tag id: (id: type, id: type) => type', () => equal( parse('@tag id: (id: type, id: type) => type'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createLambdaTypeNode( createFormalParemeterSequenceNode([ createParameterNode( createIdentifierNode('id'), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ), createParameterNode( createIdentifierNode('id'), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ) ]), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ) ), null, null )]) )); it('should parse @tag id: (id, id) => type - description', () => equal( parse('@tag id: (id, id) => type - description'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createLambdaTypeNode( createFormalParemeterSequenceNode([ createParameterNode( createIdentifierNode('id'), null ), createParameterNode( createIdentifierNode('id'), null ) ]), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ) ), null, createDescriptionNode('description') )]) )); }); // End parse lambda type /* * ==================== * Parse tuple type * ==================== */ describe('parse tuple type', () => { it('should parse @tag id: type<type>', () => equal( parse('@tag id: type<type>'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createTupleTypeNode( createIdentifierNode('type'), [ createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ] ) ), null, null )]) )); it('should parse @tag id: type<type> - description', () => equal( parse('@tag id: type<type> - description'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createTupleTypeNode( createIdentifierNode('type'), [ createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ] ) ), null, createDescriptionNode('description') )]) )); it('should parse @tag id: type<type, type>', () => equal( parse('@tag id: type<type, type>'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createTupleTypeNode( createIdentifierNode('type'), [ createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ] ) ), null, null )]) )); it('should parse @tag id: type<type, type> - description', () => equal( parse('@tag id: type<type, type> - description'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createTupleTypeNode( createIdentifierNode('type'), [ createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ] ) ), null, createDescriptionNode('description') )]) )); it('should parse @tag id: <type, type>', () => equal( parse('@tag id: <type, type>'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createTupleTypeNode( null, [ createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ] ) ), null, null )]) )); it('should parse @tag id: <type, type> - description', () => equal( parse('@tag id: <type, type> - description'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createTupleTypeNode( null, [ createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ] ) ), null, createDescriptionNode('description') )]) )); it('should parse @tag id: <type extends type, type>', () => equal( parse('@tag id: <type extends type, type>'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createTupleTypeNode( null, [ createTupleExtendedTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ), createPrimaryTypeNode( createIdentifierNode('type') ) ), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ] ) ), null, null )]) )); it('should parse @tag id: <type extends type, type> - description', () => equal( parse('@tag id: <type extends type, type> - description'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createTupleTypeNode( null, [ createTupleExtendedTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ), createPrimaryTypeNode( createIdentifierNode('type') ) ), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ] ) ), null, createDescriptionNode('description') )]) )); }) // End tuple type /* * ==================== * Parse parenthesized type * ==================== */ describe('parse parenthesized type', () => { it('should parse @tag id: (type)', () => equal( parse('@tag id: (type)'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createParenthesizedTypeNode( createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ) ), null, null )]) )); it('should parse @tag id: (type) - description', () => equal( parse('@tag id: (type) - description'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createParenthesizedTypeNode( createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ) ), null, createDescriptionNode('description') )]) )); }); // End parenthesized type /* * ==================== * Parse unary type * ==================== */ describe('parse unary type', () => { it('should parse @tag id: *type', () => equal( parse('@tag id: *type'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createUnaryTypeNode( '*', createPrimaryTypeNode( createIdentifierNode('type') ) ) ), null, null )]) )); it('should parse @tag id: *type - description', () => equal( parse('@tag id: *type - description'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createUnaryTypeNode( '*', createPrimaryTypeNode( createIdentifierNode('type') ) ) ), null, createDescriptionNode('description') )]) )); it('should parse @tag id: &type', () => equal( parse('@tag id: &type'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createUnaryTypeNode( '&', createPrimaryTypeNode( createIdentifierNode('type') ) ) ), null, null )]) )); it('should parse @tag id: &type - description', () => equal( parse('@tag id: &type - description'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createUnaryTypeNode( '&', createPrimaryTypeNode( createIdentifierNode('type') ) ) ), null, createDescriptionNode('description') )]) )); }); // End unary type /* * ==================== * Parse object type * ==================== */ describe('parse object type', () => { it('should parse @tag id: {}', () => equal( parse('@tag id: {}'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createObjectTypeNode() ), null, null )]) )); it('should parse @tag id: {} - description', () => equal( parse('@tag id: {} - description'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createObjectTypeNode() ), null, createDescriptionNode('description') )]) )); it('should parse @tag id: { type : type }', () => equal( parse('@tag id: { type : type }'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createObjectTypeNode([ createObjectPairTypeNode( createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ) ]) ), null, null )]) )); it('should parse @tag id: { type : type } - description', () => equal( parse('@tag id: { type : type } - description'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createObjectTypeNode([ createObjectPairTypeNode( createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ) ]) ), null, createDescriptionNode('description') )]) )); it('should parse @tag id: { type: { type: type } }', () => equal( parse('@tag id: { type: { type: type } }'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createObjectTypeNode([ createObjectPairTypeNode( createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ), createTypeNode( createObjectTypeNode([ createObjectPairTypeNode( createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ) ]) ) ) ]) ), null, null )]) )); it('should parse @tag id: { type: { type: type } } - description', () => equal( parse('@tag id: { type : { type: type } } - description'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createObjectTypeNode([ createObjectPairTypeNode( createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ), createTypeNode( createObjectTypeNode([ createObjectPairTypeNode( createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ) ]) ) ) ]) ), null, createDescriptionNode('description') )]) )); }); // End object type /* * ==================== * Parse array type * ==================== */ describe('parse array type', () => { it('should parse @tag id: type[]', () => equal( parse('@tag id: type[]'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createArrayTypeNode( createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ), null ) ), null, null )]) )); it('should parse @tag id: type[] - description', () => equal( parse('@tag id: type[] - description'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createArrayTypeNode( createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ), null ) ), null, createDescriptionNode('description') )]) )); it('should parse @tag id: (type & type)[]', () => equal( parse('@tag id: (type & type)[]'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createArrayTypeNode( createTypeNode( createParenthesizedTypeNode( createTypeNode( createUnionTypeNode( createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ) ) ) ), null ) ), null, null )]) )); it('should parse @tag id: (type & type)[] - description', () => equal( parse('@tag id: (type & type)[] - description'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createArrayTypeNode( createTypeNode( createParenthesizedTypeNode( createTypeNode( createUnionTypeNode( createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ) ) ) ), null ) ), null, createDescriptionNode('description') )]) )); it('should parse @tag id: (type | type)[]', () => equal( parse('@tag id: (type | type)[]'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createArrayTypeNode( createTypeNode( createParenthesizedTypeNode( createTypeNode( createIntersectTypeNode( createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ), createTypeNode( createPrimaryTypeNode( createIdentifierNode('type') ) ) ) ) ) ), null ) ), null, null )]) )); it('should parse @tag id: (type | type)[] - description', () => equal( parse('@tag id: (type | type)[] - description'), documentation([ createTagNode( createTagNameNode( createIdentifierNode('tag') ), createTagIdentifierNode( createIdentifierNode('id'), ), createTypeNode( createArrayTypeNode( createTypeNode( createParenthesizedTypeNode( createTypeNode( createIntersectTypeNode( createTypeNode( createPrimaryTypeNode(