(start int)
| 712 | } |
| 713 | |
| 714 | func (p *Parser) parseJSDocLink(start int) *ast.Node { |
| 715 | state := p.mark() |
| 716 | linkType, ok := p.parseJSDocLinkPrefix() |
| 717 | if !ok { |
| 718 | p.rewind(state) |
| 719 | return nil |
| 720 | } |
| 721 | p.nextTokenJSDoc() |
| 722 | // start at token after link, then skip any whitespace |
| 723 | p.skipWhitespace() |
| 724 | name := p.parseJSDocLinkName() |
| 725 | var text []string |
| 726 | for p.token != ast.KindCloseBraceToken && p.token != ast.KindNewLineTrivia && p.token != ast.KindEndOfFile { |
| 727 | text = append(text, p.scanner.TokenText()) |
| 728 | p.nextTokenJSDoc() // Couldn't this be nextTokenCommentJSDoc? |
| 729 | } |
| 730 | var create *ast.Node |
| 731 | switch linkType { |
| 732 | case "link": |
| 733 | create = p.factory.NewJSDocLink(name, text) |
| 734 | case "linkcode": |
| 735 | create = p.factory.NewJSDocLinkCode(name, text) |
| 736 | default: |
| 737 | create = p.factory.NewJSDocLinkPlain(name, text) |
| 738 | } |
| 739 | return p.finishNodeWithEnd(create, start, p.scanner.TokenEnd()) |
| 740 | } |
| 741 | |
| 742 | func (p *Parser) parseJSDocLinkName() *ast.Node { |
| 743 | if tokenIsIdentifierOrKeyword(p.token) { |
no test coverage detected