From e26f5d8d193152d659b3041281406a55994f7110 Mon Sep 17 00:00:00 2001
From: Bryan Enders <endersstocker@users.noreply.github.com>
Date: Tue, 12 Feb 2019 10:32:09 -0500
Subject: [PATCH] Syntax: Add doc delimiters

Why
---

I want to be able to differentiate between ordinary delimiters and
those used for docs

How
---

* Add doc syntax specs
* Add **elixirDocSigilDelimiter** group
* Add **elixirDocStringDelimiter** group
* Link **elixirDocStringDelimiter** and **elixirDocStringDelimiter** to
  **elixirStringDelimiter** and **elixirSigilDelimiter** to preserve
  existing behavior
---
 spec/syntax/doc_spec.rb | 27 ++++++++++++++++-----------
 syntax/elixir.vim       | 20 +++++++++++---------
 2 files changed, 27 insertions(+), 20 deletions(-)

diff --git a/spec/syntax/doc_spec.rb b/spec/syntax/doc_spec.rb
index 1aa6c4b2..bc6766ad 100644
--- a/spec/syntax/doc_spec.rb
+++ b/spec/syntax/doc_spec.rb
@@ -5,11 +5,15 @@
 describe 'documentation syntax' do
   describe 'string' do
     it 'doc in double quotes' do
-      expect('@doc "foo"').to include_elixir_syntax('elixirDocString', 'foo')
+      ex = '@doc "foo"'
+      expect(ex).to include_elixir_syntax('elixirDocString', 'foo')
+      expect(ex).to include_elixir_syntax('elixirDocStringDelimiter', '"')
     end
 
     it 'doc in sigil_S' do
-      expect('@doc ~S(foo)').to include_elixir_syntax('elixirDocString', 'foo')
+      ex = '@doc ~S(foo)'
+      expect(ex).to include_elixir_syntax('elixirDocString', 'foo')
+      expect(ex).to include_elixir_syntax('elixirDocSigilDelimiter', 'S')
     end
   end
 
@@ -22,6 +26,7 @@
       EOF
       expect(ex).to include_elixir_syntax('elixirVariable', 'doc')
       expect(ex).to include_elixir_syntax('elixirDocString', 'foo')
+      expect(ex).to include_elixir_syntax('elixirDocStringDelimiter', '"""')
     end
 
     it 'doc with sigil_S triple double-quoted multiline content' do
@@ -31,7 +36,7 @@
         """
       EOF
       expect(ex).to include_elixir_syntax('elixirVariable', 'doc')
-      expect(ex).to include_elixir_syntax('elixirSigilDelimiter', 'S"""')
+      expect(ex).to include_elixir_syntax('elixirDocSigilDelimiter', 'S"""')
       expect(ex).to include_elixir_syntax('elixirDocString', 'foo')
     end
 
@@ -42,8 +47,8 @@
         """)
       EOF
       expect(ex).to include_elixir_syntax('elixirVariable', 'doc')
-      expect(ex).to include_elixir_syntax('elixirSigilDelimiter', 'S"""')
-      expect(ex).to include_elixir_syntax('elixirSigil', 'foo')
+      expect(ex).to include_elixir_syntax('elixirDocSigilDelimiter', 'S"""')
+      expect(ex).to include_elixir_syntax('elixirDocString', 'foo')
     end
 
     it 'doc with sigil_S triple single-quoted multiline content' do
@@ -53,7 +58,7 @@
         '''
       EOF
       expect(ex).to include_elixir_syntax('elixirVariable', 'doc')
-      expect(ex).to include_elixir_syntax('elixirSigilDelimiter', "S'''")
+      expect(ex).to include_elixir_syntax('elixirDocSigilDelimiter', "S'''")
       expect(ex).to include_elixir_syntax('elixirDocString', 'foo')
     end
 
@@ -64,8 +69,8 @@
         ''')
       EOF
       expect(ex).to include_elixir_syntax('elixirVariable', 'doc')
-      expect(ex).to include_elixir_syntax('elixirSigilDelimiter', "S'''")
-      expect(ex).to include_elixir_syntax('elixirSigil', 'foo')
+      expect(ex).to include_elixir_syntax('elixirDocSigilDelimiter', "S'''")
+      expect(ex).to include_elixir_syntax('elixirDocString', 'foo')
     end
 
     it 'doc with triple single-quoted multiline content is not a doc string' do
@@ -83,9 +88,9 @@
         foo #{bar}
         """
       EOF
-      expect(ex).to include_elixir_syntax('elixirDocString',       'foo')
-      expect(ex).to include_elixir_syntax('elixirStringDelimiter', '"""')
-      expect(ex).to include_elixir_syntax('elixirInterpolation',   'bar')
+      expect(ex).to include_elixir_syntax('elixirDocString', 'foo')
+      expect(ex).to include_elixir_syntax('elixirDocStringDelimiter', '"""')
+      expect(ex).to include_elixir_syntax('elixirInterpolation', 'bar')
     end
 
     it 'doc with doctest' do
diff --git a/syntax/elixir.vim b/syntax/elixir.vim
index a1bc17dd..2659d69b 100644
--- a/syntax/elixir.vim
+++ b/syntax/elixir.vim
@@ -117,15 +117,15 @@ else
   syn region elixirDocTest start="^\s*\%(iex\|\.\.\.\)\%((\d*)\)\?>\s" end="^\s*$" contained
 endif
 
