[gnome-builder/1074-vala-language-server-add-support-using-gvls: 21/24] GVls: Implementing Ide.Identer
- From: Daniel Espinosa Ortiz <despinosa src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/1074-vala-language-server-add-support-using-gvls: 21/24] GVls: Implementing Ide.Identer
- Date: Sat, 14 Dec 2019 04:50:06 +0000 (UTC)
commit 22c740e789b8b78b3aa469ca69abb50c6c15b442
Author: Daniel Espinosa Ortiz <esodan gmail com>
Date: Wed Dec 11 17:02:24 2019 -0600
GVls: Implementing Ide.Identer
src/plugins/gvls/gvls.plugin | 1 +
src/plugins/gvls/gvls_plugin.py | 93 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 94 insertions(+)
---
diff --git a/src/plugins/gvls/gvls.plugin b/src/plugins/gvls/gvls.plugin
index 8695ed0da..a1d48c8a1 100644
--- a/src/plugins/gvls/gvls.plugin
+++ b/src/plugins/gvls/gvls.plugin
@@ -13,3 +13,4 @@ X-Completion-Provider-Languages-Priority=0
X-Highlighter-Languages=vala
X-Symbol-Resolver-Languages=vala
X-Diagnostic-Provider-Languages=vala
+X-Indenter-Languages=vala
diff --git a/src/plugins/gvls/gvls_plugin.py b/src/plugins/gvls/gvls_plugin.py
index 88d22d812..416cd9b92 100644
--- a/src/plugins/gvls/gvls_plugin.py
+++ b/src/plugins/gvls/gvls_plugin.py
@@ -31,6 +31,8 @@ from gi.repository import GLib
from gi.repository import Gio
from gi.repository import GObject
from gi.repository import Ide
+from gi.repository import Gdk
+from gi.repository import Gtk
DEV_MODE = True
@@ -224,3 +226,94 @@ class GVlsSymbolResolver(Ide.LspSymbolResolver):
class GVlsDiagnosticProvider(Ide.LspDiagnosticProvider):
def do_load(self):
GVlsService.bind_client(self)
+
+#
+# Stolen from src/plugins/vala-pack/ide-vala-identer.vala
+# Copyright 2015 Christian Hergert <christian hergert me>
+#
+class GVlsIdenter (Ide.Identer):
+ def is_trigger (self, evkey):
+ val = evkey.get_keyval ()
+ if val == Gdk.KEY_Return or val == Gdk.KEY_KP_Enter:
+ return True
+ if val == Gdk.KDEY_slash:
+ return True
+ return False
+ def format (self, textView, begin, end, evkey):
+ source_view = text_view
+ was_newline = self.is_newline_keyval (evkey.keyval)
+ copy = end
+ cursor_offset = 0
+ # Move us back to the just inserted character
+ copy.backward_char ()
+ # If we are in a comment, continue the indentation
+ if (in_comment (text_view, copy)):
+ # maybe close a multiline comment
+ if (copy.get_char () == '/'):
+ close = copy
+ if (close.backward_char () and close.get_char () == ' ' and close.backward_char () and
close.get_char () == '*'):
+ begin.backward_char ();
+ begin.backward_char ();
+ return ("/", cursor_offset);
+ if (was_newline):
+ return indent_comment (text_view, copy);
+ if (is_newline_in_braces (copy)):
+ prefix = copy_indent (text_view, copy);
+ if (source_view.insert_spaces_instead_of_tabs):
+ indent = " "
+ else:
+ indent = "\t"
+ cursor_offset = -prefix.length - 1
+ return (prefix + indent + "\n" + prefix, cursor_offset)
+ if (was_newline):
+ return (copy_indent (text_view, copy), cursor_offset)
+ return null
+ def copy_indent (self, text_view, iter):
+ begin = iter
+ begin.set_line_offset (0)
+ end = begin
+ while (not end.ends_line () and end.get_char ().isspace () and end.forward_char ()):
+ # Do nothing
+ pass
+ return begin.get_slice (end)
+ def get_line_text (self, iter):
+ begin = iter
+ end = iter
+ begin.set_line_offset (0)
+ if (not end.ends_line ()):
+ end.forward_to_line_end ()
+ return begin.get_slice (end)
+ def indent_comment (self, text_view, iter):
+ line = get_line_text (iter).strip ();
+ # continue with another single line comment
+ if line.has_prefix ("//"):
+ return copy_indent (text_view, iter) + "// "
+ # comment is closed, copy indent, possibly trimming extra space
+ if (line.has_suffix ("*/")):
+ if (line.has_prefix ("*")):
+ s = GLib.String.new (copy_indent (text_view, iter))
+ if (str(s).endswith (" ")):
+ s.truncate (len (s) - 1)
+ return str(s);
+ if (line.endswith ("/*") and not line.endswith ("*/")):
+ return copy_indent (text_view, iter) + " * "
+ elif (line.has_prefix ("*")):
+ return copy_indent (text_view, iter) + "* "
+ return copy_indent (text_view, iter)
+ def in_comment (self, text_view, iter):
+ buffer = text_view.buffer
+ copy = iter
+ copy.backward_char ()
+ return buffer.iter_has_context_class (copy, "comment")
+ def is_newline_keyval (self, keyval):
+ if keyval == Gdk.KEY_Return or keyval == Gdk.KEY_KP_Enter:
+ return true
+ return false
+ def is_newline_in_braces (self, iter):
+ prev = iter
+ next = iter
+ prev.backward_char ()
+ next.forward_char ()
+ ret = (prev.get_char () == '{') and (iter.get_char () == '\n')
+ return ret and (next.get_char () == '}')
+
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]