Skip to content

Commit 9f95da8

Browse files
improve code nav search heuristics: search across repositories, and expand language filter to resolve related langs like TypeScript, JavaScript, TSX, and JSX.
1 parent 8518f27 commit 9f95da8

File tree

8 files changed

+17
-23
lines changed

8 files changed

+17
-23
lines changed

docs/docs/search/code-navigation.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ Code navigation is **search-based**, meaning it uses the same code search engine
3131
Given a `symbolName`, along with information about the file the symbol is contained within (`git_revision`, and `language`), runs the following search:
3232

3333
```bash
34-
\\b{symbolName}\\b rev:{git_revision} lang:{language}
34+
\\b{symbolName}\\b rev:{git_revision} lang:{language} case:yes
3535
```
3636

3737
### Find definitions

packages/web/src/app/[domain]/browse/[...path]/components/codePreviewPanel.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,6 @@ export const CodePreviewPanel = ({
211211
{editorRef && hasCodeNavEntitlement && (
212212
<SymbolHoverPopup
213213
editorRef={editorRef}
214-
repoName={repoName}
215214
revisionName={revisionName}
216215
language={language}
217216
onFindReferences={onFindReferences}

packages/web/src/app/[domain]/search/components/codePreviewPanel/codePreview.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,6 @@ export const CodePreview = ({
270270
{editorRef && hasCodeNavEntitlement && (
271271
<SymbolHoverPopup
272272
editorRef={editorRef}
273-
repoName={repoName}
274273
language={file.language}
275274
revisionName={file.revision}
276275
onFindReferences={onFindReferences}

packages/web/src/app/api/(server)/references/route.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,11 @@ export const GET = async (request: NextRequest) => {
2020
const symbolName = requiredQueryParamGuard(request, "symbolName");
2121
if (isServiceError(symbolName)) return serviceErrorResponse(symbolName);
2222

23-
const repoName = requiredQueryParamGuard(request, "repoName");
24-
if (isServiceError(repoName)) return serviceErrorResponse(repoName);
25-
2623
const language = requiredQueryParamGuard(request, "language");
2724
if (isServiceError(language)) return serviceErrorResponse(language);
2825

2926
const references = await findSearchBasedSymbolReferences({
3027
symbolName,
31-
repoName,
3228
language,
3329
}, domain);
3430
if (isServiceError(references)) return serviceErrorResponse(references);

packages/web/src/ee/features/codeNav/components/exploreMenu/index.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ export const ExploreMenu = ({
4444
queryFn: () => unwrapServiceError(
4545
findSearchBasedSymbolReferences({
4646
symbolName: selectedSymbolInfo.symbolName,
47-
repoName: selectedSymbolInfo.repoName,
4847
language: selectedSymbolInfo.language,
4948
revisionName: selectedSymbolInfo.revisionName,
5049
}, domain)
@@ -61,7 +60,6 @@ export const ExploreMenu = ({
6160
queryFn: () => unwrapServiceError(
6261
findSearchBasedSymbolDefinitions({
6362
symbolName: selectedSymbolInfo.symbolName,
64-
repoName: selectedSymbolInfo.repoName,
6563
language: selectedSymbolInfo.language,
6664
revisionName: selectedSymbolInfo.revisionName,
6765
}, domain)

packages/web/src/ee/features/codeNav/components/symbolHoverPopup/index.tsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import { SymbolDefinitionPreview } from "./symbolDefinitionPreview";
1010

1111
interface SymbolHoverPopupProps {
1212
editorRef: ReactCodeMirrorRef;
13-
repoName: string;
1413
language: string;
1514
revisionName: string;
1615
onFindReferences: (symbolName: string) => void;
@@ -19,7 +18,6 @@ interface SymbolHoverPopupProps {
1918

2019
export const SymbolHoverPopup: React.FC<SymbolHoverPopupProps> = ({
2120
editorRef,
22-
repoName,
2321
revisionName,
2422
language,
2523
onFindReferences,
@@ -31,7 +29,6 @@ export const SymbolHoverPopup: React.FC<SymbolHoverPopupProps> = ({
3129
const symbolInfo = useHoveredOverSymbolInfo({
3230
editorRef,
3331
isSticky,
34-
repoName,
3532
revisionName,
3633
language,
3734
});

packages/web/src/ee/features/codeNav/components/symbolHoverPopup/useHoveredOverSymbolInfo.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import { SYMBOL_HOVER_TARGET_DATA_ATTRIBUTE } from "./symbolHoverTargetsExtensio
1010
interface UseHoveredOverSymbolInfoProps {
1111
editorRef: ReactCodeMirrorRef;
1212
isSticky: boolean;
13-
repoName: string;
1413
revisionName: string;
1514
language: string;
1615
}
@@ -36,7 +35,6 @@ const SYMBOL_HOVER_POPUP_MOUSE_OUT_TIMEOUT_MS = 100;
3635
export const useHoveredOverSymbolInfo = ({
3736
editorRef,
3837
isSticky,
39-
repoName,
4038
revisionName,
4139
language,
4240
}: UseHoveredOverSymbolInfoProps): HoveredOverSymbolInfo | undefined => {
@@ -52,11 +50,10 @@ export const useHoveredOverSymbolInfo = ({
5250
}, [symbolElement]);
5351

5452
const { data: symbolDefinitions, isLoading: isSymbolDefinitionsLoading } = useQuery({
55-
queryKey: ["definitions", symbolName, repoName, revisionName, language, domain],
53+
queryKey: ["definitions", symbolName, revisionName, language, domain],
5654
queryFn: () => unwrapServiceError(
5755
findSearchBasedSymbolDefinitions({
5856
symbolName: symbolName!,
59-
repoName,
6057
language,
6158
revisionName,
6259
}, domain)

packages/web/src/features/codeNav/actions.ts

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { sew, withAuth, withOrgMembership } from "@/actions";
44
import { searchResponseSchema } from "@/features/search/schemas";
55
import { search } from "@/features/search/searchApi";
66
import { isServiceError } from "@/lib/utils";
7-
import escapeStringRegexp from "escape-string-regexp";
87
import { FindRelatedSymbolsResponse } from "./types";
98
import { ServiceError } from "@/lib/serviceError";
109
import { SearchResponse } from "../search/types";
@@ -15,7 +14,6 @@ const MAX_REFERENCE_COUNT = 1000;
1514
export const findSearchBasedSymbolReferences = async (
1615
props: {
1716
symbolName: string,
18-
repoName: string,
1917
language: string,
2018
revisionName?: string,
2119
},
@@ -25,12 +23,11 @@ export const findSearchBasedSymbolReferences = async (
2523
withOrgMembership(session, domain, async () => {
2624
const {
2725
symbolName,
28-
repoName,
2926
language,
3027
revisionName = "HEAD",
3128
} = props;
3229

33-
const query = `\\b${symbolName}\\b repo:^${escapeStringRegexp(repoName)}$ rev:${revisionName} lang:${language}`
30+
const query = `\\b${symbolName}\\b rev:${revisionName} ${getExpandedLanguageFilter(language)} case:yes`;
3431

3532
const searchResult = await search({
3633
query,
@@ -50,7 +47,6 @@ export const findSearchBasedSymbolReferences = async (
5047
export const findSearchBasedSymbolDefinitions = async (
5148
props: {
5249
symbolName: string,
53-
repoName: string,
5450
language: string,
5551
revisionName?: string,
5652
},
@@ -60,12 +56,11 @@ export const findSearchBasedSymbolDefinitions = async (
6056
withOrgMembership(session, domain, async () => {
6157
const {
6258
symbolName,
63-
repoName,
6459
language,
6560
revisionName = "HEAD",
6661
} = props;
6762

68-
const query = `sym:\\b${symbolName}\\b repo:^${escapeStringRegexp(repoName)}$ rev:${revisionName} lang:${language}`
63+
const query = `sym:\\b${symbolName}\\b rev:${revisionName} ${getExpandedLanguageFilter(language)}`;
6964

7065
const searchResult = await search({
7166
query,
@@ -107,4 +102,17 @@ const parseRelatedSymbolsSearchResponse = (searchResult: SearchResponse) => {
107102
}));
108103

109104
return parser.parseAsync(searchResult);
105+
}
106+
107+
// Expands the language filter to include all variants of the language.
108+
const getExpandedLanguageFilter = (language: string) => {
109+
switch (language) {
110+
case "TypeScript":
111+
case "JavaScript":
112+
case "JSX":
113+
case "TSX":
114+
return `(lang:TypeScript or lang:JavaScript or lang:JSX or lang:TSX)`
115+
default:
116+
return `lang:${language}`
117+
}
110118
}

0 commit comments

Comments
 (0)