Skip to content

Commit 603a6fa

Browse files
authored
Merge pull request #357 from elixir-lang/fix-guards
syntax: fix highlighting of Kernel functions
2 parents 1c9344d + 97b4c00 commit 603a6fa

File tree

3 files changed

+30
-35
lines changed

3 files changed

+30
-35
lines changed

spec/syntax/guard_spec.rb

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,30 @@
55
describe 'Guard syntax' do
66
it 'guard in function' do
77
expect(<<~EOF).to include_elixir_syntax('elixirKernelFunction', 'is_atom')
8-
def fun(a) when is_atom(a) do
9-
end
8+
def fun(a) when is_atom(a), do:
9+
EOF
10+
end
11+
12+
it 'guard in if' do
13+
expect(<<~EOF).to include_elixir_syntax('elixirKernelFunction', 'is_atom')
14+
if is_atom(:atom), do: true
1015
EOF
1116
end
1217

1318
it 'guard in case' do
1419
expect(<<~EOF).to include_elixir_syntax('elixirKernelFunction', 'is_atom')
15-
case
16-
a when is_atom(a) -> {:ok, a}
20+
case true do
21+
true when is_atom(:atom) -> true
1722
end
1823
EOF
1924
end
2025

21-
it 'does not highlight outside guards' do
22-
expect(<<~EOF).not_to include_elixir_syntax('elixirKernelFunction', 'is_atom')
23-
if is_atom(a) do
24-
{:ok, a}
25-
end
26+
it 'guard in case (multiline)' do
27+
expect(<<~EOF).to include_elixir_syntax('elixirKernelFunction', 'is_atom')
28+
case true do
29+
true when is_boolean(true) and
30+
is_atom(:atom) -> true
31+
end
2632
EOF
2733
end
2834
end

spec/syntax/kernel_function_spec.rb

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,17 @@
33
require 'spec_helper'
44

55
describe 'Kernel function syntax' do
6-
it 'kernel function used as an atom key in a keyword list contained in a block' do
6+
it 'kernel function used as an atom key in a keyword list outside of a block' do
77
expect(<<~EOF).not_to include_elixir_syntax('elixirKernelFunction', 'length')
88
do
9-
plug Plug.Parsers,
10-
parsers: [:urlencoded, :multipart, :json],
11-
pass: ["*/*"],
12-
json_decoder: Poison,
13-
length: 400_000_000
9+
plug Plug.Parsers, length: 400_000_000
10+
end
11+
EOF
12+
end
13+
14+
it 'kernel function used as an atom key in a keyword list contained in a block' do
15+
expect(<<~EOF).not_to include_elixir_syntax('elixirKernelFunction', 'length')
16+
plug Plug.Parsers, length: 400_000_000
1417
EOF
1518
end
1619

@@ -21,19 +24,4 @@ def hello(name) when length(name) > 20 do
2124
end
2225
EOF
2326
end
24-
25-
it 'kernel function used in a function body' do
26-
expect(<<~'EOF').not_to include_elixir_syntax('elixirKernelFunction', 'length')
27-
def say_size(chars) do
28-
size = length(chars)
29-
IO.puts "you gave me #{size} chars"
30-
end
31-
EOF
32-
end
33-
34-
it 'kernel function used as top-level' do
35-
expect(<<~'EOF').not_to include_elixir_syntax('elixirKernelFunction', 'length')
36-
length(chars)
37-
EOF
38-
end
3927
end

syntax/elixir.vim

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,18 @@ syn cluster elixirDeclaration contains=elixirFunctionDeclaration,elixirModuleDec
1616
syn match elixirComment '#.*' contains=elixirTodo,@Spell
1717
syn keyword elixirTodo FIXME NOTE TODO OPTIMIZE XXX HACK contained
1818

19-
syn match elixirId '\<[_a-zA-Z]\w*[!?]\?\>' contains=elixirUnusedVariable
19+
syn match elixirId '\<[_a-zA-Z]\w*[!?]\?\>' contains=elixirUnusedVariable,elixirKernelFunction
2020

2121
syn match elixirKeyword '\(\.\)\@<!\<\(for\|case\|when\|with\|cond\|if\|unless\|try\|receive\|send\)\>'
2222
syn match elixirKeyword '\(\.\)\@<!\<\(exit\|raise\|throw\|after\|rescue\|catch\|else\)\>'
2323
syn match elixirKeyword '\(\.\)\@<!\<\(quote\|unquote\|super\|spawn\|spawn_link\|spawn_monitor\)\>'
2424

2525
" Kernel functions
26-
syn match elixirKernelFunction contained containedin=elixirGuard '\<\(is_atom\|is_binary\|is_bitstring\|is_boolean\|is_float\|is_function\|is_integer\|is_list\|is_map\|is_nil\|is_number\|is_pid\|is_port\)\>\([ (]\)\@='
27-
syn match elixirKernelFunction contained containedin=elixirGuard '\<\(is_record\|is_reference\|is_tuple\|is_exception\|abs\|bit_size\|byte_size\|div\|elem\|hd\|length\|map_size\|node\|rem\|round\|tl\|trunc\|tuple_size\)\>\([ (]\)\@='
28-
29-
syn match elixirGuard '.*when.*' contains=ALLBUT,@elixirNotTop
26+
syn keyword elixirKernelFunction contained is_atom is_binary is_bitstring is_boolean is_float
27+
syn keyword elixirKernelFunction contained is_function is_integer is_list is_map is_nil
28+
syn keyword elixirKernelFunction contained is_number is_pid is_port is_reference is_tuple
29+
syn keyword elixirKernelFunction contained abs binary_part bit_size byte_size div elem hd length
30+
syn keyword elixirKernelFunction contained map_size node rem round tl trunc tuple_size
3031

3132
syn keyword elixirInclude import require alias use
3233

0 commit comments

Comments
 (0)