| 2610 | } |
| 2611 | |
| 2612 | func (node *SourceFile) resolveJSDoc(n *Node) []*Node { |
| 2613 | if parseJSDocForNode == nil { |
| 2614 | panic("resolveJSDoc called but parseJSDocForNode is not registered; ensure the parser package is imported") |
| 2615 | } |
| 2616 | // Fast path: check cache under read lock |
| 2617 | node.jsdocMu.RLock() |
| 2618 | if jsdocs, ok := node.jsdocCache[n]; ok { |
| 2619 | node.jsdocMu.RUnlock() |
| 2620 | return jsdocs |
| 2621 | } |
| 2622 | node.jsdocMu.RUnlock() |
| 2623 | |
| 2624 | // Slow path: parse and cache under write lock |
| 2625 | node.jsdocMu.Lock() |
| 2626 | defer node.jsdocMu.Unlock() |
| 2627 | // Double-check after acquiring write lock |
| 2628 | if jsdocs, ok := node.jsdocCache[n]; ok { |
| 2629 | return jsdocs |
| 2630 | } |
| 2631 | jsdocs := parseJSDocForNode(node, n) |
| 2632 | if node.jsdocCache == nil { |
| 2633 | node.jsdocCache = make(map[*Node][]*Node) |
| 2634 | } |
| 2635 | node.jsdocCache[n] = jsdocs |
| 2636 | return jsdocs |
| 2637 | } |
| 2638 | |
| 2639 | func (node *SourceFile) BindDiagnostics() []*Diagnostic { |
| 2640 | return node.bindDiagnostics |