diff --git a/internal/codeintel/codenav/service.go b/internal/codeintel/codenav/service.go index 6a8c2402fbf..8d75f19664f 100644 --- a/internal/codeintel/codenav/service.go +++ b/internal/codeintel/codenav/service.go @@ -1208,6 +1208,34 @@ func languageFromFilepath(trace observation.TraceLogger, path core.RepoRelPath) return langs[0], nil } +type SearchBasedSyntacticFilterTag int + +const ( + // There was a previous syntactic search in this request, reuse some of the data it resolved to filter out + // syntactic results + SBSFilterSyntacticPrevious SearchBasedSyntacticFilterTag = iota + // There wasn't a previous syntactic search in this request, but we should still filter out syntactic results + SBSFilterSyntacticNoPrevious + // Do not filter out syntactic results + SBSFilterSyntacticDont +) + +type SearchBasedSyntacticFilter struct { + Tag SearchBasedSyntacticFilterTag + PreviousSearch PreviousSyntacticSearch +} + +func NewSyntacticFilter(prev core.Option[PreviousSyntacticSearch]) SearchBasedSyntacticFilter { + if p, isSome := prev.Get(); isSome { + return SearchBasedSyntacticFilter{Tag: SBSFilterSyntacticPrevious, PreviousSearch: p} + } + return SearchBasedSyntacticFilter{Tag: SBSFilterSyntacticNoPrevious, PreviousSearch: PreviousSyntacticSearch{}} +} + +func NoSyntacticFilter() SearchBasedSyntacticFilter { + return SearchBasedSyntacticFilter{Tag: SBSFilterSyntacticDont, PreviousSearch: PreviousSyntacticSearch{}} +} + type SearchBasedUsagesResult struct { Matches []SearchBasedMatch NextCursor core.Option[UsagesCursor] @@ -1217,7 +1245,7 @@ func (s *Service) SearchBasedUsages( ctx context.Context, gitTreeTranslator GitTreeTranslator, args UsagesForSymbolArgs, - previousSyntacticSearch core.Option[PreviousSyntacticSearch], + syntacticFilter SearchBasedSyntacticFilter, ) (_ SearchBasedUsagesResult, err error) { ctx, trace, endObservation := s.operations.searchBasedUsages.With(ctx, &err, observation.Args{Attrs: []attribute.KeyValue{ attribute.Int("repoId", int(args.Repo.ID)), @@ -1230,28 +1258,27 @@ func (s *Service) SearchBasedUsages( var language string var symbolName string var syntacticIndex core.Option[MappedIndex] - - if prev, ok := previousSyntacticSearch.Get(); ok { - language = prev.Language - symbolName = prev.SymbolName - syntacticIndex = core.Some[MappedIndex](prev.MappedIndex) + if syntacticFilter.Tag == SBSFilterSyntacticPrevious { + language = syntacticFilter.PreviousSearch.Language + symbolName = syntacticFilter.PreviousSearch.SymbolName + syntacticIndex = core.Some[MappedIndex](syntacticFilter.PreviousSearch.MappedIndex) } else { language, err = languageFromFilepath(trace, args.Path) if err != nil { return SearchBasedUsagesResult{}, err } - nameFromGit, err := s.symbolNameFromGit(ctx, args) if err != nil { return SearchBasedUsagesResult{}, err } symbolName = nameFromGit - - upload, uploadErr := s.getSyntacticUpload(ctx, trace, args) - if uploadErr != nil { - trace.Info("no syntactic upload found, return all search-based results", log.Error(err)) - } else { - syntacticIndex = core.Some[MappedIndex](NewMappedIndexFromTranslator(s.lsifstore, gitTreeTranslator, upload, args.Commit)) + if syntacticFilter.Tag == SBSFilterSyntacticNoPrevious { + upload, uploadErr := s.getSyntacticUpload(ctx, trace, args) + if uploadErr != nil { + trace.Info("no syntactic upload found, return all search-based results", log.Error(err)) + } else { + syntacticIndex = core.Some[MappedIndex](NewMappedIndexFromTranslator(s.lsifstore, gitTreeTranslator, upload, args.Commit)) + } } } return searchBasedUsagesImpl(ctx, trace, s.searchClient, args, symbolName, language, syntacticIndex) diff --git a/internal/codeintel/codenav/transport/graphql/iface.go b/internal/codeintel/codenav/transport/graphql/iface.go index 543605faa1b..fcc39de4fcf 100644 --- a/internal/codeintel/codenav/transport/graphql/iface.go +++ b/internal/codeintel/codenav/transport/graphql/iface.go @@ -32,7 +32,7 @@ type CodeNavService interface { // Subsequent calls can pass the returned cursor (if non-empty) via args.Cursor. PreciseUsages(ctx context.Context, requestState codenav.RequestState, args codenav.UsagesForSymbolResolvedArgs) (_ []shared.UploadUsage, nextCursor core.Option[codenav.UsagesCursor], err error) SyntacticUsages(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs) (codenav.SyntacticUsagesResult, *codenav.SyntacticUsagesError) - SearchBasedUsages(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, core.Option[codenav.PreviousSyntacticSearch]) (codenav.SearchBasedUsagesResult, error) + SearchBasedUsages(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, codenav.SearchBasedSyntacticFilter) (codenav.SearchBasedUsagesResult, error) } var _ CodeNavService = &codenav.Service{} diff --git a/internal/codeintel/codenav/transport/graphql/mocks_test.go b/internal/codeintel/codenav/transport/graphql/mocks_test.go index 404b4210387..b4bbfe252dc 100644 --- a/internal/codeintel/codenav/transport/graphql/mocks_test.go +++ b/internal/codeintel/codenav/transport/graphql/mocks_test.go @@ -289,7 +289,7 @@ func NewMockCodeNavService() *MockCodeNavService { }, }, SearchBasedUsagesFunc: &CodeNavServiceSearchBasedUsagesFunc{ - defaultHook: func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, core.Option[codenav.PreviousSyntacticSearch]) (r0 codenav.SearchBasedUsagesResult, r1 error) { + defaultHook: func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, codenav.SearchBasedSyntacticFilter) (r0 codenav.SearchBasedUsagesResult, r1 error) { return }, }, @@ -371,7 +371,7 @@ func NewStrictMockCodeNavService() *MockCodeNavService { }, }, SearchBasedUsagesFunc: &CodeNavServiceSearchBasedUsagesFunc{ - defaultHook: func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, core.Option[codenav.PreviousSyntacticSearch]) (codenav.SearchBasedUsagesResult, error) { + defaultHook: func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, codenav.SearchBasedSyntacticFilter) (codenav.SearchBasedUsagesResult, error) { panic("unexpected invocation of MockCodeNavService.SearchBasedUsages") }, }, @@ -1728,15 +1728,15 @@ func (c CodeNavServiceSCIPDocumentFuncCall) Results() []interface{} { // SearchBasedUsages method of the parent MockCodeNavService instance is // invoked. type CodeNavServiceSearchBasedUsagesFunc struct { - defaultHook func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, core.Option[codenav.PreviousSyntacticSearch]) (codenav.SearchBasedUsagesResult, error) - hooks []func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, core.Option[codenav.PreviousSyntacticSearch]) (codenav.SearchBasedUsagesResult, error) + defaultHook func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, codenav.SearchBasedSyntacticFilter) (codenav.SearchBasedUsagesResult, error) + hooks []func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, codenav.SearchBasedSyntacticFilter) (codenav.SearchBasedUsagesResult, error) history []CodeNavServiceSearchBasedUsagesFuncCall mutex sync.Mutex } // SearchBasedUsages delegates to the next hook function in the queue and // stores the parameter and result values of this invocation. -func (m *MockCodeNavService) SearchBasedUsages(v0 context.Context, v1 codenav.GitTreeTranslator, v2 codenav.UsagesForSymbolArgs, v3 core.Option[codenav.PreviousSyntacticSearch]) (codenav.SearchBasedUsagesResult, error) { +func (m *MockCodeNavService) SearchBasedUsages(v0 context.Context, v1 codenav.GitTreeTranslator, v2 codenav.UsagesForSymbolArgs, v3 codenav.SearchBasedSyntacticFilter) (codenav.SearchBasedUsagesResult, error) { r0, r1 := m.SearchBasedUsagesFunc.nextHook()(v0, v1, v2, v3) m.SearchBasedUsagesFunc.appendCall(CodeNavServiceSearchBasedUsagesFuncCall{v0, v1, v2, v3, r0, r1}) return r0, r1 @@ -1745,7 +1745,7 @@ func (m *MockCodeNavService) SearchBasedUsages(v0 context.Context, v1 codenav.Gi // SetDefaultHook sets function that is called when the SearchBasedUsages // method of the parent MockCodeNavService instance is invoked and the hook // queue is empty. -func (f *CodeNavServiceSearchBasedUsagesFunc) SetDefaultHook(hook func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, core.Option[codenav.PreviousSyntacticSearch]) (codenav.SearchBasedUsagesResult, error)) { +func (f *CodeNavServiceSearchBasedUsagesFunc) SetDefaultHook(hook func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, codenav.SearchBasedSyntacticFilter) (codenav.SearchBasedUsagesResult, error)) { f.defaultHook = hook } @@ -1754,7 +1754,7 @@ func (f *CodeNavServiceSearchBasedUsagesFunc) SetDefaultHook(hook func(context.C // invokes the hook at the front of the queue and discards it. After the // queue is empty, the default hook function is invoked for any future // action. -func (f *CodeNavServiceSearchBasedUsagesFunc) PushHook(hook func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, core.Option[codenav.PreviousSyntacticSearch]) (codenav.SearchBasedUsagesResult, error)) { +func (f *CodeNavServiceSearchBasedUsagesFunc) PushHook(hook func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, codenav.SearchBasedSyntacticFilter) (codenav.SearchBasedUsagesResult, error)) { f.mutex.Lock() f.hooks = append(f.hooks, hook) f.mutex.Unlock() @@ -1763,19 +1763,19 @@ func (f *CodeNavServiceSearchBasedUsagesFunc) PushHook(hook func(context.Context // SetDefaultReturn calls SetDefaultHook with a function that returns the // given values. func (f *CodeNavServiceSearchBasedUsagesFunc) SetDefaultReturn(r0 codenav.SearchBasedUsagesResult, r1 error) { - f.SetDefaultHook(func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, core.Option[codenav.PreviousSyntacticSearch]) (codenav.SearchBasedUsagesResult, error) { + f.SetDefaultHook(func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, codenav.SearchBasedSyntacticFilter) (codenav.SearchBasedUsagesResult, error) { return r0, r1 }) } // PushReturn calls PushHook with a function that returns the given values. func (f *CodeNavServiceSearchBasedUsagesFunc) PushReturn(r0 codenav.SearchBasedUsagesResult, r1 error) { - f.PushHook(func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, core.Option[codenav.PreviousSyntacticSearch]) (codenav.SearchBasedUsagesResult, error) { + f.PushHook(func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, codenav.SearchBasedSyntacticFilter) (codenav.SearchBasedUsagesResult, error) { return r0, r1 }) } -func (f *CodeNavServiceSearchBasedUsagesFunc) nextHook() func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, core.Option[codenav.PreviousSyntacticSearch]) (codenav.SearchBasedUsagesResult, error) { +func (f *CodeNavServiceSearchBasedUsagesFunc) nextHook() func(context.Context, codenav.GitTreeTranslator, codenav.UsagesForSymbolArgs, codenav.SearchBasedSyntacticFilter) (codenav.SearchBasedUsagesResult, error) { f.mutex.Lock() defer f.mutex.Unlock() @@ -1820,7 +1820,7 @@ type CodeNavServiceSearchBasedUsagesFuncCall struct { Arg2 codenav.UsagesForSymbolArgs // Arg3 is the value of the 4th argument passed to this method // invocation. - Arg3 core.Option[codenav.PreviousSyntacticSearch] + Arg3 codenav.SearchBasedSyntacticFilter // Result0 is the value of the 1st result returned from this method // invocation. Result0 codenav.SearchBasedUsagesResult diff --git a/internal/codeintel/codenav/transport/graphql/root_resolver.go b/internal/codeintel/codenav/transport/graphql/root_resolver.go index 4596c8cf1c5..b881838300f 100644 --- a/internal/codeintel/codenav/transport/graphql/root_resolver.go +++ b/internal/codeintel/codenav/transport/graphql/root_resolver.go @@ -304,8 +304,14 @@ func (r *rootResolver) UsagesForSymbol(ctx context.Context, unresolvedArgs *reso Path: args.Path, SymbolRange: args.Range, } + var syntacticFilter codenav.SearchBasedSyntacticFilter + if provsForSCIPData.Syntactic { + syntacticFilter = codenav.NewSyntacticFilter(previousSyntacticSearch) + } else { + syntacticFilter = codenav.NoSyntacticFilter() + } nextSearchBasedCursor, searchBasedUsageResolvers := r.searchBasedUsages( - ctx, trace, gitTreeTranslator, usagesForSymbolArgs, previousSyntacticSearch, + ctx, trace, gitTreeTranslator, usagesForSymbolArgs, syntacticFilter, ) usageResolvers = append(usageResolvers, searchBasedUsageResolvers...) numSearchBasedResults = len(searchBasedUsageResolvers) @@ -392,9 +398,9 @@ func (r *rootResolver) syntacticUsages( func (r *rootResolver) searchBasedUsages( ctx context.Context, trace observation.TraceLogger, gitTreeTranslator codenav.GitTreeTranslator, - args codenav.UsagesForSymbolArgs, previousSyntacticSearch core.Option[codenav.PreviousSyntacticSearch], + args codenav.UsagesForSymbolArgs, syntacticFilter codenav.SearchBasedSyntacticFilter, ) (core.Option[codenav.UsagesCursor], []resolverstubs.UsageResolver) { - result, err := r.svc.SearchBasedUsages(ctx, gitTreeTranslator, args, previousSyntacticSearch) + result, err := r.svc.SearchBasedUsages(ctx, gitTreeTranslator, args, syntacticFilter) if err != nil { trace.Error("CodeNavService.SearchBasedUsages", log.Error(err)) return core.None[codenav.UsagesCursor](), nil