Skip to content

Commit

Permalink
Fix backreference and subpattern highlighting in VS Code
Browse files Browse the repository at this point in the history
Workaround for microsoft/vscode-textmate#164 and similar issues
  • Loading branch information
jtbandes committed Nov 5, 2023
1 parent e881645 commit efe7774
Show file tree
Hide file tree
Showing 3 changed files with 387 additions and 156 deletions.
113 changes: 89 additions & 24 deletions Swift.tmLanguage.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

102 changes: 69 additions & 33 deletions Swift.tmLanguage.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1866,39 +1866,75 @@ repository:
13: { name: invalid.illegal.returns-not-allowed.regexp }

literals-regular-expression-literal-backreference-or-subpattern:
match: |-
(?x)
(?<esc>\\g)(?<NumberRef> (?<num>[+-]?\d+)(?:(?<op>[+-])(?<num>\d+))? )
| (?<esc>\\k\{)(?<NamedRef> (?<name>(?!\d)\w+) (?:(?<op>[+-])(?<num>\d+))? )(?<esc>\})
| (?<esc>\\g\{)(?:\g<NamedRef>|\g<NumberRef>)(?<esc>\})
| (?<esc>\\[gk]<)(?:\g<NamedRef>|\g<NumberRef>)(?<esc>>)
| (?<esc>\\[gk]')(?:\g<NamedRef>|\g<NumberRef>)(?<esc>')
| (?<keyw>\(\?(?:P[=>]|&))\g<NamedRef>(?<keyw>\))
| (?<keyw>\(\?R\))
| (?<keyw>\(\?)\g<NumberRef>(?<keyw>\))
| (?<keyw>\\[1-9][0-9]+)
captures:
1: { name: constant.character.escape.backslash.regexp }
3: { name: constant.numeric.integer.decimal.regexp }
4: { name: keyword.operator.recursion-level.regexp }
5: { name: constant.numeric.integer.decimal.regexp }
6: { name: constant.character.escape.backslash.regexp }
8: { name: variable.language.group-name.regexp }
9: { name: keyword.operator.recursion-level.regexp }
10: { name: constant.numeric.integer.decimal.regexp }
11: { name: constant.character.escape.backslash.regexp }
12: { name: constant.character.escape.backslash.regexp }
13: { name: constant.character.escape.backslash.regexp }
14: { name: constant.character.escape.backslash.regexp }
15: { name: constant.character.escape.backslash.regexp }
16: { name: constant.character.escape.backslash.regexp }
17: { name: constant.character.escape.backslash.regexp }
18: { name: keyword.other.back-reference.regexp }
19: { name: keyword.other.back-reference.regexp }
20: { name: keyword.other.back-reference.regexp }
21: { name: keyword.other.back-reference.regexp }
22: { name: keyword.other.back-reference.regexp }
23: { name: keyword.other.back-reference.regexp }
# These patterns are separated to work around issues like https://github.com/microsoft/vscode-textmate/issues/164
patterns:
# '\g{' NamedOrNumberRef '}'
- match: '(?x)(\\g\{) (?: ((?!\d)\w+) (?:([+-])(\d+))? | ([+-]?\d+) (?:([+-])(\d+))? ) (\})'
captures:
1: { name: constant.character.escape.backslash.regexp }
2: { name: variable.language.group-name.regexp }
3: { name: keyword.operator.recursion-level.regexp }
4: { name: constant.numeric.integer.decimal.regexp }
5: { name: constant.numeric.integer.decimal.regexp }
6: { name: keyword.operator.recursion-level.regexp }
7: { name: constant.numeric.integer.decimal.regexp }
8: { name: constant.character.escape.backslash.regexp }

# '\g' NumberRef
- match: (?x)(\\g) ([+-]?\d+) (?:([+-])(\d+))?
captures:
1: { name: constant.character.escape.backslash.regexp }
2: { name: constant.numeric.integer.decimal.regexp }
3: { name: keyword.operator.recursion-level.regexp }
4: { name: constant.numeric.integer.decimal.regexp }

# '\k<' NamedOrNumberRef '>'
# "\k'" NamedOrNumberRef "'"
# '\g<' NamedOrNumberRef '>'
# "\g'" NamedOrNumberRef "'"
- match: '(?x)(\\[gk](<)|\\[gk]'') (?: ((?!\d)\w+) (?:([+-])(\d+))? | ([+-]?\d+) (?:([+-])(\d+))? ) ((?(2)>|''))'
captures:
1: { name: constant.character.escape.backslash.regexp }
3: { name: variable.language.group-name.regexp }
4: { name: keyword.operator.recursion-level.regexp }
5: { name: constant.numeric.integer.decimal.regexp }
6: { name: constant.numeric.integer.decimal.regexp }
7: { name: keyword.operator.recursion-level.regexp }
8: { name: constant.numeric.integer.decimal.regexp }
9: { name: constant.character.escape.backslash.regexp }

# '\k{' NamedRef '}'
- match: (?x)(\\k\{) ((?!\d)\w+) (?:([+-])(\d+))? (\})
captures:
1: { name: constant.character.escape.backslash.regexp }
2: { name: variable.language.group-name.regexp }
3: { name: keyword.operator.recursion-level.regexp }
4: { name: constant.numeric.integer.decimal.regexp }
5: { name: constant.character.escape.backslash.regexp }

- name: keyword.other.back-reference.regexp
match: \\[1-9][0-9]+

# '(?P=' NamedRef ')'
- match: (?x)(\(\?(?:P[=>]|&)) ((?!\d)\w+) (?:([+-])(\d+))? (\))
captures:
1: { name: keyword.other.back-reference.regexp }
2: { name: variable.language.group-name.regexp }
3: { name: keyword.operator.recursion-level.regexp }
4: { name: constant.numeric.integer.decimal.regexp }
5: { name: keyword.other.back-reference.regexp }

- name: keyword.other.back-reference.regexp
match: \(\?R\)

# '(?' NumberRef ')'
- match: (?x)(\(\?) ([+-]?\d+) (?:([+-])(\d+))? (\))
captures:
1: { name: keyword.other.back-reference.regexp }
2: { name: constant.numeric.integer.decimal.regexp }
3: { name: keyword.operator.recursion-level.regexp }
4: { name: constant.numeric.integer.decimal.regexp }
5: { name: keyword.other.back-reference.regexp }

literals-regular-expression-literal-backtracking-directive-or-global-matching-option:
match: |-
Expand Down
Loading

0 comments on commit efe7774

Please sign in to comment.