From c9b0f1bdabe89b2f14ffd18c32fb54ef5899e7b4 Mon Sep 17 00:00:00 2001 From: Alan Knowles Date: Wed, 20 Mar 2024 23:51:21 +0800 Subject: [PATCH] Fix #8103 - updating of tree --- src/Builder4/Editor.bjs | 36 +++++++-- src/Builder4/Editor.vala | 36 +++++++-- src/JsRender/JsRender.vala | 2 +- src/Palete/LanguageClient.vala | 1 + src/Palete/LanguageClientDummy.vala | 1 + src/Palete/LanguageClientJavascript.vala | 1 + src/Palete/LanguageClientVala.vala | 94 +++++++++++++++++++----- 7 files changed, 136 insertions(+), 35 deletions(-) diff --git a/src/Builder4/Editor.bjs b/src/Builder4/Editor.bjs index 365c28082..890179bc7 100644 --- a/src/Builder4/Editor.bjs +++ b/src/Builder4/Editor.bjs @@ -422,7 +422,7 @@ " _this.file.setSource(str);", "\t BuilderApplication.showSpinner(\"appointment soon\",\"document change pending\");", " \t_this.file.getLanguageServer().document_change(_this.file);", - "", + "\t\t_this.file.getLanguageServer().queueDocumentSymbols(_this.file);", " _this.file.setSource(oldcode);", " ", "\t\t ", @@ -1282,7 +1282,21 @@ "\tforeach(var sym in syms) {", "\t\t_this.navliststore.el.append(sym);", "\t}", - "\t", + "\tthis.last_selected_line = -1;", + "\tGLib.Idle.add(() => {", + "", + "\t\tGtk.TextIter iter;", + "\t\t_this.buffer.el.get_iter_at_offset (", + "\t\t\t\tout iter, _this.buffer.el.cursor_position);", + "\t\t", + "\t\tGLib.debug(\"idle update scroll %d, %d\", iter.get_line(),", + "\t\t\t\titer.get_line_offset());", + "\t\tthis.updateSelectedLine(", + "\t\t\t\t(uint)iter.get_line(),", + "\t\t\t\t(uint)iter.get_line_offset()", + "\t\t);", + "\t\treturn false;", + "\t});", "", "}" ], @@ -1522,8 +1536,15 @@ "(JsRender.JsRender file, JsRender.Node? node, JsRender.NodeProp? prop)", "{", " this.reset();", + " if (this.file != null) {", + " \tthis.file.navigation_tree_updated.disconnect(", + " \t\t_this.navigation.show", + " \t);", + " }", " this.file = file; ", - " ", + " this.file.navigation_tree_updated.connect(", + "\t\t_this.navigation.show", + "\t);", " if (file.xtype != \"PlainFile\") {", " \tthis.prop = prop;", " this.node = node;", @@ -1538,12 +1559,13 @@ " ", " } else {", " this.view.load( file.toSource() );", - " this.updateErrorMarks();", + " this.updateErrorMarks();", " this.close_btn.el.hide();", " var ls = file.getLanguageServer();", - " ls.documentSymbols.begin(file, (a,o) => {", - " \t_this.navigation.show(ls.documentSymbols.end(o)); ", - " });", + " ls.queueDocumentSymbols(file);", + " ////ls.documentSymbols.begin(file, (a,o) => {", + " //\t_this.navigation.show(ls.documentSymbols.end(o)); ", + " //});", " //documentSymbols", " ", " }", diff --git a/src/Builder4/Editor.vala b/src/Builder4/Editor.vala index b8975b000..1231711d6 100644 --- a/src/Builder4/Editor.vala +++ b/src/Builder4/Editor.vala @@ -138,8 +138,15 @@ public class Editor : Object public void show (JsRender.JsRender file, JsRender.Node? node, JsRender.NodeProp? prop) { this.reset(); + if (this.file != null) { + this.file.navigation_tree_updated.disconnect( + _this.navigation.show + ); + } this.file = file; - + this.file.navigation_tree_updated.connect( + _this.navigation.show + ); if (file.xtype != "PlainFile") { this.prop = prop; this.node = node; @@ -154,12 +161,13 @@ public class Editor : Object } else { this.view.load( file.toSource() ); - this.updateErrorMarks(); + this.updateErrorMarks(); this.close_btn.el.hide(); var ls = file.getLanguageServer(); - ls.documentSymbols.begin(file, (a,o) => { - _this.navigation.show(ls.documentSymbols.end(o)); - }); + ls.queueDocumentSymbols(file); + ////ls.documentSymbols.begin(file, (a,o) => { + // _this.navigation.show(ls.documentSymbols.end(o)); + //}); //documentSymbols } @@ -1092,7 +1100,7 @@ public class Editor : Object _this.file.setSource(str); BuilderApplication.showSpinner("appointment soon","document change pending"); _this.file.getLanguageServer().document_change(_this.file); - + _this.file.getLanguageServer().queueDocumentSymbols(_this.file); _this.file.setSource(oldcode); @@ -1844,7 +1852,21 @@ public class Editor : Object foreach(var sym in syms) { _this.navliststore.el.append(sym); } - + this.last_selected_line = -1; + GLib.Idle.add(() => { + + Gtk.TextIter iter; + _this.buffer.el.get_iter_at_offset ( + out iter, _this.buffer.el.cursor_position); + + GLib.debug("idle update scroll %d, %d", iter.get_line(), + iter.get_line_offset()); + this.updateSelectedLine( + (uint)iter.get_line(), + (uint)iter.get_line_offset() + ); + return false; + }); } public int getRowAt (double x, double y, out string pos) { diff --git a/src/JsRender/JsRender.vala b/src/JsRender/JsRender.vala index cc8060bfa..5f3788868 100644 --- a/src/JsRender/JsRender.vala +++ b/src/JsRender/JsRender.vala @@ -129,7 +129,7 @@ namespace JsRender { } //public signal void changed (Node? node, string source); (not used?) - + public signal void navigation_tree_updated( Gee.ArrayList syms); public signal void compile_notice(string type, string file, int line, string message); diff --git a/src/Palete/LanguageClient.vala b/src/Palete/LanguageClient.vala index 6d4cfce0d..8b97ca0fa 100644 --- a/src/Palete/LanguageClient.vala +++ b/src/Palete/LanguageClient.vala @@ -89,6 +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 Lsp.Hover hover (JsRender.JsRender file, int line, int offset) throws GLib.Error; + public abstract void queueDocumentSymbols (JsRender.JsRender file); public abstract async Gee.ArrayList documentSymbols (JsRender.JsRender file) throws GLib.Error; } diff --git a/src/Palete/LanguageClientDummy.vala b/src/Palete/LanguageClientDummy.vala index 533458de7..8c1911ab6 100644 --- a/src/Palete/LanguageClientDummy.vala +++ b/src/Palete/LanguageClientDummy.vala @@ -29,6 +29,7 @@ namespace Palete { public override async Lsp.Hover hover (JsRender.JsRender file, int line, int offset) throws GLib.Error { return new Lsp.Hover(); } + public override void queueDocumentSymbols (JsRender.JsRender file) { } public override async Gee.ArrayList documentSymbols (JsRender.JsRender file) throws GLib.Error { var ret = new Gee.ArrayList(); return ret; diff --git a/src/Palete/LanguageClientJavascript.vala b/src/Palete/LanguageClientJavascript.vala index b5bec50cd..876a49c14 100644 --- a/src/Palete/LanguageClientJavascript.vala +++ b/src/Palete/LanguageClientJavascript.vala @@ -288,6 +288,7 @@ namespace Palete { public override async Lsp.Hover hover (JsRender.JsRender file, int line, int offset) throws GLib.Error { return new Lsp.Hover(); } + public override void queueDocumentSymbols (JsRender.JsRender file) { } public override async Gee.ArrayList documentSymbols (JsRender.JsRender file) throws GLib.Error { var ret = new Gee.ArrayList(); return ret; diff --git a/src/Palete/LanguageClientVala.vala b/src/Palete/LanguageClientVala.vala index 57a082b67..1be2b0596 100644 --- a/src/Palete/LanguageClientVala.vala +++ b/src/Palete/LanguageClientVala.vala @@ -1,7 +1,6 @@ namespace Palete { public class LanguageClientVala : LanguageClient { - int countdown = 0; protected bool initialized = false; bool sent_shutdown = false; uint change_queue_id = 0; @@ -20,9 +19,13 @@ namespace Palete { private IOStream? subprocess_stream = null; public Jsonrpc.Client? jsonrpc_client = null; + int countdown = 0; Gee.ArrayList open_files; private JsRender.JsRender? _change_queue_file = null; + int doc_countdown = 0; private string change_queue_file_source = ""; + private JsRender.JsRender? doc_queue_file = null; + JsRender.JsRender? change_queue_file { set { @@ -33,6 +36,9 @@ namespace Palete { return this._change_queue_file; } } + + + void startServer() { var exe = GLib.Environment.find_program_in_path( "vala-language-server"); @@ -50,30 +56,66 @@ namespace Palete { // extend versions will proably call initialize to start and connect to server. base(project); - this.change_queue_id = GLib.Timeout.add_seconds(1, () => { - if (this.change_queue_file == null) { - return true; - } - if (this.getting_diagnostics) { - return true; - } - this.countdown--; - + if (this.change_queue_id == 0 ) { + this.change_queue_id = GLib.Timeout.add_seconds(1, () => { + this.run_change_queue(); + this.run_doc_queue(); + return true; + }); + } - if (this.countdown < 0){ - this.document_change_force.begin(this.change_queue_file, this.change_queue_file_source, (o, res) => { - this.document_change_force.end(res); - }); - this.change_queue_file = null; - - } - return true; - }); this.startServer(); } + void run_change_queue() + { + + if (this.change_queue_file == null) { + return ; + } + if (this.countdown < -1) { + return; + } + if (this.getting_diagnostics) { + return; + } + this.countdown--; + + + if (this.countdown < 0){ + this.document_change_force.begin(this.change_queue_file, this.change_queue_file_source, (o, res) => { + this.document_change_force.end(res); + }); + this.change_queue_file = null; + + } + return ; + } + + void run_doc_queue() + { + + if (this.doc_queue_file == null) { + return ; + } + if (this.doc_countdown < -1) { + return; + } + this.doc_countdown--; + + if (this.doc_countdown < 0){ + var sendfile = this.doc_queue_file; + this.documentSymbols.begin(this.doc_queue_file, (o, res) => { + var ret = this.documentSymbols.end(res); + sendfile.navigation_tree_updated(ret); + }); + this.doc_queue_file = null; + + } + return ; + } public bool initProcess(string process_path) { this.onClose(); @@ -646,7 +688,19 @@ namespace Palete { } - + public override void queueDocumentSymbols (JsRender.JsRender file) + { + if (this.doc_queue_file != null && this.doc_queue_file.path != file.path) { + var sendfile = this.doc_queue_file; + this.documentSymbols.begin(this.doc_queue_file, (o, res) => { + var ret = documentSymbols.end(res); + sendfile.navigation_tree_updated(ret); + }); + } + + this.doc_countdown = 3; + this.doc_queue_file = file; + } public override async Gee.ArrayList documentSymbols (JsRender.JsRender file) throws GLib.Error { -- 2.39.2