Skip to content

Commit b404447

Browse files
lmarlowkassio
authored andcommitted
Show @doc with sigil_S as elixirDocString. (elixir-editors#185)
* Test to show @doc with sigil_S don't show as elixirDocString. * Make the tests pending until they're fixed. * Fix pending elixirDocString tests. * Keep elixirVariable for `@doc`. * Triple single quoted docs aren't valid unless with `sigil_[Ss]`. * Documentation delimiters are no longer included in `elixirDocString`.
1 parent 56383fe commit b404447

File tree

2 files changed

+42
-13
lines changed

2 files changed

+42
-13
lines changed

spec/syntax/heredoc_spec.rb

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,56 @@
44

55
describe 'Heredoc syntax' do
66
describe 'binary' do
7-
it 'with multiline content' do
8-
expect(<<~EOF).to include_elixir_syntax('elixirDocString', 'foo')
9-
@doc """
7+
it 'doc with multiline content' do
8+
ex = <<~EOF
9+
@callbackdoc """
1010
foo
1111
"""
1212
EOF
13+
expect(ex).to include_elixir_syntax('elixirVariable', 'doc')
14+
expect(ex).to include_elixir_syntax('elixirDocString', 'foo')
1315
end
1416

15-
it 'escapes quotes unless only preceded by whitespace' do
16-
expect(<<~EOF).to include_elixir_syntax('elixirDocString', %q(^\s*\zs"""))
17-
@doc """
18-
foo """
17+
it 'doc with sigil_S triple double-quoted multiline content' do
18+
ex = <<~EOF
19+
@doc ~S"""
20+
foo
1921
"""
2022
EOF
23+
expect(ex).to include_elixir_syntax('elixirVariable', 'doc')
24+
expect(ex).to include_elixir_syntax('elixirSigilDelimiter', 'S"""')
25+
expect(ex).to include_elixir_syntax('elixirDocString', 'foo')
26+
end
27+
28+
it 'doc with sigil_S triple single-quoted multiline content' do
29+
ex = <<~EOF
30+
@doc ~S'''
31+
foo
32+
'''
33+
EOF
34+
expect(ex).to include_elixir_syntax('elixirVariable', 'doc')
35+
expect(ex).to include_elixir_syntax('elixirSigilDelimiter', "S'''")
36+
expect(ex).to include_elixir_syntax('elixirDocString', 'foo')
37+
end
38+
39+
it 'doc with triple single-quoted multiline content is not a doc string' do
40+
ex = <<~EOF
41+
@doc '''
42+
foo
43+
'''
44+
EOF
45+
expect(ex).not_to include_elixir_syntax('elixirDocString', 'foo')
2146
end
2247

23-
it 'with interpolation' do
24-
expect(<<~EOF).to include_elixir_syntax('elixirInterpolation', 'bar')
48+
it 'doc with interpolation' do
49+
ex = <<~EOF
2550
@doc """
2651
foo \#{bar}
2752
"""
2853
EOF
54+
expect(ex).to include_elixir_syntax('elixirDocString', 'foo')
55+
expect(ex).to include_elixir_syntax('elixirStringDelimiter', '"""')
56+
expect(ex).to include_elixir_syntax('elixirInterpolation', 'bar')
2957
end
3058

3159
it 'interpolation in heredoc must be string' do

syntax/elixir.vim

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,6 @@ syn region elixirString matchgroup=elixirStringDelimiter start=+\z('''\)+ end=+
8585
syn region elixirString matchgroup=elixirStringDelimiter start=+\z("""\)+ end=+^\s*\z1+ skip=+"\|\\\\+ contains=@elixirStringContained
8686
syn region elixirInterpolation matchgroup=elixirInterpolationDelimiter start="#{" end="}" contained contains=ALLBUT,elixirComment,@elixirNotTop
8787

88-
syn match elixirDocString +\(@\w*doc\s*\)\@<=\%("""\_.\{-}\_^\s*"""\|".\{-\}"\)+ contains=elixirTodo,elixirInterpolation,@Spell fold
89-
9088
syn match elixirAtomInterpolated ':\("\)\@=' contains=elixirString
9189
syn match elixirString "\(\w\)\@<!?\%(\\\(x\d{1,2}\|\h{1,2}\h\@!\>\|0[0-7]{0,2}[0-7]\@!\>\|[^x0MC]\)\|(\\[MC]-)+\w\|[^\s\\]\)"
9290

@@ -111,8 +109,11 @@ syn region elixirSigil matchgroup=elixirSigilDelimiter start="\~\l\["
111109
syn region elixirSigil matchgroup=elixirSigilDelimiter start="\~\l(" end=")" skip="\\\\\|\\)" contains=@elixirStringContained,elixirRegexEscapePunctuation fold
112110

113111
" Sigils surrounded with docString
114-
syn region elixirSigil matchgroup=elixirSigilDelimiter start=+\~\a\z("""\)+ end=+^\s*\zs\z1+ skip=+\\"+ fold
115-
syn region elixirSigil matchgroup=elixirSigilDelimiter start=+\~\a\z('''\)+ end=+^\s*\zs\z1+ skip=+\\'+ fold
112+
syn region elixirSigil matchgroup=elixirSigilDelimiter start=+\~\a\z("""\)+ end=+^\s*\zs\z1\s*$+ skip=+\\"+ fold
113+
syn region elixirSigil matchgroup=elixirSigilDelimiter start=+\~\a\z('''\)+ end=+^\s*\zs\z1\s*$+ skip=+\\'+ fold
114+
115+
syn region elixirDocString matchgroup=elixirStringDelimiter start=+\%(@\w*doc\s\+\)\@<=\z("""\)+ end=+\z1+ contains=elixirTodo,elixirInterpolation,@Spell fold
116+
syn region elixirDocString matchgroup=elixirSigilDelimiter start=+\%(@\w*doc\s\+\)\@<=\~[Ss]\z('''\|"""\)+ end=+\z1+ contains=elixirTodo,elixirInterpolation,@Spell fold
116117

117118
" Defines
118119
syn keyword elixirDefine def nextgroup=elixirFunctionDeclaration skipwhite skipnl

0 commit comments

Comments
 (0)