diff --git a/src/serena/symbol.py b/src/serena/symbol.py index f8ba9dd2..5e80e93d 100644 --- a/src/serena/symbol.py +++ b/src/serena/symbol.py @@ -222,7 +222,7 @@ class LanguageServerSymbol(Symbol, ToStringMixin): """ :return: string representation of the symbol kind (name attribute of the `SymbolKind` enum item) """ - return SymbolKind(self.symbol_kind).name + return SymbolKind.from_int(self.symbol_kind).name @property def symbol_kind(self) -> SymbolKind: diff --git a/src/solidlsp/ls.py b/src/solidlsp/ls.py index 881f070d..432f11eb 100644 --- a/src/solidlsp/ls.py +++ b/src/solidlsp/ls.py @@ -1276,6 +1276,10 @@ class SolidLanguageServer(ABC): item = cast(ls_types.UnifiedSymbolInformation, dict(original_symbol_dict)) absolute_path = os.path.join(self.repository_root_path, relative_file_path) + # handle non-standard symbol kind values (e.g., 255) + if "kind" in item and isinstance(item["kind"], int): + item["kind"] = ls_types.SymbolKind.from_int(item["kind"]) + # handle missing location and path entries if "location" not in item: uri = pathlib.Path(absolute_path).as_uri() diff --git a/src/solidlsp/ls_types.py b/src/solidlsp/ls_types.py index 0eafcfea..7be552ff 100644 --- a/src/solidlsp/ls_types.py +++ b/src/solidlsp/ls_types.py @@ -152,6 +152,7 @@ class SymbolKind(IntEnum): # TODO: This is a duplicate of SymbolKind in lsp_types. + Unknown = 0 File = 1 Module = 2 Namespace = 3 @@ -179,6 +180,18 @@ class SymbolKind(IntEnum): Operator = 25 TypeParameter = 26 + @classmethod + def from_int(cls, value: int) -> "SymbolKind": + """Convert an integer to a SymbolKind. + + Returns Unknown (0) for non-standard values instead of raising ValueError. + This handles language servers that may use custom/extended symbol kinds. + """ + try: + return cls(value) + except ValueError: + return cls.Unknown + class SymbolTag(IntEnum): """Symbol tags are extra annotations that tweak the rendering of a symbol.