Skip to content

Commit bc51f03

Browse files
authored
[Erlang] Add support for map comprehensions (#4548)
implements: https://www.erlang.org/eeps/eep-0058 It was released with Erlang OTP 26.
1 parent d64231e commit bc51f03

2 files changed

Lines changed: 104 additions & 2 deletions

File tree

Erlang/Erlang.sublime-syntax

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1196,19 +1196,28 @@ contexts:
11961196
scope: meta.mapping.erlang punctuation.section.mapping.begin.erlang
11971197
push:
11981198
- include: map-common
1199+
# filter
1200+
- match: \|\|
1201+
scope: meta.mapping.erlang keyword.operator.comprehension.erlang
1202+
push:
1203+
- meta_content_scope: meta.mapping.filter.erlang
1204+
- include: expressions
1205+
- include: value-end-pop
11991206
# value
12001207
- match: =>|\:=
12011208
scope: meta.mapping.erlang punctuation.separator.key-value.erlang
12021209
push:
12031210
- meta_content_scope: meta.mapping.value.erlang
1211+
- match: (?=\|\|)
1212+
pop: 1
12041213
- include: expressions
12051214
- include: value-end-pop
12061215
# key
12071216
- match: ',?'
12081217
scope: meta.mapping.erlang punctuation.separator.sequence.erlang
12091218
push:
12101219
- meta_content_scope: meta.mapping.key.erlang
1211-
- match: (?==>|\:=)
1220+
- match: (?==>|\:=|\|\|)
12121221
pop: 1
12131222
- include: expressions
12141223
- include: value-end-pop
@@ -1221,19 +1230,28 @@ contexts:
12211230
scope: meta.mapping.erlang punctuation.section.mapping.begin.erlang
12221231
push:
12231232
- include: map-common
1233+
# filter
1234+
- match: \|\|
1235+
scope: meta.mapping.erlang keyword.operator.comprehension.erlang
1236+
push:
1237+
- meta_content_scope: meta.mapping.filter.erlang
1238+
- include: type-expressions
1239+
- include: value-end-pop
12241240
# value
12251241
- match: =>|\:=
12261242
scope: meta.mapping.erlang punctuation.separator.key-value.erlang
12271243
push:
12281244
- meta_content_scope: meta.mapping.value.erlang
1245+
- match: (?=\|\|)
1246+
pop: 1
12291247
- include: type-expressions
12301248
- include: value-end-pop
12311249
# key
12321250
- match: ',?'
12331251
scope: meta.mapping.erlang punctuation.separator.sequence.erlang
12341252
push:
12351253
- meta_content_scope: meta.mapping.key.erlang
1236-
- match: (?==>|\:=)
1254+
- match: (?==>|\:=|\|\|)
12371255
pop: 1
12381256
- include: type-expressions
12391257
- include: value-end-pop

Erlang/syntax_test_erlang.erl

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -708,6 +708,90 @@ map_tests() -> .
708708
% ^ - meta.mapping
709709
% ^ punctuation.section.mapping.end.erlang
710710

711+
712+
map_comprehension_tests() ->
713+
714+
#{ => || }
715+
% ^^ meta.mapping.erlang punctuation.section.mapping.begin.erlang
716+
% ^ meta.mapping.key.erlang
717+
% ^^ meta.mapping.erlang punctuation.separator.key-value.erlang
718+
% ^ meta.mapping.value.erlang
719+
% ^^ meta.mapping.erlang keyword.operator.comprehension.erlang
720+
% ^ meta.mapping.filter.erlang
721+
% ^ meta.mapping.erlang punctuation.section.mapping.end.erlang
722+
723+
#{K => K || K <- List}
724+
% ^^ meta.mapping.erlang punctuation.section.mapping.begin.erlang
725+
% ^^ meta.mapping.key.erlang
726+
% ^ variable.other.readwrite.erlang
727+
% ^^ meta.mapping.erlang punctuation.separator.key-value.erlang
728+
% ^^^ meta.mapping.value.erlang
729+
% ^ variable.other.readwrite.erlang
730+
% ^^ meta.mapping.erlang keyword.operator.comprehension.erlang
731+
% ^^^^^^^^^^ meta.mapping.filter.erlang
732+
% ^ variable.other.readwrite.erlang
733+
% ^^ keyword.operator.generator.erlang
734+
% ^^^^ variable.other.readwrite.erlang
735+
% ^ meta.mapping.erlang punctuation.section.mapping.end.erlang
736+
737+
#{K => V || <<K, V>> <= Binary}
738+
% ^^ meta.mapping.erlang punctuation.section.mapping.begin.erlang
739+
% ^^ meta.mapping.key.erlang
740+
% ^ variable.other.readwrite.erlang
741+
% ^^ meta.mapping.erlang punctuation.separator.key-value.erlang
742+
% ^^^ meta.mapping.value.erlang
743+
% ^ variable.other.readwrite.erlang
744+
% ^^ meta.mapping.erlang keyword.operator.comprehension.erlang
745+
% ^^^^^^^^^^^^^^^^^^^ meta.mapping.filter.erlang
746+
% ^^^^^^^^ meta.sequence.binary.erlang
747+
% ^^ punctuation.definition.sequence.begin.erlang
748+
% ^ variable.other.readwrite.erlang
749+
% ^ punctuation.separator.sequence.erlang
750+
% ^ variable.other.readwrite.erlang
751+
% ^^ punctuation.definition.sequence.end.erlang
752+
% ^^ keyword.operator.generator.erlang
753+
% ^^^^^^ variable.other.readwrite.erlang
754+
% ^ meta.mapping.erlang punctuation.section.mapping.end.erlang
755+
756+
#{ || {K, V} <- maps:to_list(Map)}
757+
% ^^ meta.mapping.erlang punctuation.section.mapping.begin.erlang
758+
% ^ meta.mapping.key.erlang
759+
% ^^ meta.mapping.erlang keyword.operator.comprehension.erlang
760+
% ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.mapping.filter.erlang
761+
% ^^^^^^ meta.sequence.tuple.erlang
762+
% ^ punctuation.section.sequence.begin.erlang
763+
% ^ variable.other.readwrite.erlang
764+
% ^ punctuation.separator.sequence.erlang
765+
% ^ variable.other.readwrite.erlang
766+
% ^ punctuation.section.sequence.end.erlang
767+
% ^^ keyword.operator.generator.erlang
768+
% ^^^^^^^^^^^^ meta.path.erlang
769+
% ^^^^ meta.atom.erlang variable.namespace.erlang
770+
% ^ punctuation.accessor.double-colon.erlang
771+
% ^^^^^^^ meta.function-call.identifier.erlang meta.atom.erlang variable.function.erlang
772+
% ^^^^^ meta.function-call.arguments.erlang
773+
% ^ punctuation.section.arguments.begin.erlang
774+
% ^^^ variable.other.readwrite.erlang
775+
% ^ punctuation.section.arguments.end.erlang
776+
% ^ meta.mapping.erlang punctuation.section.mapping.end.erlang
777+
778+
[{Key, Value} || Key := Value <- MapOrIterator]
779+
% ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.sequence.list.erlang
780+
% ^ punctuation.section.sequence.begin.erlang
781+
% ^^^^^^^^^^^^ meta.sequence.tuple.erlang
782+
% ^ punctuation.section.sequence.begin.erlang
783+
% ^^^ variable.other.readwrite.erlang
784+
% ^ punctuation.separator.sequence.erlang
785+
% ^^^^^ variable.other.readwrite.erlang
786+
% ^ punctuation.section.sequence.end.erlang
787+
% ^^ keyword.operator.comprehension.erlang
788+
% ^^^ variable.other.readwrite.erlang
789+
% ^^ punctuation.separator.key-value.erlang
790+
% ^^^^^ variable.other.readwrite.erlang
791+
% ^^ keyword.operator.generator.erlang
792+
% ^^^^^^^^^^^^^ variable.other.readwrite.erlang
793+
% ^ punctuation.section.sequence.end.erlang
794+
711795
% Number tests
712796

713797
numbers_test() -> .

0 commit comments

Comments
 (0)