-syn region elixirDocString matchgroup=elixirSigilDelimiter  start="\%(@\w*doc\s\+\)\@<=\~[Ss]\z(/\|\"\|'\||\)" end="\z1" skip="\\\\\|\\\z1" contains=@elixirDocStringContained fold keepend
-syn region elixirDocString matchgroup=elixirSigilDelimiter  start="\%(@\w*doc\s\+\)\@<=\~[Ss]{"                   end="}"   skip="\\\\\|\\}"   contains=@elixirDocStringContained fold keepend
-syn region elixirDocString matchgroup=elixirSigilDelimiter  start="\%(@\w*doc\s\+\)\@<=\~[Ss]<"                   end=">"   skip="\\\\\|\\>"   contains=@elixirDocStringContained fold keepend
-syn region elixirDocString matchgroup=elixirSigilDelimiter  start="\%(@\w*doc\s\+\)\@<=\~[Ss]\["                  end="\]"  skip="\\\\\|\\\]"  contains=@elixirDocStringContained fold keepend
-syn region elixirDocString matchgroup=elixirSigilDelimiter  start="\%(@\w*doc\s\+\)\@<=\~[Ss]("                   end=")"   skip="\\\\\|\\)"   contains=@elixirDocStringContained fold keepend
-syn region elixirDocString matchgroup=elixirStringDelimiter start=+\%(@\w*doc\s\+\)\@<=\z("\)+                 end=+\z1+ skip=+\\\\\|\\\z1+  contains=@elixirDocStringContained keepend
-syn region elixirDocString matchgroup=elixirStringDelimiter start=+\%(@\w*doc\s\+\)\@<=\z("""\)+               end=+\z1+ contains=@elixirDocStringContained fold keepend
-syn region elixirDocString matchgroup=elixirSigilDelimiter  start=+\%(@\w*doc\s\+\)\@<=\~[Ss]\z('''\)+ end=+\z1+ skip=+\\'+ contains=@elixirDocStringContained fold keepend
-syn region elixirDocString matchgroup=elixirSigilDelimiter  start=+\%(@\w*doc\s\+\)\@<=\~[Ss]\z("""\)+ end=+\z1+ skip=+\\"+ contains=@elixirDocStringContained fold keepend
+syn region elixirDocString matchgroup=elixirDocSigilDelimiter  start="\%(@\w*doc\s\+\)\@<=\~[Ss]\z(/\|\"\|'\||\)" end="\z1" skip="\\\\\|\\\z1" contains=@elixirDocStringContained fold keepend
+syn region elixirDocString matchgroup=elixirDocSigilDelimiter  start="\%(@\w*doc\s\+\)\@<=\~[Ss]{"                   end="}"   skip="\\\\\|\\}"   contains=@elixirDocStringContained fold keepend
+syn region elixirDocString matchgroup=elixirDocSigilDelimiter  start="\%(@\w*doc\s\+\)\@<=\~[Ss]<"                   end=">"   skip="\\\\\|\\>"   contains=@elixirDocStringContained fold keepend
+syn region elixirDocString matchgroup=elixirDocSigilDelimiter  start="\%(@\w*doc\s\+\)\@<=\~[Ss]\["                  end="\]"  skip="\\\\\|\\\]"  contains=@elixirDocStringContained fold keepend
+syn region elixirDocString matchgroup=elixirDocSigilDelimiter  start="\%(@\w*doc\s\+\)\@<=\~[Ss]("                   end=")"   skip="\\\\\|\\)"   contains=@elixirDocStringContained fold keepend
+syn region elixirDocString matchgroup=elixirDocStringDelimiter start=+\%(@\w*doc\s\+\)\@<=\z("\)+                 end=+\z1+ skip=+\\\\\|\\\z1+  contains=@elixirDocStringContained keepend
+syn region elixirDocString matchgroup=elixirDocStringDelimiter start=+\%(@\w*doc\s\+\)\@<=\z("""\)+               end=+\z1+ contains=@elixirDocStringContained fold keepend
+syn region elixirDocString matchgroup=elixirDocSigilDelimiter  start=+\%(@\w*doc\s\+\)\@<=\~[Ss]\z('''\)+ end=+\z1+ skip=+\\'+ contains=@elixirDocStringContained fold keepend
+syn region elixirDocString matchgroup=elixirDocSigilDelimiter  start=+\%(@\w*doc\s\+\)\@<=\~[Ss]\z("""\)+ end=+\z1+ skip=+\\"+ contains=@elixirDocStringContained fold keepend
 
 " Defines
 syn match elixirDefine              '\<def\>\(:\)\@!'             nextgroup=elixirFunctionDeclaration    skipwhite skipnl
@@ -209,6 +209,8 @@ hi def link elixirRegexQuantifier        elixirSpecial
 hi def link elixirSpecial                Special
 hi def link elixirString                 String
 hi def link elixirSigil                  String
+hi def link elixirDocStringDelimiter     elixirStringDelimiter
+hi def link elixirDocSigilDelimiter      elixirSigilDelimiter
 hi def link elixirStringDelimiter        Delimiter
 hi def link elixirRegexDelimiter         Delimiter
 hi def link elixirInterpolationDelimiter Delimiter