}
void startServer()
{
- this.initProcess("/usr/bin/vala-language-server");
+ var exe = GLib.Environment.find_program_in_path( "vala-language-server");
+ if (exe == null) {
+ GLib.warning("could not find vala-language-server");
+
+ return;
+ }
+ this.initProcess(exe);
}
{
// extend versions will proably call initialize to start and connect to server.
base(project);
- this.open_files = new Gee.ArrayList<JsRender.JsRender>();
+
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.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.log(LanguageClientAction.LAUNCH, process_path);
GLib.debug("Launching %s", process_path);
this.launcher = new GLib.SubprocessLauncher (SubprocessFlags.STDIN_PIPE | SubprocessFlags.STDOUT_PIPE);
- this.launcher.set_environ(GLib.Environ.get());
+ var env = GLib.Environ.get();
+ env += "G_MESSAGES_DEBUG=all";
+
+ this.launcher.set_environ(env);
+ var logpath = GLib.Environment.get_home_dir() + "/.cache/vala-language-server";
+
+ if (!GLib.FileUtils.test(logpath, GLib.FileTest.IS_DIR)) {
+ Posix.mkdir(logpath, 0700);
+ }
+ // not very reliable..
+ //this.launcher.set_stderr_file_path(
+ // logpath + "/" +
+ // (new GLib.DateTime.now_local()).format("%Y-%m-%d") + ".log"
+ //);
+ //GLib.debug("log lang server to %s", logpath + "/" +
+ // (new GLib.DateTime.now_local()).format("%Y-%m-%d") + ".log");
+
try {
- this.subprocess = launcher.spawnv ({ process_path });
+ this.subprocess = launcher.spawnv ({ process_path , "2>" , "/tmp/vala-language-server.log" });
this.subprocess.wait_async.begin( null, ( obj,res ) => {
try {
this.jsonrpc_client.failed.connect(() => {
this.log(LanguageClientAction.ERROR_RPC, "client failed");
+ GLib.debug("language server server has failed");
this.onClose();
- GLib.debug("language server server has failed");
+
});
this.initialize_server ();
this.buildDict (
processId: new Variant.int32 ((int32) Posix.getpid ()),
rootPath: new Variant.string (this.project.path),
- rootUri: new Variant.string (File.new_for_path (this.project.path).get_uri ())
+ rootUri: new Variant.string (File.new_for_path (this.project.path).get_uri ()),
+ capabilities : this.buildDict (
+ textDocument: this.buildDict (
+ documentSymbol : this.buildDict (
+ hierarchicalDocumentSymbolSupport : new Variant.boolean (true)
+ )
+ )
+ )
),
null,
out return_value
);
GLib.debug ("LS replied with %s", Json.to_string (Json.gvariant_serialize (return_value), true));
+ this.open_files = new Gee.ArrayList<JsRender.JsRender>((a,b) => {
+ return a.path == b.path;
+ });
this.initialized = true;
+ this.getting_diagnostics = false;
return;
} catch (GLib.Error e) {
GLib.debug ("LS replied with error %s", e.message);
if (this.launcher == null) {
return;
}
+ this.getting_diagnostics = false;
this.in_close = true;
GLib.debug("onClose called");
public async void restartServer()
{
this.startServer();
- foreach(var f in this.open_files) {
- this.document_open(f);
- }
+
}
public bool isReady()
switch (method) {
case "textDocument/publishDiagnostics":
//GLib.debug("got notification %s : %s", method , Json.to_string (Json.gvariant_serialize (return_value), true));
- this.onDiagnostic(return_value);
+
+ GLib.Idle.add(() => {
+ this.onDiagnostic(return_value);
+ return false;
+ });
return;
default:
break;
}
+ bool getting_diagnostics = false;
/***
*/
{
//GLib.debug ("LS replied with %s", Json.to_string (Json.gvariant_serialize (return_value), true));
var dg = Json.gobject_deserialize (typeof (Lsp.Diagnostics), Json.gvariant_serialize (return_value)) as Lsp.Diagnostics;
+ GLib.debug("got diag for %s", dg.filename);
this.log(LanguageClientAction.DIAG, dg.filename);
+ if (this.project.path == dg.filename) {
+ this.getting_diagnostics = false;
+ this.log(LanguageClientAction.DIAG_END, "diagnostics done");
+ return;
+
+ }
+ this.getting_diagnostics =true;
var f = this.project.getByPath(dg.filename);
if (f == null) {
//GLib.debug("no file %s", dg.uri);
//this.project.updateErrorsforFile(null);
return;
}
+ //GLib.debug("got Diagnostics for %s", f.path);
f.updateErrors( dg.diagnostics );
if (!this.isReady()) {
return;
}
- if (!this.open_files.contains(file)) {
- this.open_files.add(file);
+ if (this.open_files.contains(file)) {
+ return;
}
+ this.open_files.add(file);
+
GLib.debug ("LS sent open");
try {
public override async void document_change_force (JsRender.JsRender file, string contents)
{
+
+
if (!this.isReady()) {
return;
}
-
+ this.countdown = 9; // not really relivant..
+ this.change_queue_file = null; // this is more important..
- GLib.debug ("LS send change");
+ if (!this.open_files.contains(file)) {
+ this.document_open(file);
+ }
+
+ GLib.debug ("LS send change %s rev %d", file.path, file.version);
var ar = new Json.Array();
var obj = new Json.Object();
obj.set_string_member("text", contents);
}
+
+
//CompletionListInfo.itmems.parse_varient or CompletionListInfo.parsevarient
- public override async Gee.ArrayList<Lsp.DocumentSymbol> syntax (JsRender.JsRender file) throws GLib.Error
+ public override async Lsp.Hover hover (JsRender.JsRender file, int line, int offset) throws GLib.Error
{
/* partial_result_token , work_done_token context = null) */
GLib.debug("get syntax %s", file.relpath);
+ var ret = new Lsp.Hover();
+ //ret = null;
+ if (!this.isReady()) {
+ return ret;
+ }
+ Variant? return_value;
+ yield this.jsonrpc_client.call_async (
+ "textDocument/hover",
+ this.buildDict (
+
+ textDocument : this.buildDict ( ///TextDocumentItem;
+ uri: new GLib.Variant.string (file.to_url()),
+ version : new GLib.Variant.uint64 ( (uint64) file.version)
+ ),
+ position : this.buildDict (
+ line : new GLib.Variant.uint64 ( (uint) line) ,
+ character : new GLib.Variant.uint64 ( uint.max(0, (offset -1)))
+ )
+
+ ),
+ null,
+ out return_value
+ );
+
+
+ GLib.debug ("LS replied with %s", Json.to_string (Json.gvariant_serialize (return_value), true));
+ var json = Json.gvariant_serialize (return_value);
+ ret = Json.gobject_deserialize ( typeof (Lsp.Hover), json) as Lsp.Hover;
+
+ return ret;
+
+
+
+ }
+
+
+
+
+ public override async Gee.ArrayList<Lsp.DocumentSymbol> documentSymbols (JsRender.JsRender file) throws GLib.Error {
+ /* partial_result_token , work_done_token context = null) */
+ GLib.debug("get documentSymbols %s", file.relpath);
var ret = new Gee.ArrayList<Lsp.DocumentSymbol>();
//ret = null;
if (!this.isReady()) {
var ar = json.get_array();
+ GLib.debug ("LS replied with %D items", ar.get_length());
for(var i = 0; i < ar.get_length(); i++ ) {
var add= Json.gobject_deserialize ( typeof (Lsp.DocumentSymbol), ar.get_element(i)) as Lsp.DocumentSymbol;
ret.add( add);
}
- return ret ;
+ return ret ;
-
}
+
}
}
\ No newline at end of file