fix #7968 - language server support for syntax check and completion
[roobuilder] / src / Application.vala
index b2d347c..41f1c0a 100644 (file)
@@ -66,7 +66,7 @@
                        { "skip-file", 0, 0, OptionArg.STRING, ref opt_compile_skip ,"For test compiles do not add this (usually used in conjunction with add-file ", null },
                        { "add-file", 0, 0, OptionArg.STRING, ref opt_compile_add, "Add this file to compile list", null },
                        { "output", 0, 0, OptionArg.STRING, ref opt_compile_output, "output binary file path", null },
-                       { "debug", 0, 0, OptionArg.NONE, ref opt_debug, "Show debug messages", null },
+                       { "debug", 0, 0, OptionArg.NONE, ref opt_debug, "Show debug messages for non-ui, or crash on warnings for gdb ", null },
                        { "pull-resources", 0, 0, OptionArg.NONE, ref opt_pull_resources, "Fetch the online resources", null },                 
             
             // some testing code.
@@ -77,7 +77,7 @@
             { "bjs-test-all", 0, 0, OptionArg.NONE, ref opt_bjs_test, "Test all the BJS files to see if the new parser/writer would change anything", null },            
             { "bjs-target", 0, 0, OptionArg.STRING, ref opt_bjs_compile_target, "convert bjs file to tareet  : vala / js", null },
             { "test", 0, 0, OptionArg.STRING, ref opt_test, "run a test use 'help' to list the available tests", null },
-            
+            { "language-server", 0, 0, OptionArg.STRING, ref opt_language_server, "run language server on this file", null },
             { "drop-list", 0, 0, OptionArg.STRING, ref opt_drop_list, "show droplist / children for a Gtk type (eg. Gtk.Widget)", null },
             
             
                public static string opt_compile_skip;
                public static string opt_compile_add;
                public static string opt_compile_output;
-        public static string opt_bjs_compile;
-        public static string opt_bjs_compile_target;
-        public static string opt_test;  
-        public static string opt_drop_list;
-        
+               public static string opt_bjs_compile;
+               public static string opt_bjs_compile_target;
+               public static string opt_test;  
+               public static string opt_drop_list;
+               public static string opt_language_server;
         
         public static bool opt_skip_linking = false;
                public static bool opt_debug = false;
 
 
 
-               public static Palete.ValaCompileQueue valacompilequeue;
+               //public static Palete.ValaCompileQueue valacompilequeue;
 
        
                public BuilderApplication (  string[] args)
                                flags: ApplicationFlags.FLAGS_NONE
                        );
                        BuilderApplication.windows = new        Gee.ArrayList<Xcls_MainWindow>();
-                       BuilderApplication.valacompilequeue = new Palete.ValaCompileQueue();
+                       //BuilderApplication.valacompilequeue = new Palete.ValaCompileQueue();
                        
                        
                        configDirectory();
                Project.Project.loadAll();
                        this.listProjects();
                        var cur_project = this.compileProject();
-                       this.dropList(cur_project);
+                       this.dropList(cur_project); // --drop-list
+                       this.languageServer(cur_project); // --language-server                  
                        this.listFiles(cur_project);
                        this.testBjs(cur_project);
