lsp: Show better info on IdentLiteral hover

Instead of showing the documentation for the expected type, show the
signature of the referenced object.
This commit is contained in:
James Westman 2023-07-06 21:21:24 -05:00
parent 9ff76b65cc
commit cb1eb9ba44
5 changed files with 41 additions and 6 deletions

View file

@ -55,6 +55,13 @@ class Object(AstNode):
def content(self) -> ObjectContent: def content(self) -> ObjectContent:
return self.children[ObjectContent][0] return self.children[ObjectContent][0]
@property
def signature(self) -> str:
if self.id:
return f"{self.class_name.gir_type.full_name} {self.id}"
else:
return f"{self.class_name.gir_type.full_name}"
@property @property
def gir_class(self) -> GirType: def gir_class(self) -> GirType:
if self.class_name is None: if self.class_name is None:

View file

@ -9,6 +9,14 @@ from .types import TypeName
class ExtListItemFactory(AstNode): class ExtListItemFactory(AstNode):
grammar = [UseExact("id", "template"), Optional(TypeName), ObjectContent] grammar = [UseExact("id", "template"), Optional(TypeName), ObjectContent]
@property
def id(self) -> str:
return "template"
@property
def signature(self) -> str:
return f"template {self.gir_class.full_name}"
@property @property
def type_name(self) -> T.Optional[TypeName]: def type_name(self) -> T.Optional[TypeName]:
if len(self.children[TypeName]) == 1: if len(self.children[TypeName]) == 1:

View file

@ -35,6 +35,13 @@ class Menu(AstNode):
def id(self) -> str: def id(self) -> str:
return self.tokens["id"] return self.tokens["id"]
@property
def signature(self) -> str:
if self.id:
return f"Gio.Menu {self.id}"
else:
return "Gio.Menu"
@property @property
def tag(self) -> str: def tag(self) -> str:
return self.tokens["tag"] return self.tokens["tag"]

View file

@ -44,6 +44,13 @@ class Template(Object):
def id(self) -> str: def id(self) -> str:
return "template" return "template"
@property
def signature(self) -> str:
if self.parent_type:
return f"template {self.gir_class.full_name} : {self.parent_type.gir_type.full_name}"
else:
return f"template {self.gir_class.full_name}"
@property @property
def gir_class(self) -> GirType: def gir_class(self) -> GirType:
if isinstance(self.class_name.gir_type, ExternType): if isinstance(self.class_name.gir_type, ExternType):

View file

@ -312,14 +312,20 @@ class IdentLiteral(AstNode):
@docs() @docs()
def docs(self) -> T.Optional[str]: def docs(self) -> T.Optional[str]:
type = self.context[ValueTypeCtx].value_type expected_type = self.context[ValueTypeCtx].value_type
if isinstance(type, gir.Enumeration): if isinstance(expected_type, gir.BoolType):
if member := type.members.get(self.ident): return None
elif isinstance(expected_type, gir.Enumeration):
if member := expected_type.members.get(self.ident):
return member.doc return member.doc
else: else:
return type.doc return expected_type.doc
elif isinstance(type, gir.GirNode): elif self.ident == "null" and self.context[ValueTypeCtx].allow_null:
return type.doc return None
elif object := self.context[ScopeCtx].objects.get(self.ident):
return f"```\n{object.signature}\n```"
elif self.root.is_legacy_template(self.ident):
return f"```\n{self.root.template.signature}\n```"
else: else:
return None return None