emacs-elpa-diffs
[Top][All Lists]
Advanced

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

[nongnu] elpa/go-mode 50e15c7 457/495: Add major mode for go.mod files:


From: ELPA Syncer
Subject: [nongnu] elpa/go-mode 50e15c7 457/495: Add major mode for go.mod files: go-dot-mod-mode
Date: Sat, 7 Aug 2021 09:06:08 -0400 (EDT)

branch: elpa/go-mode
commit 50e15c7f20fb277555e2019e95ff28434bb6dd7a
Author: Peter Sanford <psanford@sanford.io>
Commit: Muir Manders <muir@mnd.rs>

    Add major mode for go.mod files: go-dot-mod-mode
    
    This is a simple major mode for go.mod files. It's named
    go-dot-mod-mode instead of go-mod-mode to avoid tab completion
    conflicts with go-mode* functions.
---
 go-mode.el                             | 44 ++++++++++++++++++++++++++++++++++
 test/go-indentation-test.el            |  8 +++++++
 test/testdata/indentation_tests/go.mod | 19 +++++++++++++++
 3 files changed, 71 insertions(+)

diff --git a/go-mode.el b/go-mode.el
index 3cad755..c4be225 100644
--- a/go-mode.el
+++ b/go-mode.el
@@ -2620,6 +2620,50 @@ If BUFFER, return the number of characters in that 
buffer instead."
   (with-current-buffer (or buffer (current-buffer))
     (1- (position-bytes (point-max)))))
 
+(defvar go-dot-mod-mode-map
+  (let ((map (make-sparse-keymap)))
+    map)
+  "Keymap for `go-dot-mod-mode'.")
+
+(defvar go-dot-mod-mode-syntax-table
+  (let ((st (make-syntax-table)))
+    ;; handle '//' comment syntax
+    (modify-syntax-entry ?/ ". 124b" st)
+    (modify-syntax-entry ?\n "> b" st)
+    st)
+  "Syntax table for `go-dot-mod-mode'.")
+
+(defconst go-dot-mod-mode-keywords
+  '("module" "go" "require" "replace" "exclude")
+  "All keywords in the Go language.  Used for font locking.")
+
+(defvar go-dot-mod-font-lock-keywords
+  `(
+    (,(concat "\\_<" (regexp-opt go-dot-mod-mode-keywords t) "\\_>") . 
font-lock-keyword-face))
+  "Keyword highlighting specification for `go-dot-mod-mode'.")
+
+;;;###autoload
+(define-derived-mode go-dot-mod-mode fundamental-mode "Go Mod"
+  "A major mode for editing go.mod files."
+  :syntax-table go-dot-mod-mode-syntax-table
+  (set (make-local-variable 'comment-start) "// ")
+  (set (make-local-variable 'comment-end)   "")
+  (set (make-local-variable 'comment-use-syntax) t)
+  (set (make-local-variable 'comment-start-skip) "\\(//+\\)\\s *")
+
+  (set (make-local-variable 'font-lock-defaults)
+       '(go-dot-mod-font-lock-keywords))
+  (set (make-local-variable 'indent-line-function) 'go-mode-indent-line)
+
+  ;; Go style
+  (setq indent-tabs-mode t)
+
+  ;; we borrow the go-mode-indent function so we need this buffer cache
+  (set (make-local-variable 'go-dangling-cache) (make-hash-table :test 'eql))
+  (add-hook 'before-change-functions #'go--reset-dangling-cache-before-change 
t t))
+
+;;;###autoload
+(add-to-list 'auto-mode-alist '("go\\.mod\\'" . go-dot-mod-mode))
 
 ;; Polyfills for functions added in Emacs 26.  Remove these once we don’t
 ;; support Emacs 25 any more.
diff --git a/test/go-indentation-test.el b/test/go-indentation-test.el
index 03b0f9c..c5947f0 100644
--- a/test/go-indentation-test.el
+++ b/test/go-indentation-test.el
@@ -16,6 +16,14 @@
         (indent-region (point-min) (point-max) nil)
         (should (string= contents-before-indent (buffer-string)))))))
 
+(ert-deftest go-dot-mod--indent-line ()
+  (with-temp-buffer
+    (go-dot-mod-mode)
+    (insert-file-contents "testdata/indentation_tests/go.mod")
+    (let ((contents-before-indent (buffer-string)))
+      (indent-region (point-min) (point-max) nil)
+      (should (string= contents-before-indent (buffer-string))))))
+
 (defun go--should-indent (input expected)
   "Run `indent-region' against INPUT and make sure it matches EXPECTED."
   (with-temp-buffer
diff --git a/test/testdata/indentation_tests/go.mod 
b/test/testdata/indentation_tests/go.mod
new file mode 100644
index 0000000..1353039
--- /dev/null
+++ b/test/testdata/indentation_tests/go.mod
@@ -0,0 +1,19 @@
+module my/thing
+
+// comment
+go 1.12
+
+require other/thing v1.0.2
+require new/thing/v2 v2.3.4
+exclude old/thing v1.2.3
+replace bad/thing v1.4.5 => good/thing v1.4.5
+
+require (
+       // comment inside block
+       new/thing v2.3.4
+       old/thing v1.2.3
+)
+
+replace (
+       bad/thing v1.4.5 => good/thing v1.4.5
+)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]