Skip to content

Commit

Permalink
Add initial support for raw string literals
Browse files Browse the repository at this point in the history
  • Loading branch information
dkearns committed Nov 14, 2022
1 parent 3b075e0 commit ad374a3
Show file tree
Hide file tree
Showing 2 changed files with 122 additions and 1 deletion.
27 changes: 26 additions & 1 deletion syntax/cs.vim
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,17 @@ syn match csUnicodeNumber +\\U00\x\{6}+ contained contains=csUnicodeSpecifier di
syn match csUnicodeSpecifier +\\[uUx]+ contained display

syn region csString matchgroup=csQuote start=+"+ end=+"+ end=+$+ extend contains=csSpecialChar,csSpecialError,csUnicodeNumber,@Spell

for s:i in range(3, get(g:, "cs_raw_string_quote_count", 8))
exe 'syn region csRawString' .. s:i .. ' matchgroup=csQuote start=+\z("\{' .. s:i .. '}\)+ end=+\z1+ oneline nextgroup=csRawStringError' .. s:i
exe 'syn region csRawString' .. s:i .. ' matchgroup=csQuote start=+\z("\{' .. s:i .. '}\)\s*$+ end=+^\s*\z1+ nextgroup=csRawStringError' .. s:i .. ' contains=csRawStringError' .. s:i
exe 'syn match csRawStringError' .. s:i .. ' /\%("\{' .. s:i .. '}\)\@' .. s:i .. '<="\+/ contained'
exe 'syn match csRawStringError' .. s:i .. ' /\S.\{-}\s*"\{' .. s:i .. '}"\@!/ contained'
exe 'hi def link csRawString' .. s:i .. ' csString'
exe 'hi def link csRawStringError' .. s:i .. ' Error'
endfor
unlet s:i

syn match csCharacter "'[^']*'" contains=csSpecialChar,csSpecialCharError,csUnicodeNumber display
syn match csCharacter "'\\''" contains=csSpecialChar display
syn match csCharacter "'[^\\]'" display
Expand All @@ -213,12 +224,24 @@ syn match csInterpolationFormat +:[^}]\+}+ contained contains=csInterpolationFor
syn match csInterpolationAlignDel +,+ contained display
syn match csInterpolationFormatDel +:+ contained display

" Interpolated raw string literals
for s:i in range(1, get(g:, "cs_raw_string_interpolation_brace_count", 8))
exe 'syn region csInterpolatedRawString' .. s:i .. ' matchgroup=csQuote start=+$\{' .. s:i .. '}\z("""\+\)+ end=+\z1+ extend contains=csInterpolation' .. s:i .. ',csInterpolationDelimiterError' .. s:i .. ',@Spell'
exe 'syn match csInterpolationDelimiterError' .. s:i .. ' "}\{' .. s:i .. '}" contained'
exe 'syn match csInterpolationDelimiterError' .. s:i .. ' "{\{' .. 2 * s:i .. ',}" contained'
exe 'syn match csInterpolationDelimiterError' .. s:i .. ' "}\{' .. 2 * s:i .. ',}" contained'
exe 'syn region csInterpolation' .. s:i .. ' matchgroup=csInterpolationDelimiter start=+\%({\{' .. s:i .. '}\)\@' .. s:i .. '<!{\{' .. s:i .. '}{\@!+ end=+}\@<!}\{' .. s:i .. '}\%(}\{' .. s:i .. '}\)\@!+ keepend contained contains=@csAll,csBraced,csBracketed,csInterpolationAlign,csInterpolationFormat,csInterpolationDelimiterError' .. s:i
exe 'hi def link csInterpolationDelimiterError' .. s:i .. ' Error'
exe 'hi def link csInterpolatedRawString' .. s:i .. ' csRawString'
endfor
unlet s:i

syn region csVerbatimString matchgroup=csQuote start=+@"+ end=+"+ skip=+""+ extend contains=csVerbatimQuote,@Spell
syn match csVerbatimQuote +""+ contained

syn region csInterVerbString matchgroup=csQuote start=+$@"+ start=+@$"+ end=+"+ skip=+""+ extend contains=csInterpolation,csEscapedInterpolation,csSpecialChar,csSpecialError,csUnicodeNumber,csVerbatimQuote,@Spell

syn cluster csString contains=csString,csInterpolatedString,csVerbatimString,csInterVerbString
syn cluster csString contains=csString,csInterpolatedString,csVerbatimString,csInterVerbString,csRawString

syn cluster csLiteral contains=csBoolean,@csNumber,csCharacter,@csString,csNull

