Fix #8049 - language server hover and editor hover (not supported for gtkview / rooview)
authorAlan Knowles <alan@roojs.com>
Sun, 25 Feb 2024 10:02:32 +0000 (18:02 +0800)
committerAlan Knowles <alan@roojs.com>
Sun, 25 Feb 2024 10:02:32 +0000 (18:02 +0800)
src/Builder4/Editor.bjs
src/Builder4/Editor.vala
src/Lsp.vala
src/Palete/HoverProvider.vala
src/Palete/LanguageClient.vala
src/Palete/LanguageClientDummy.vala
src/Palete/LanguageClientJavascript.vala
src/Palete/LanguageClientVala.vala

index 18efba5..29ed59d 100644 (file)
         ");",
         " ",
         "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",
index a893ee6..74af01c 100644 (file)
@@ -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
index 6bc7166..fb2dae7 100644 (file)
@@ -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<MarkedString>();
+
+                       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);
         }
     }
 
index 5799f4e..1dd08c6 100644 (file)
@@ -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
                {
index 67f784a..1fcb28c 100644 (file)
@@ -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<Lsp.DocumentSymbol> syntax (JsRender.JsRender file) throws GLib.Error;
-               
+               public abstract async Lsp.Hover hover (JsRender.JsRender file, int line, int offset) throws GLib.Error;
                
        }
        
index b22131a..be78b2f 100644 (file)
@@ -29,6 +29,9 @@ namespace Palete {
                        var ret = new Gee.ArrayList<Lsp.DocumentSymbol>();      
                        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
index fcea241..d5b3437 100644 (file)
@@ -291,6 +291,9 @@ namespace Palete {
                        var ret = new Gee.ArrayList<Lsp.DocumentSymbol>();      
                        return ret;
                }
+               public override async  Lsp.Hover hover (JsRender.JsRender file, int line, int offset) throws GLib.Error {
+                       return new Lsp.Hover();
+               }
                
        }
        
index d151b19..9a508de 100644 (file)
@@ -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;