From cb1eb9ba4438a3e338ed01fd60908d19e6b35261 Mon Sep 17 00:00:00 2001 From: James Westman Date: Thu, 6 Jul 2023 21:21:24 -0500 Subject: [PATCH] lsp: Show better info on IdentLiteral hover Instead of showing the documentation for the expected type, show the signature of the referenced object. --- blueprintcompiler/language/gobject_object.py | 7 +++++++ .../language/gtk_list_item_factory.py | 8 ++++++++ blueprintcompiler/language/gtk_menu.py | 7 +++++++ .../language/gtkbuilder_template.py | 7 +++++++ blueprintcompiler/language/values.py | 18 ++++++++++++------ 5 files changed, 41 insertions(+), 6 deletions(-) diff --git a/blueprintcompiler/language/gobject_object.py b/blueprintcompiler/language/gobject_object.py index d247c61..1a42c0a 100644 --- a/blueprintcompiler/language/gobject_object.py +++ b/blueprintcompiler/language/gobject_object.py @@ -55,6 +55,13 @@ class Object(AstNode): def content(self) -> ObjectContent: 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 def gir_class(self) -> GirType: if self.class_name is None: diff --git a/blueprintcompiler/language/gtk_list_item_factory.py b/blueprintcompiler/language/gtk_list_item_factory.py index f2f9d63..ba2a27f 100644 --- a/blueprintcompiler/language/gtk_list_item_factory.py +++ b/blueprintcompiler/language/gtk_list_item_factory.py @@ -9,6 +9,14 @@ from .types import TypeName class ExtListItemFactory(AstNode): 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 def type_name(self) -> T.Optional[TypeName]: if len(self.children[TypeName]) == 1: diff --git a/blueprintcompiler/language/gtk_menu.py b/blueprintcompiler/language/gtk_menu.py index 5698e12..824ec5c 100644 --- a/blueprintcompiler/language/gtk_menu.py +++ b/blueprintcompiler/language/gtk_menu.py @@ -35,6 +35,13 @@ class Menu(AstNode): def id(self) -> str: return self.tokens["id"] + @property + def signature(self) -> str: + if self.id: + return f"Gio.Menu {self.id}" + else: + return "Gio.Menu" + @property def tag(self) -> str: return self.tokens["tag"] diff --git a/blueprintcompiler/language/gtkbuilder_template.py b/blueprintcompiler/language/gtkbuilder_template.py index 9de4d66..7af5cc8 100644 --- a/blueprintcompiler/language/gtkbuilder_template.py +++ b/blueprintcompiler/language/gtkbuilder_template.py @@ -44,6 +44,13 @@ class Template(Object): def id(self) -> str: 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 def gir_class(self) -> GirType: if isinstance(self.class_name.gir_type, ExternType): diff --git a/blueprintcompiler/language/values.py b/blueprintcompiler/language/values.py index 6981141..fd1765b 100644 --- a/blueprintcompiler/language/values.py +++ b/blueprintcompiler/language/values.py @@ -312,14 +312,20 @@ class IdentLiteral(AstNode): @docs() def docs(self) -> T.Optional[str]: - type = self.context[ValueTypeCtx].value_type - if isinstance(type, gir.Enumeration): - if member := type.members.get(self.ident): + expected_type = self.context[ValueTypeCtx].value_type + if isinstance(expected_type, gir.BoolType): + return None + elif isinstance(expected_type, gir.Enumeration): + if member := expected_type.members.get(self.ident): return member.doc else: - return type.doc - elif isinstance(type, gir.GirNode): - return type.doc + return expected_type.doc + elif self.ident == "null" and self.context[ValueTypeCtx].allow_null: + 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: return None