@@ -263,11 +263,13 @@ contexts:
263263 scope : keyword.control.assertion.regexp.elixir
264264 set : [group_body, unexpected_quantifier_pop]
265265 # Named capture.
266- - match : \? (?>(?> P?<({{capture_name}})>| '\g<-1>'|P?< ({{invalid_capture_name}}?)>| '\g<-1>') )
266+ - match : (?x) \? (?>P?<({{capture_name}})> | '\g<-1>' | (P)(?=') | P?(<>|'') | P?< ({{invalid_capture_name}}?)> | P? '\g<-1>')
267267 scope : keyword.other.named-capture-group.regexp.elixir
268268 captures :
269269 1 : entity.name.capture-group.regexp.elixir
270270 2 : invalid.illegal.named-capture.regexp.elixir
271+ 3 : invalid.illegal.named-capture.regexp.elixir
272+ 4 : invalid.illegal.named-capture.regexp.elixir
271273 set : [group_body, unexpected_quantifier_pop]
272274 # Atomic group.
273275 - match : \?>
@@ -290,7 +292,8 @@ contexts:
290292 3 : invalid.illegal.inline-option.regexp.elixir
291293 4 : storage.modifier.mode.colon.regexp.elixir
292294 set : [group_body, unexpected_quantifier_pop]
293- - include : conditional_subpattern
295+ - match : (?=\?\()
296+ set : conditional_subpattern_pop
294297 - match : ' '
295298 set : [group_body, unexpected_quantifier_pop]
296299
@@ -301,41 +304,60 @@ contexts:
301304 pop : true
302305 - include : expression
303306
307+ conditional_subpattern_pop :
308+ - meta_content_scope : meta.group.regexp.elixir
309+ - include : conditional_subpattern
310+ - match : ' '
311+ pop : true
312+
304313 conditional_subpattern :
314+ - match : \?((\()(\)))
315+ scope : keyword.control.conditional.regexp.elixir
316+ captures :
317+ 1 : invalid.illegal.conditional.regexp.elixir
318+ 2 : punctuation.definition.conditional.begin.regexp.elixir
319+ 3 : punctuation.definition.conditional.end.regexp.elixir
305320 - match : \?(\()
306321 scope : keyword.control.conditional.regexp.elixir
307322 captures :
308323 1 : punctuation.definition.conditional.begin.regexp.elixir
309324 push :
325+ - meta_scope : meta.conditional.regexp.elixir
310326 # Pseudo-condition called DEFINE.
311327 - match : DEFINE
312328 scope : keyword.other.conditional.definition.regexp
313- set : [subpattern_condition, unexpected_quantifier_pop]
329+ set : conditional_subpattern_end
314330 # References to recursion.
315- - match : R(?:\d+|&{{capture_name}})
316- scope : variable.other.back-reference.recursion.regexp.elixir
317- set : [subpattern_condition, unexpected_quantifier_pop]
331+ - match : (R)(?:(&)({{capture_name}})|(\d+)|)
332+ captures :
333+ 1 : keyword.operator.recursion.regexp.elixir
334+ 2 : keyword.operator.recursion.regexp.elixir
335+ 3 : variable.other.recursion.regexp.elixir
336+ 4 : variable.other.recursion.regexp.elixir
337+ set : conditional_subpattern_end
318338 # References to subpatterns.
319339 - match : <({{capture_name}})>|'\g<-1>'|\g<-1>
320340 captures :
321341 1 : variable.other.back-reference.regexp.elixir
322- set : [subpattern_condition, unexpected_quantifier_pop]
342+ set : conditional_subpattern_end
323343 # Assertions: positive or negative lookahead or lookbehind assertion.
324344 - match : \?<?[=!]
325345 scope : keyword.control.assertion.regexp.elixir
326346 set :
327- - match : \)
328- scope : keyword.control.group.regexp.elixir punctuation.definition.conditional.end.regexp.elixir
329- set : [group_body, unexpected_quantifier_pop]
330- - include : unexpected_quantifier_pop
331- - include : expression
347+ - include : unexpected_quantifier
348+ - match : ' '
349+ set :
350+ - meta_content_scope : meta.conditional.regexp.elixir
351+ - match : (?=\))
352+ set : conditional_subpattern_end
353+ - include : expression
332354 - match : ' '
333- set : [subpattern_condition, unexpected_quantifier_pop]
355+ set : conditional_subpattern_end
334356
335- subpattern_condition :
357+ conditional_subpattern_end :
336358 - meta_content_scope : meta.conditional.regexp.elixir
337359 - match : \)
338- scope : keyword.control.conditional.regexp.elixir
360+ scope : keyword.control.conditional.regexp.elixir punctuation.definition.conditional.end.regexp.elixir
339361 set : [group_body, unexpected_quantifier_pop]
340362 - match : ' [^)]+'
341363 scope : invalid.illegal.conditional.regexp.elixir
0 commit comments