+                       this.languageServer(cur_project);
                        this.compileBjs(cur_project);
                        this.compileVala();
 
                
                void initDebug() 
                {
-               
+                        
+                       
                        if (BuilderApplication.opt_debug  || BuilderApplication.opt_compile_project == null) {
-                               GLib.Log.set_handler(null, 
-                                       GLib.LogLevelFlags.LEVEL_DEBUG | GLib.LogLevelFlags.LEVEL_WARNING | GLib.LogLevelFlags.LEVEL_CRITICAL, 
+                               GLib.Log.set_default_handler( 
+                               //      GLib.LogLevelFlags.LEVEL_DEBUG | GLib.LogLevelFlags.LEVEL_WARNING | GLib.LogLevelFlags.LEVEL_CRITICAL, 
                                        (dom, lvl, msg) => {
-                                       print("%s: %s\n", (new DateTime.now_local()).format("%H:%M:%S.%f"), msg);
+
+                                       print("%s: %s : %s\n", (new DateTime.now_local()).format("%H:%M:%S.%f"), lvl.to_string(), msg);
+                                       
+                                       if (dom== "GtkSourceView") { // seems to be some critical wanrings comming from gtksourceview related to insert?
+                                               return;
+                                       }
+                                       //if (msg.contains("gdk_popup_present")) { // seems to be problems with the popup present on gtksourceview competion.
+                                       //      return;
+                                       //}
+                                       if (BuilderApplication.opt_debug && lvl ==  GLib.LogLevelFlags.LEVEL_CRITICAL) {
+                                               GLib.error(msg);
+                                       }
                                });
                        }
                        
                        
                        
                        
-                       var file = cur_project.getByName(BuilderApplication.opt_bjs_compile);
+                       var file = cur_project.getByRelPath(BuilderApplication.opt_bjs_compile);
                        if (file == null) {
                                // then compile them all, and compare them...
                                
                        
                        GLib.Process.exit(Posix.EXIT_SUCCESS);
                }
-               
+               void languageServer(Project.Project? cur_project)
+               {
+                       if (BuilderApplication.opt_language_server == null) {
+                               return;
+                       }
+                       if (cur_project == null) {
+                               GLib.error("missing project, use --project to select which project");
+                       }
+                       var file = cur_project.getByRelPath(BuilderApplication.opt_language_server);
+                       if (file == null) {
+                               // then compile them all, and compare them...
+                                GLib.error("missing file %s in project %s", BuilderApplication.opt_language_server, cur_project.name);
+                       }
+                       
+                       var ls = file.getLanguageServer();
+                       if (ls == null) {
+                               GLib.error("No langauge server returned for file:%s", file.relpath);
+                       }
+                       var loop = new MainLoop();
+                       GLib.Timeout.add_seconds(1, () => {
+                               if (!ls.isReady()) {
+                                       GLib.debug("waiting for server to be ready");
+                                       return true;
+                               }
+                               GLib.debug("Sending document_open");
+                               // it's ready..
+                                
+                               ls.document_open(file);
+                               return false;
+                               
+                       });
+                       
+                        
+                       loop.run();
+                       GLib.Process.exit(Posix.EXIT_SUCCESS);
+               }
+                       
+                       
                void compileVala()
                {
                        if (BuilderApplication.opt_compile_target == null) {
                                case "help":
                                        print("""
 help             - list available tests
-flutter-project  - create a flutter project in /tmp/test-flutter
+flutter-project  -  was try and read flutter data (but desnt work.)
 """);          
                                        break;
                                case "flutter-project":
@@ -523,6 +574,9 @@ flutter-project  - create a flutter project in /tmp/test-flutter
                                        */
                                        break;
                                        
+                                
+                                       
+                                       
                                default:
                                        print("Invalid test\n");
                                        break;
@@ -593,29 +647,27 @@ flutter-project  - create a flutter project in /tmp/test-flutter
                                if (ww == null || ww.windowstate == null || ww.windowstate.project ==null) {
                                        continue;
                                }
-                               if (ww.windowstate.project.last_request == null) {
-                                       ww.updateErrors(null);                                  
-                                       return;
-                               }
-                               var req = ww.windowstate.project.last_request;
-                               GLib.debug("checking errors editor for %s", ww.windowstate.file.targetName());
-                               
-                               if (req.errorByFile.has_key(ww.windowstate.file.targetName())) {
-                                       GLib.debug("calling update Error margs for  %s", ww.windowstate.file.targetName());             
-                                       ww.windowstate.code_editor_tab.updateErrorMarks(req.errorByFile.get(ww.windowstate.file.targetName()));
-                               } else {
-                                       ww.windowstate.code_editor_tab.updateErrorMarks(null);
+
+                               ww.windowstate.updateErrorMarksAll();
                                 
-                                       GLib.debug("no errors in errrobyfile for  %s", ww.windowstate.file.targetName());               
-                               }
-                               
                                GLib.debug("calling udate Errors of window %s", ww.windowstate.file.targetName());
-                               ww.updateErrors(req);
+                               ww.updateErrors();
                                
                                
                        }
                
                }
+               public static  void showSpinner(bool state)
+               {
+                       foreach (var win in BuilderApplication.windows) {
+                               if (state) {
+                                       win.statusbar_compile_spinner.start();
+                               }  else {
+                                       win.statusbar_compile_spinner.stop();
+                               }
+                       }
+               }
+