Expand Down Expand Up @@ -278,6 +301,8 @@ hi def link csLogicSymbols Operator
hi def link csSpecialError Error
hi def link csSpecialCharError Error
hi def link csString String
hi def link csRawString csString
hi def link csRawStringError Error
hi def link csQuote String
hi def link csInterpolatedString String
hi def link csVerbatimString String
Expand Down
96 changes: 96 additions & 0 deletions test/strings.vader
Original file line number Diff line number Diff line change
Expand Up @@ -349,3 +349,99 @@ Execute:
AssertEqual 'csQuote', SyntaxAt(2)
AssertEqual 'csQuote', SyntaxAt(3)
AssertEqual 'csInterVerbString', SyntaxAt(4)

Given cs (a single line raw string):
"""a"""

Execute:
AssertEqual 'csQuote', SyntaxOf('"""', 1)
AssertEqual 'csQuote', SyntaxOf('"""', 2)
AssertEqual 'csRawString3', SyntaxOf('a')

Given cs (a multi-line raw string):
"""
a
"""

Execute:
AssertEqual 'csQuote', SyntaxOf('"""', 1)
AssertEqual 'csQuote', SyntaxOf('"""', 2)
AssertEqual 'csRawString3', SyntaxOf('a')

Given cs (an invalid multi-line raw string start delimiter):
""" non-whitespace
42
"""

Execute:
AssertEqual 'csString', SyntaxOf('non-whitespace')
AssertEqual 'csInteger', SyntaxOf('42')

Given cs (an invalid multi-line raw string end delimiter):
"""
a
non-whitespace """

Execute:
AssertEqual 'csQuote', SyntaxOf('"""', 1)
AssertEqual 'csRawString3', SyntaxOf('a')
AssertEqual 'csRawStringError3', SyntaxOf('non-whitespace """')

Given cs (an interpolated raw string - 1 dollar):
$"""
a
{42}
{{42}}
{{{42}}}
b
"""

Execute:
AssertEqual 'csQuote', SyntaxOf('$"""')
AssertEqual 'csInterpolatedRawString1', SyntaxOf('a')
AssertEqual 'csInterpolationDelimiter', SyntaxOf('{')
AssertEqual 'csInteger', SyntaxOf('42')
AssertEqual 'csInterpolationDelimiter', SyntaxOf('}')
AssertEqual 'csInterpolationDelimiterError1', SyntaxOf('{{')
AssertEqual 'csInterpolatedRawString1', SyntaxOf('42', 2)
AssertEqual 'csInterpolationDelimiterError1', SyntaxOf('}}')
AssertEqual 'csInterpolationDelimiterError1', SyntaxOf('{{{')
AssertEqual 'csInterpolatedRawString1', SyntaxOf('42', 3)
AssertEqual 'csInterpolationDelimiterError1', SyntaxOf('}}}')
AssertEqual 'csInterpolatedRawString1', SyntaxOf('b')
AssertEqual 'csQuote', SyntaxOf('"""', 2)

Given cs (an interpolated raw string - 2 dollar):
$$"""
a
{42}
{{42}}
{{{42}}}
{{{{42}}}}
{{{{{42}}}}}
b
"""

Execute:
AssertEqual 'csQuote', SyntaxOf('$"""')
AssertEqual 'csInterpolatedRawString2', SyntaxOf('a')
AssertEqual 'csInterpolatedRawString2', SyntaxOf('{')
AssertEqual 'csInterpolatedRawString2', SyntaxOf('42')
AssertEqual 'csInterpolatedRawString2', SyntaxOf('}')
AssertEqual 'csInterpolationDelimiter', SyntaxOf('{{')
AssertEqual 'csInteger', SyntaxOf('42', 2)
AssertEqual 'csInterpolationDelimiter', SyntaxOf('}}')
AssertEqual 'csInterpolatedRawString2', SyntaxOf('{\ze{{')
AssertEqual 'csInterpolationDelimiter', SyntaxOf('{\zs{{')
AssertEqual 'csInteger', SyntaxOf('42', 3)
AssertEqual 'csInterpolationDelimiter', SyntaxOf('}}\ze}')
AssertEqual 'csInterpolatedRawString2', SyntaxOf('}}\zs}')
AssertEqual 'csInterpolationDelimiterError2', SyntaxOf('{{{{')
AssertEqual 'csInterpolatedRawString2', SyntaxOf('42', 4)
AssertEqual 'csInterpolationDelimiterError2', SyntaxOf('}}}}')
AssertEqual 'csInterpolationDelimiterError2', SyntaxOf('{{{{{')
AssertEqual 'csInterpolatedRawString2', SyntaxOf('42', 5)
AssertEqual 'csInterpolationDelimiterError2', SyntaxOf('}}}}}')
AssertEqual 'csInterpolatedRawString2', SyntaxOf('b')
AssertEqual 'csQuote', SyntaxOf('"""', 2)

0 comments on commit ad374a3

Please sign in to comment.