[gnome-code-assistance] Added MultiDoc support



commit 5b7558cbef46745b879528bd3fbe73eccbdcd3e1
Author: Jesse van den Kieboom <jessevdk gmail com>
Date:   Thu Nov 7 21:21:55 2013 +0100

    Added MultiDoc support
    
    Most backends do not parse multiple files and therefore do not need
    to be passed all unsaved files in an editor. Now only backends that support
    the org.gnome.CodeAssist.MultiDoc service will receive unsaved documents
    outside of the primary document. This is currently only implemented in the
    C backend.

 backends/c/__init__.py                             |    3 +
 .../gnome/codeassistance/transport_dbus.py         |    4 ++
 clients/gedit/src/gca-backend.vala                 |   58 ++++++++++++++------
 clients/gedit/src/gca-remote-service.vala          |    5 ++-
 4 files changed, 52 insertions(+), 18 deletions(-)
---
diff --git a/backends/c/__init__.py b/backends/c/__init__.py
index 3a8114d..c79299c 100644
--- a/backends/c/__init__.py
+++ b/backends/c/__init__.py
@@ -33,6 +33,9 @@ def config_libclang():
 
 class Service(transport.Service):
     language = 'c'
+    services = [
+        'org.gnome.CodeAssist.MultiDoc'
+    ]
 
     def __init__(self, *args):
         transport.Service.__init__(self, *args)
diff --git a/backends/pycommon/gnome/codeassistance/transport_dbus.py 
b/backends/pycommon/gnome/codeassistance/transport_dbus.py
index c38a3dc..4f62a28 100644
--- a/backends/pycommon/gnome/codeassistance/transport_dbus.py
+++ b/backends/pycommon/gnome/codeassistance/transport_dbus.py
@@ -39,6 +39,9 @@ class Diagnostics(dbus.service.Object):
 DocumentInterfaces = [Document, Diagnostics]
 
 class Service:
+    language = None
+    services = []
+
     def __init__(self, id, name, document):
         self.id = id
         self.document = document
@@ -111,6 +114,7 @@ class Server(dbus.service.Object):
             if i in bases:
                 ret.append(i.interface)
 
+        ret += self.service.services
         return ret
 
     @dbus.service.method('org.gnome.CodeAssist.Service',
diff --git a/clients/gedit/src/gca-backend.vala b/clients/gedit/src/gca-backend.vala
index 903a149..d9e3067 100644
--- a/clients/gedit/src/gca-backend.vala
+++ b/clients/gedit/src/gca-backend.vala
@@ -70,30 +70,54 @@ class Backend : Object
                d_views.remove(view);
        }
 
-       private async DBus.UnsavedDocument[] unsaved_documents()
+       private async DBus.UnsavedDocument? unsaved_document(View v)
        {
+               var doc = v.document;
+
+               if (doc.is_modified)
+               {
+                       try
+                       {
+                               var dp = yield doc.unsaved_data_path();
+
+                               return DBus.UnsavedDocument() {
+                                       path = doc.path,
+                                       data_path = dp
+                               };
+                       }
+                       catch (Error e)
+                       {
+                               Log.debug("Failed to get unsaved document: %s", e.message);
+                       }
+               }
+
+               return null;
+       }
+
+       private async DBus.UnsavedDocument[] unsaved_documents(View primary)
+       {
+               if ((d_supported_services & RemoteServices.MULTI_DOC) == 0)
+               {
+                       var unsaved = yield unsaved_document(primary);
+
+                       if (unsaved == null)
+                       {
+                               return new DBus.UnsavedDocument[0];
+                       }
+
+                       return new DBus.UnsavedDocument[] {unsaved};
+               }
+
                var unsaved = new DBus.UnsavedDocument[d_views.size];
                unsaved.length = 0;
 
                foreach (var v in d_views)
                {
-                       var doc = v.document;
+                       var u = yield unsaved_document(v);
 
-                       if (doc.is_modified)
+                       if (u != null)
                        {
-                               try
-                               {
-                                       var dp = yield doc.unsaved_data_path();
-
-                                       unsaved += DBus.UnsavedDocument() {
-                                               path = doc.path,
-                                               data_path = dp
-                                       };
-                               }
-                               catch (Error e)
-                               {
-                                       Log.debug("Failed to get unsaved document: %s", e.message);
-                               }
+                               unsaved += u;
                        }
                }
 
@@ -102,7 +126,7 @@ class Backend : Object
 
        private void parse(View view)
        {
-               unsaved_documents.begin((obj, res) => {
+               unsaved_documents.begin(view, (obj, res) => {
                        var unsaved = unsaved_documents.end(res);
 
                        var path = view.document.path;
diff --git a/clients/gedit/src/gca-remote-service.vala b/clients/gedit/src/gca-remote-service.vala
index 2f8202a..2907406 100644
--- a/clients/gedit/src/gca-remote-service.vala
+++ b/clients/gedit/src/gca-remote-service.vala
@@ -25,7 +25,8 @@ enum RemoteServices
 {
        DIAGNOSTICS,
        SEMANTIC_VALUES,
-       SYMBOLS;
+       SYMBOLS,
+       MULTI_DOC;
 
        public static RemoteServices parse(string s)
        {
@@ -37,6 +38,8 @@ enum RemoteServices
                        return RemoteServices.SEMANTIC_VALUES;
                case "org.gnome.CodeAssist.Symbols":
                        return RemoteServices.SYMBOLS;
+               case "org.gnome.CodeAssist.MultiDoc":
+                       return RemoteServices.MULTI_DOC;
                }
 
                return 0;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]