Always show at least quick_info (but not docstring) in jb_find_symbol

This commit is contained in:
Michael Panchenko committed 2026-01-04 23:01:27 +07:00
1 parent 5b0705c373
commit a69832dae5
4 files changed
+26 -25

No files matched your search

+1 -1
View File
@@ -422,7 +422,7 @@ class JetBrainsCodeEditor(CodeEditor[JetBrainsSymbol]):
if len(symbols) > 1:
raise ValueError(
f"Found multiple {len(symbols)} symbols with name {name_path} in file {relative_file_path}. "
"Their locations are: \n " + json.dumps([s["text_range"] for s in symbols], indent=2)
"They are: \n " + json.dumps(symbols, indent=2)
)
return JetBrainsSymbol(symbols[0], self._project)
+12 -6
View File
@@ -142,7 +142,9 @@ class JetBrainsPluginClient(ToStringMixin):
name_path: str,
relative_path: str | None = None,
include_body: bool = False,
include_info: bool = True,
include_quick_info: bool = True,
include_documentation: bool = False,
include_num_usages: bool = True,
depth: int = 0,
include_location: bool = False,
search_deps: bool = False,
@@ -153,7 +155,9 @@ class JetBrainsPluginClient(ToStringMixin):
:param name_path: the name path to match
:param relative_path: the relative path to which to restrict the search
:param include_body: whether to include symbol body content
:param include_info: whether to include symbol info
:param include_quick_info: whether to include quick info
:param include_documentation: whether to include documentation
:param include_num_usages: whether to include number of usages
:param depth: depth of children to include (0 = no children)
:param include_location: whether to include symbol location information
:param search_deps: whether to also search in dependencies
@@ -165,19 +169,21 @@ class JetBrainsPluginClient(ToStringMixin):
"depth": depth,
"includeLocation": include_location,
"searchDeps": search_deps,
"includeInfo": include_info,
"includeQuickInfo": include_quick_info,
"includeDocumentation": include_documentation,
"includeNumUsages": include_num_usages,
}
return cast(jb.SymbolCollectionResponse, self._make_request("POST", "/findSymbol", request_data))
def find_references(self, name_path: str, relative_path: str, include_info: bool) -> jb.SymbolCollectionResponse:
def find_references(self, name_path: str, relative_path: str, include_quick_info: bool) -> jb.SymbolCollectionResponse:
"""
Finds references to a symbol.
:param name_path: the name path of the symbol
:param relative_path: the relative path
:param include_info: whether to include symbol info
:param include_quick_info: whether to include quick info about references
"""
request_data = {"namePath": name_path, "relativePath": relative_path, "includeInfo": include_info}
request_data = {"namePath": name_path, "relativePath": relative_path, "includeQuickInfo": include_quick_info}
return cast(jb.SymbolCollectionResponse, self._make_request("POST", "/findReferences", request_data))
def get_symbols_overview(self, relative_path: str, depth: int) -> jb.SymbolCollectionResponse:
+13 -17
View File
@@ -1,6 +1,6 @@
import logging
from collections import defaultdict
from typing import Any, Literal
from typing import Any, Literal, cast
import serena.tools.jetbrains_types as jb
from serena.text_utils import render_html
@@ -21,7 +21,7 @@ class JetBrainsFindSymbolTool(Tool, ToolMarkerSymbolicRead, ToolMarkerOptional):
depth: int = 0,
relative_path: str | None = None,
include_body: bool = False,
include_info: bool = True,
include_info: bool = False,
search_deps: bool = False,
max_answer_chars: int = -1,
) -> str:
@@ -62,27 +62,25 @@ class JetBrainsFindSymbolTool(Tool, ToolMarkerSymbolicRead, ToolMarkerOptional):
"""
if relative_path == ".":
relative_path = None
if include_body:
include_info = False # we save tokens and don't include info if body is requested
with JetBrainsPluginClient.from_project(self.project) as client:
include_documentation = include_info and not include_body
include_quick_info = not include_documentation and not include_info
response_dict = client.find_symbol(
name_path=name_path_pattern,
relative_path=relative_path,
depth=depth,
include_body=include_body,
include_info=include_info,
include_documentation=include_documentation,
include_quick_info=include_quick_info,
search_deps=search_deps,
)
# massage the response to include only 'info' field if requested (instead of both doc and quick info)
if not include_body and include_info:
symbols = response_dict["symbols"]
for symbol in symbols:
documentation = symbol.pop("documentation", None)
quick_info = symbol.pop("quick_info", None)
info = documentation if documentation else quick_info
if info:
symbol["info"] = render_html(info) # type: ignore
symbols = response_dict["symbols"]
for symbol in symbols:
for doc_field in ("documentation", "quick_info"):
if doc_html := symbol.get(doc_field):
doc_html = cast(str, doc_html)
symbol[doc_field] = render_html(doc_html)
result = self._to_json(response_dict)
return self._limit_length(result, max_answer_chars)
@@ -97,7 +95,6 @@ class JetBrainsFindReferencingSymbolsTool(Tool, ToolMarkerSymbolicRead, ToolMark
self,
name_path: str,
relative_path: str,
include_info: bool = True,
max_answer_chars: int = -1,
) -> str:
"""
@@ -107,7 +104,6 @@ class JetBrainsFindReferencingSymbolsTool(Tool, ToolMarkerSymbolicRead, ToolMark
:param name_path: name path of the symbol for which to find references; matching logic as described in find symbol tool.
:param relative_path: the relative path to the file containing the symbol for which to find references.
Note that here you can't pass a directory but must pass a file.
:param include_info: whether to include additional info (hover-like, typically including docstring and signature).
:param max_answer_chars: max characters for the JSON result. If exceeded, no content is returned. -1 means the
default value from the config will be used.
:return: a list of JSON objects with the symbols referencing the requested symbol
@@ -116,7 +112,7 @@ class JetBrainsFindReferencingSymbolsTool(Tool, ToolMarkerSymbolicRead, ToolMark
response_dict = client.find_references(
name_path=name_path,
relative_path=relative_path,
include_info=include_info,
include_quick_info=True,
)
result = self._to_json(response_dict)
return self._limit_length(result, max_answer_chars)
-1
View File
@@ -40,7 +40,6 @@ class TypeHierarchyNodeDTO(TypedDict):
class TypeHierarchyResponse(TypedDict):
symbol: NotRequired[SymbolDTO]
hierarchy: NotRequired[list[TypeHierarchyNodeDTO]]
error: NotRequired[str]
num_levels_not_included: NotRequired[int]