@@ -2,6 +2,7 @@ package search
22
33import (
44 "context"
5+ "errors"
56 "fmt"
67 "log/slog"
78 "os"
@@ -10,6 +11,8 @@ import (
1011 "regexp"
1112 "strings"
1213 "time"
14+
15+ "grepnavi/graph"
1316)
1417
1518// DefHit は定義箇所の1件。
@@ -109,7 +112,7 @@ func FindDefinitionsSmart(ctx context.Context, word, currentFile, root, glob str
109112 var hits []DefHit
110113 var err error
111114 if dir == root {
112- hits , err = FindDefinitionsN (innerCtx , word , root , glob , 50 )
115+ hits , err = FindDefinitionsN (innerCtx , word , root , glob , 1 )
113116 } else {
114117 files := listFilesInDir (dir , glob )
115118 if len (files ) > 0 {
@@ -279,27 +282,37 @@ func FindDefinitionsN(ctx context.Context, word, dir, glob string, maxPerQuery i
279282 Regex : true ,
280283 CaseSensitive : true ,
281284 ContextLines : - 1 ,
282- MaxResults : maxPerQuery ,
283- }
284- matches , err := Search (ctx , opts )
285- if err != nil {
286- return nil , err
287285 }
288286
287+ // SearchStream を使い、実態(定義)を maxPerQuery 件見つけた時点で rg を即 kill する。
288+ // 宣言(行末 ; など)はカウントせず収集のみ行う。
289+ // これにより「.h の宣言を先に見つけても続行し、.c の定義で即終了」が実現できる。
289290 seen := map [string ]bool {}
290291 var results []DefHit
291- for _ , m := range matches {
292+ defCount := 0
293+ errDone := errors .New ("done" )
294+ if err := SearchStream (ctx , opts , func (m graph.Match ) error {
292295 key := fmt .Sprintf ("%s:%d" , m .File , m .Line )
293296 if seen [key ] {
294- continue
297+ return nil
295298 }
296299 seen [key ] = true
297- results = append ( results , DefHit {
300+ hit := DefHit {
298301 File : m .File ,
299302 Line : m .Line ,
300303 Text : strings .TrimSpace (m .Text ),
301304 Kind : classifyDefKind (m .Text , word ),
302- })
305+ }
306+ results = append (results , hit )
307+ if isDefinitionHit (hit ) {
308+ defCount ++
309+ if defCount >= maxPerQuery {
310+ return errDone // 実態を maxPerQuery 件確認した時点で rg を kill
311+ }
312+ }
313+ return nil
314+ }); err != nil {
315+ return nil , err
303316 }
304317
305318 // K&R スタイル: 関数名と ( が別行のケース(例: "void func\n(\n...")
0 commit comments