From: Alan Knowles Date: Sun, 25 Feb 2024 10:02:32 +0000 (+0800) Subject: Fix #8049 - language server hover and editor hover (not supported for gtkview / rooview) X-Git-Url: http://git.roojs.org/?p=roobuilder;a=commitdiff_plain;h=d6bf226a7fd92c81e62facf221f3e0b44830704c Fix #8049 - language server hover and editor hover (not supported for gtkview / rooview) --- diff --git a/src/Builder4/Editor.bjs b/src/Builder4/Editor.bjs index 18efba575..29ed59d41 100644 --- a/src/Builder4/Editor.bjs +++ b/src/Builder4/Editor.bjs @@ -135,7 +135,7 @@ ");", " ", "var hover = this.el.get_hover();", - "hover.add_provider(new Palete.HoverProvider());", + "hover.add_provider(new Palete.HoverProvider(_this));", "", "//this.el.completion.unblock_interactive();", "this.el.completion.select_on_show = true; // select", diff --git a/src/Builder4/Editor.vala b/src/Builder4/Editor.vala index a893ee681..74af01c4a 100644 --- a/src/Builder4/Editor.vala +++ b/src/Builder4/Editor.vala @@ -656,7 +656,7 @@ public class Editor : Object ); var hover = this.el.get_hover(); - hover.add_provider(new Palete.HoverProvider()); + hover.add_provider(new Palete.HoverProvider(_this)); //this.el.completion.unblock_interactive(); this.el.completion.select_on_show = true; // select diff --git a/src/Lsp.vala b/src/Lsp.vala index 6bc7166b4..fb2dae7bc 100644 --- a/src/Lsp.vala +++ b/src/Lsp.vala @@ -869,6 +869,12 @@ namespace Lsp { } public class MarkedString : Object { + public MarkedString(string language, string value) + { + this.language = language; + this.value = value; + GLib.debug("new marked string %s : %s", language, value); + } public string language { get; set; } public string value { get; set; } } @@ -906,8 +912,33 @@ namespace Lsp { return node; } - public bool deserialize_property (string property_name, out Value value, ParamSpec pspec, Json.Node property_node) { - error ("deserialization not supported"); + public bool deserialize_property (string property_name, out Value value, ParamSpec pspec, Json.Node property_node) + { + if (property_name == "contents") { + value = GLib.Value (typeof(Gee.ArrayList)); + if (property_node.get_node_type () != Json.NodeType.ARRAY) { + warning ("unexpected property node type for 'arguments' %s", property_node.get_node_type ().to_string ()); + return false; + } + var contents = new Gee.ArrayList(); + + property_node.get_array ().foreach_element ((array, index, element) => { + try { + var add = new MarkedString( + array.get_object_element(index).get_string_member("language"), + array.get_object_element(index).get_string_member("value") + ); + + contents.add ( add ); + } catch (Error e) { + warning ("argument %u to command could not be deserialized: %s", index, e.message); + } + }); + value.set_object (contents); + return true; + } + + return default_deserialize_property (property_name, out value, pspec, property_node); } } diff --git a/src/Palete/HoverProvider.vala b/src/Palete/HoverProvider.vala index 5799f4e9c..1dd08c62c 100644 --- a/src/Palete/HoverProvider.vala +++ b/src/Palete/HoverProvider.vala @@ -3,6 +3,15 @@ namespace Palete { public class HoverProvider : Object, GtkSource.HoverProvider { + public JsRender.JsRender file { + get { return this.editor.file; } + private set {} + } + Editor editor; + public HoverProvider(Editor editor) + { + this.editor = editor; + } public async bool populate_async ( GtkSource.HoverContext context, GtkSource.HoverDisplay display, Cancellable? cancellable) throws Error { @@ -13,12 +22,28 @@ namespace Palete { if (!context.get_bounds(out begin, out end)) { return false; } - - context.get_iter(out pos); - - GLib.debug("populate hover async Word: %s || %s" ,begin.get_text(pos) , pos.get_text(end) ); - display.append(new global::Gtk.Label("test")); - return true; + var line = end.get_line(); + var offset = end.get_line_offset(); + if (this.editor.prop != null) { + // tried line -1 (does not work) + GLib.debug("node pad = '%s' %d", this.editor.node.node_pad, this.editor.node.node_pad.length); + + line += this.editor.prop.start_line ; + // this is based on Gtk using tabs (hence 1/2 chars); + offset += this.editor.node.node_pad.length; + // javascript listeners are indented 2 more spaces. + if (this.editor.prop.ptype == JsRender.NodePropType.LISTENER) { + offset += 2; + } + } + var res = yield this.file.getLanguageServer().hover(this.file, line, offset); + + if ( res != null && res.contents.size > 0) { + var str = res.contents.get(0).value; + display.append(new global::Gtk.Label(str)); + return true; + } + return false; } public bool populate (GtkSource.HoverContext context, GtkSource.HoverDisplay display) throws Error { diff --git a/src/Palete/LanguageClient.vala b/src/Palete/LanguageClient.vala index 67f784a6a..1fcb28c3f 100644 --- a/src/Palete/LanguageClient.vala +++ b/src/Palete/LanguageClient.vala @@ -89,7 +89,7 @@ namespace Palete { public abstract async void shutdown () throws GLib.Error; public abstract async Lsp.CompletionList? completion(JsRender.JsRender file, int line, int offset , int triggerType = 1) throws GLib.Error; public abstract async Gee.ArrayList syntax (JsRender.JsRender file) throws GLib.Error; - + public abstract async Lsp.Hover hover (JsRender.JsRender file, int line, int offset) throws GLib.Error; } diff --git a/src/Palete/LanguageClientDummy.vala b/src/Palete/LanguageClientDummy.vala index b22131aa6..be78b2f8c 100644 --- a/src/Palete/LanguageClientDummy.vala +++ b/src/Palete/LanguageClientDummy.vala @@ -29,6 +29,9 @@ namespace Palete { var ret = new Gee.ArrayList(); return ret; } + public override async Lsp.Hover hover (JsRender.JsRender file, int line, int offset) throws GLib.Error { + return new Lsp.Hover(); + } } } \ No newline at end of file diff --git a/src/Palete/LanguageClientJavascript.vala b/src/Palete/LanguageClientJavascript.vala index fcea241e9..d5b34374a 100644 --- a/src/Palete/LanguageClientJavascript.vala +++ b/src/Palete/LanguageClientJavascript.vala @@ -291,6 +291,9 @@ namespace Palete { var ret = new Gee.ArrayList(); return ret; } + public override async Lsp.Hover hover (JsRender.JsRender file, int line, int offset) throws GLib.Error { + return new Lsp.Hover(); + } } diff --git a/src/Palete/LanguageClientVala.vala b/src/Palete/LanguageClientVala.vala index d151b198a..9a508de9c 100644 --- a/src/Palete/LanguageClientVala.vala +++ b/src/Palete/LanguageClientVala.vala @@ -631,8 +631,9 @@ namespace Palete { GLib.debug ("LS replied with %s", Json.to_string (Json.gvariant_serialize (return_value), true)); var json = Json.gvariant_serialize (return_value); - var add= Json.gobject_deserialize ( typeof (Lsp.Hover), ar.get_element(i)) as Lsp.Hover - return ret ; + ret = Json.gobject_deserialize ( typeof (Lsp.Hover), json) as Lsp.Hover; + + return ret;