2018-09-05 23:29:41 +02:00
%YAML 1.2
---
# http://www.sublimetext.com/docs/3/syntax.html
name : Crystal
comment : |
TODO: unresolved issues
text:
"p << end
print me!
end"
symptoms:
not recognized as a heredoc
solution:
there is no way to distinguish perfectly between the << operator and the start
of a heredoc. Currently, we require assignment to recognize a heredoc. More
refinement is possible.
• Heredocs with indented terminators (<<-) are always distinguishable, however.
• Nested heredocs are not really supportable at present
text:
print <<-'THERE'
This is single quoted.
The above used #{Time.now}
THERE
symtoms:
From Programming Ruby p306; should be a non-interpolated heredoc.
text:
"a\332a"
symptoms:
'\332' is not recognized as slash3.. which should be octal 332.
solution:
plain regexp.. should be easy.
text:
val?(a):p(b)
val?'a':'b'
symptoms:
':p' is recognized as a symbol.. its 2 things ':' and 'p'.
:'b' has same problem.
solution:
ternary operator rule, precedence stuff, symbol rule.
but also consider 'a.b?(:c)' ??
file_extensions :
- cr
first_line_match : ^#!/.*\bcrystal
scope : source.crystal
contexts :
main :
- match : |-
(?x)
^
\s*
(abstract)?
\s*
(class|struct|union)
\s+
(
(
[.A-Z_:\x{80}-\x{10FFFF}][.\w:\x{80}-\x{10FFFF}]*
(\(([,\s.a-zA-Z0-9_:\x{80}-\x{10FFFF}]+)\))?
(
\s*(<)\s*
[.:A-Z\x{80}-\x{10FFFF}][.:\w\x{80}-\x{10FFFF}]*
(\(([.a-zA-Z0-9_:]+\s,)\))?
)?
)|(
(<<)
\s*
[.A-Z0-9_:\x{80}-\x{10FFFF}]+
)
)
scope : meta.class.crystal
captures :
1 : keyword.control.class.crystal
2 : keyword.control.class.crystal
3 : entity.name.type.class.crystal
5 : punctuation.separator.crystal
6 : support.class.other.type-param.crystal
7 : entity.other.inherited-class.crystal
8 : punctuation.separator.crystal
9 : punctuation.separator.crystal
10 : support.class.other.type-param.crystal
11 : punctuation.definition.variable.crystal
- match : '^\s*(module)\s+(([A-Z\x{80}-\x{10FFFF}][\w\x{80}-\x{10FFFF}]*(::))?([A-Z\x{80}-\x{10FFFF}][\w\x{80}-\x{10FFFF}]*(::))?([A-Z\x{80}-\x{10FFFF}][\w\x{80}-\x{10FFFF}]*(::))*[A-Z\x{80}-\x{10FFFF}][\w\x{80}-\x{10FFFF}]*)'
scope : meta.module.crystal
captures :
1 : keyword.control.module.crystal
2 : entity.name.type.module.crystal
3 : entity.other.inherited-class.module.first.crystal
4 : punctuation.separator.inheritance.crystal
5 : entity.other.inherited-class.module.second.crystal
6 : punctuation.separator.inheritance.crystal
7 : entity.other.inherited-class.module.third.crystal
8 : punctuation.separator.inheritance.crystal
- match : '^\s*(lib)\s+(([A-Z]\w*(::))?([A-Z]\w*(::))?([A-Z]\w*(::))*[A-Z]\w*)'
scope : meta.lib.crystal
captures :
1 : keyword.control.lib.crystal
2 : entity.name.type.lib.crystal
3 : entity.other.inherited-class.lib.first.crystal
4 : punctuation.separator.inheritance.crystal
5 : entity.other.inherited-class.lib.second.crystal
6 : punctuation.separator.inheritance.crystal
7 : entity.other.inherited-class.lib.third.crystal
8 : punctuation.separator.inheritance.crystal
- match : (?<!\.)\belse(\s)+if\b
comment : else if is a common mistake carried over from other languages. it works if you put in a second end, but it’ s never what you want.
scope : invalid.deprecated.crystal
2020-06-01 09:54:34 +02:00
- match : '(?<!\.)\b(BEGIN|alias|as|begin|case|select|abstract|class|END|ensure|for|fun|if|ifdef|in|lib|module|of|out|private|protected|rescue|struct|with|union|enum|macro|then|unless|until|while)\b(?![?!])|(?<!\.)\btype\b\s*(?=[A-Z])'
2018-09-05 23:29:41 +02:00
comment : everything being a reserved word, not a value and needing a 'end' is a..
scope : keyword.control.primary.crystal
- match : '(?<!\.)\b(when|else|elsif)\b(?![?!])'
comment : everything being a reserved word, not a value and needing a 'end' is a..
scope : keyword.control.secondary.crystal
- match : '(?<!\.)\b(end)\b(?![?!])'
comment : Give the end keyword an additional scope
scope : keyword.control.secondary.end.crystal
- match : (?<!\.)\bdo\b\s*
comment : contextual smart pair support for block parameters
scope : keyword.control.start-block.crystal
- match : '(?<=\{)(\s+)'
comment : contextual smart pair support
scope : meta.syntax.crystal.start-block
- match : (?<!\.)\b(and|not|or)\b
comment : as above, just doesn't need a 'end' and does a logic operation
scope : keyword.operator.logical.crystal
- match : '(?<!\.)\b(alias|alias_method|break|next|pointerof|typeof|sizeof|instance_sizeof|return|super|yield|uninitialized|forall)\b(?![?!])'
comment : just as above but being not a logical operation
scope : keyword.control.pseudo-method.crystal
- match : '\b(nil|true|false)\b(?![?!])'
scope : constant.language.crystal
2020-06-01 09:54:34 +02:00
- match : '\b(__(DIR|FILE|LINE|END_LINE)__|self)\b(?![?!])|self[?]'
2018-09-05 23:29:41 +02:00
scope : variable.language.crystal
2019-12-09 23:38:57 +01:00
- match : '\b(initialize|new|loop|include|extend|raise|getter|setter|property|class_getter|class_setter|class_property|describe|context|it|with|delegate|def_hash|def_equals|def_equals_and_hash|forward_missing_to|record|assert_responds_to|spawn|annotation|verbatim)\b[!?]?'
2018-09-05 23:29:41 +02:00
comment : everything being a method but having a special function is a..
scope : keyword.control.special-method.crystal
- match : \b(require)\b
captures :
1 : keyword.control.special-method.crystal
push :
- meta_scope : meta.require.crystal
- match : $|(?=#)
captures :
1 : keyword.control.special-method.crystal
pop : true
- include : main
- match : '(@)[a-zA-Z_\x{80}-\x{10FFFF}][\w\x{80}-\x{10FFFF}]*[?!=]?'
scope : variable.other.readwrite.instance.crystal
captures :
1 : punctuation.definition.variable.crystal
- match : '(@@)[a-zA-Z_\x{80}-\x{10FFFF}][\w\x{80}-\x{10FFFF}]*[?!=]?'
scope : variable.other.readwrite.class.crystal
captures :
1 : punctuation.definition.variable.crystal
- match : '(\$)[a-zA-Z_]\w*'
scope : variable.other.readwrite.global.crystal
captures :
1 : punctuation.definition.variable.crystal
- match : '(\$)(!|@|&|`|''|\+|\d+|~|=|/|\\|,|;|\.|<|>|_|\*|\$|\?|:|"|-[0adFiIlpv])'
scope : variable.other.readwrite.global.pre-defined.crystal
captures :
1 : punctuation.definition.variable.crystal
- match : '\b(ENV)\['
captures :
1 : variable.other.constant.crystal
push :
- meta_scope : meta.environment-variable.crystal
- match : '\]'
pop : true
- include : main
- match : '\b[A-Z\x{80}-\x{10FFFF}][\w\x{80}-\x{10FFFF}]*'
scope : support.class.crystal
- match : '\b[A-Z\x{80}-\x{10FFFF}][\w\x{80}-\x{10FFFF}]*\b'
scope : variable.other.constant.crystal
- match : |-
(?x)
(?=def\b) # an optimization to help Oniguruma fail fast
(?<=^|\s)(def)\s+ # the def keyword
( (?>[a-zA-Z_\x{80}-\x{10FFFF}][\x{80}-\x{10FFFF}\w]*(?>\.|::))? # a method name prefix
(?>[a-zA-Z_\x{80}-\x{10FFFF}][\x{80}-\x{10FFFF}\w]*(?>[?!]|=(?!>))? # the method name
2019-12-09 23:38:57 +01:00
|===?|>[>=]?|<=>|<[<=]?|[%&`/\|]|\*\*?|=?~|[-+]@?|\[\](?:=|\?)?) ) # …or an operator method
2018-09-05 23:29:41 +02:00
\s*(\() # the openning parenthesis for arguments
comment : the method pattern comes from the symbol pattern, see there for a explaination
captures :
1 : keyword.control.def.crystal
2 : entity.name.function.crystal
3 : punctuation.definition.parameters.crystal
push :
- meta_scope : meta.function.method.with-arguments.crystal
- meta_content_scope : variable.parameter.function.crystal
2020-06-01 09:54:34 +02:00
- match : \)
2018-09-05 23:29:41 +02:00
captures :
0 : punctuation.definition.parameters.crystal
pop : true
- include : main
- match : |-
(?x)
(?=def\b) # an optimization to help Oniguruma fail fast
(?<=^|\s)(def)\s+ # the def keyword
( (?>[a-zA-Z_\x{80}-\x{10FFFF}][\w\x{80}-\x{10FFFF}]*(?>\.|::))? # a method name prefix
(?>[a-zA-Z_\x{80}-\x{10FFFF}][\w\x{80}-\x{10FFFF}]*(?>[?!]|=(?!>))? # the method name
2019-12-09 23:38:57 +01:00
|===?|>[>=]?|<=>|<[<=]?|[%&`/\|]|\*\*?|=?~|[-+]@?|\[\](?:=|\?)?) ) # …or an operator method
2018-09-05 23:29:41 +02:00
[ \t] # the space separating the arguments
(?=[ \t]*[^\s#;]) # make sure arguments and not a comment follow
comment : same as the previous rule, but without parentheses around the arguments
captures :
1 : keyword.control.def.crystal
2 : entity.name.function.crystal
push :
- meta_scope : meta.function.method.with-arguments.crystal
- meta_content_scope : variable.parameter.function.crystal
- match : $
pop : true
- include : main
- match : |-
(?x)
(?=def\b) # an optimization to help Oniguruma fail fast
(?<=^|\s)(def)\b # the def keyword
( \s+ # an optional group of whitespace followed by…
( (?>[a-zA-Z_\x{80}-\x{10FFFF}][\w\x{80}-\x{10FFFF}]*(?>\.|::))? # a method name prefix
(?>[a-zA-Z_\x{80}-\x{10FFFF}][\w\x{80}-\x{10FFFF}]*(?>[?!]|=(?!>))? # the method name
2019-12-09 23:38:57 +01:00
|===?|>[>=]?|<=>|<[<=]?|[%&`/\|]|\*\*?|=?~|[-+]@?|\[\](?:=|\?)?) ) )? # …or an operator method
2018-09-05 23:29:41 +02:00
comment : the optional name is just to catch the def also without a method-name
scope : meta.function.method.without-arguments.crystal
captures :
1 : keyword.control.def.crystal
3 : entity.name.function.crystal
- match : '\b(0[xX]\h(?>_?\h)*|\d(?>_?\d)*(\.(?![^[:space:][:digit:]])(?>_?\d)*)?([eE][-+]?\d(?>_?\d)*)?|0[bB][01]+|0o[0-7]+)(_?(u8|u16|u32|u64|i8|i16|i32|i64|f32|f64))?\b'
scope : constant.numeric.crystal
- match : ":'"
captures :
0 : punctuation.definition.constant.crystal
push :
- meta_scope : constant.other.symbol.single-quoted.crystal
- match : "'"
captures :
0 : punctuation.definition.constant.crystal
pop : true
- match : '\\[''\\]'
scope : constant.character.escape.crystal
- match : ':"'
captures :
0 : punctuation.definition.constant.crystal
push :
- meta_scope : constant.other.symbol.double-quoted.crystal
- match : '"'
captures :
0 : punctuation.definition.constant.crystal
pop : true
- include : interpolated_crystal
- include : escaped_char
- match : /=
comment : Needs higher precidence than regular expressions.
scope : keyword.operator.assignment.augmented.crystal
- match : "'"
comment : single quoted string (does not allow interpolation)
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.quoted.single.crystal
- match : "'"
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- match : \\'|\\\\
scope : constant.character.escape.crystal
- match : '"'
comment : double quoted string (allows for interpolation)
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.quoted.double.crystal
- match : '"'
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : interpolated_crystal
- include : escaped_char
- match : "`"
comment : execute string (allows for interpolation)
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.interpolated.crystal
- match : "`"
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : interpolated_crystal
- include : escaped_char
- match : '%x\{'
comment : execute string (allow for interpolation)
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.interpolated.crystal
- match : '\}'
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : interpolated_crystal
- include : escaped_char
- include : nest_curly_i
- match : '%x\['
comment : execute string (allow for interpolation)
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.interpolated.crystal
- match : '\]'
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : interpolated_crystal
- include : escaped_char
- include : nest_brackets_i
- match : '%x\<'
comment : execute string (allow for interpolation)
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.interpolated.crystal
- match : \>
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : interpolated_crystal
- include : escaped_char
- include : nest_ltgt_i
- match : '%x\('
comment : execute string (allow for interpolation)
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.interpolated.crystal
- match : \)
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : interpolated_crystal
- include : escaped_char
- include : nest_parens_i
- match : '%x([^\w])'
comment : execute string (allow for interpolation)
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.interpolated.crystal
- match : \1
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : interpolated_crystal
- include : escaped_char
- match : |-
(?x)
(?:
^ # beginning of line
| (?<= # or look-behind on:
[=>~(?:\[,|&;]
| [\s;]if\s # keywords
| [\s;]elsif\s
| [\s;]while\s
| [\s;]unless\s
| [\s;]when\s
| [\s;]assert_match\s
| [\s;]or\s # boolean opperators
| [\s;]and\s
| [\s;]not\s
| [\s.]index\s # methods
| [\s.]scan\s
| [\s.]sub\s
| [\s.]sub!\s
| [\s.]gsub\s
| [\s.]gsub!\s
| [\s.]match\s
)
| (?<= # or a look-behind with line anchor:
^when\s # duplication necessary due to limits of regex
| ^if\s
| ^elsif\s
| ^while\s
| ^unless\s
)
)
\s*((/))(?![*+{}?])
comment : |
regular expressions (normal)
we only start a regexp if the character before it (excluding whitespace)
is what we think is before a regexp
captures :
1 : string.regexp.classic.crystal
2 : punctuation.definition.string.crystal
push :
- meta_content_scope : string.regexp.classic.crystal
- match : "((/[eimnosux]*))"
captures :
1 : string.regexp.classic.crystal
2 : punctuation.definition.string.crystal
pop : true
- include : regex_sub
- match : '%r\{'
comment : regular expressions (literal)
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.regexp.mod-r.crystal
- match : '\}[eimnosux]*'
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : regex_sub
- include : nest_curly_r
- match : '%r\['
comment : regular expressions (literal)
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.regexp.mod-r.crystal
- match : '\][eimnosux]*'
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : regex_sub
- include : nest_brackets_r
- match : '%r\('
comment : regular expressions (literal)
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.regexp.mod-r.crystal
- match : '\)[eimnosux]*'
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : regex_sub
- include : nest_parens_r
- match : '%r\<'
comment : regular expressions (literal)
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.regexp.mod-r.crystal
- match : '\>[eimnosux]*'
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : regex_sub
- include : nest_ltgt_r
- match : '%r([^\w])'
comment : regular expressions (literal)
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.regexp.mod-r.crystal
- match : '\1[eimnosux]*'
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : regex_sub
- match : '%[QWSR]?\('
comment : literal capable of interpolation ()
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.quoted.other.literal.upper.crystal
- match : \)
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : interpolated_crystal
- include : escaped_char
- include : nest_parens_i
- match : '%[QWSR]?\['
comment : "literal capable of interpolation []"
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.quoted.other.literal.upper.crystal
- match : '\]'
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : interpolated_crystal
- include : escaped_char
- include : nest_brackets_i
- match : '%[QWSR]?\<'
comment : literal capable of interpolation <>
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.quoted.other.literal.upper.crystal
- match : \>
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : interpolated_crystal
- include : escaped_char
- include : nest_ltgt_i
- match : '%[QWSR]?\{'
comment : "literal capable of interpolation -- {}"
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.quoted.double.crystal.mod
- match : '\}'
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : interpolated_crystal
- include : escaped_char
- include : nest_curly_i
- match : '%[QWSR]([^\w])'
comment : literal capable of interpolation -- wildcard
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.quoted.other.literal.upper.crystal
- match : \1
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : interpolated_crystal
- include : escaped_char
- match : '%[qws]\('
comment : literal incapable of interpolation -- ()
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.quoted.other.literal.lower.crystal
- match : \)
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- match : \\\)|\\\\
scope : constant.character.escape.crystal
- include : nest_parens
- match : '%[qws]\<'
comment : literal incapable of interpolation -- <>
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.quoted.other.literal.lower.crystal
- match : \>
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- match : \\\>|\\\\
scope : constant.character.escape.crystal
- include : nest_ltgt
- match : '%[qws]\['
comment : "literal incapable of interpolation -- []"
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.quoted.other.literal.lower.crystal
- match : '\]'
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- match : '\\\]|\\\\'
scope : constant.character.escape.crystal
- include : nest_brackets
- match : '%[qws]\{'
comment : "literal incapable of interpolation -- {}"
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.quoted.other.literal.lower.crystal
- match : '\}'
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- match : '\\\}|\\\\'
scope : constant.character.escape.crystal
- include : nest_curly
- match : '%[qws]([^\w])'
comment : literal incapable of interpolation -- wildcard
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.quoted.other.literal.lower.crystal
- match : \1
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- match : \\.
comment : Cant be named because its not neccesarily an escape.
2019-12-09 23:38:57 +01:00
- match : '(?<!:)(:)(?>[a-zA-Z_\x{80}-\x{10FFFF}][\w\x{80}-\x{10FFFF}]*(?>[?!]|=(?![>=]))?|===?|>[>=]?|<[<=]?|<=>|[%&`/\|]|\*\*?|=?~|[-+]@?|\[\](?:=|\?)?|@@?[a-zA-Z_\x{80}-\x{10FFFF}][\w\x{80}-\x{10FFFF}]*|!=?(?![?!]))'
2018-09-05 23:29:41 +02:00
comment : symbols
scope : constant.other.symbol.crystal
captures :
1 : punctuation.definition.constant.crystal
- match : '(?>[a-zA-Z_\x{80}-\x{10FFFF}][\w\x{80}-\x{10FFFF}]*(?>[?!])?)(:)(?!:)'
comment : symbols
scope : constant.other.symbol.crystal.19syntax
captures :
1 : punctuation.definition.constant.crystal
- match : '(?:^[ \t]+)?(#).*$\n?'
scope : comment.line.number-sign.crystal
captures :
1 : punctuation.definition.comment.crystal
- match : ^__END__\n
comment : __END__ marker
captures :
0 : string.unquoted.program-block.crystal
push :
- meta_content_scope : text.plain
- match : (?=not)impossible
captures :
0 : string.unquoted.program-block.crystal
pop : true
- match : (?=<?xml|<(?i:html\b)|!DOCTYPE (?i:html\b))
push :
- meta_scope : text.html.embedded.crystal
- match : (?=not)impossible
pop : true
- include : scope:text.html.basic
- match : '(?><<-("?)((?:[_\w]+_|)HTML)\b\1)'
comment : heredoc with embedded HTML and indented terminator
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.unquoted.embedded.html.crystal
- meta_content_scope : text.html.embedded.crystal
- match : \s*\2$
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : heredoc
- include : scope:text.html.basic
- include : interpolated_crystal
- include : escaped_char
- match : '(?><<-("?)((?:[_\w]+_|)SQL)\b\1)'
comment : heredoc with embedded SQL and indented terminator
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.unquoted.embedded.sql.crystal
- meta_content_scope : text.sql.embedded.crystal
- match : \s*\2$
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : heredoc
- include : scope:source.sql
- include : interpolated_crystal
- include : escaped_char
- match : '(?><<-("?)((?:[_\w]+_|)CSS)\b\1)'
comment : heredoc with embedded css and intented terminator
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.unquoted.embedded.css.crystal
- meta_content_scope : text.css.embedded.crystal
- match : \s*\2$
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : heredoc
- include : scope:source.css
- include : interpolated_crystal
- include : escaped_char
- match : '(?><<-("?)((?:[_\w]+_|)CPP)\b\1)'
comment : heredoc with embedded c++ and intented terminator
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.unquoted.embedded.cplusplus.crystal
- meta_content_scope : text.c++.embedded.crystal
- match : \s*\2$
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : heredoc
- include : scope:source.c++
- include : interpolated_crystal
- include : escaped_char
- match : '(?><<-("?)((?:[_\w]+_|)C)\b\1)'
comment : heredoc with embedded c++ and intented terminator
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.unquoted.embedded.c.crystal
- meta_content_scope : text.c.embedded.crystal
- match : \s*\2$
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : heredoc
- include : scope:source.c
- include : interpolated_crystal
- include : escaped_char
- match : '(?><<-("?)((?:[_\w]+_|)(?:JS|JAVASCRIPT))\b\1)'
comment : heredoc with embedded javascript and intented terminator
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.unquoted.embedded.js.crystal
- meta_content_scope : text.js.embedded.crystal
- match : \s*\2$
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : heredoc
2020-06-01 09:54:34 +02:00
- include : scope:text.html.basic
2018-09-05 23:29:41 +02:00
- include : scope:source.js
- include : interpolated_crystal
- include : escaped_char
- match : '(?><<-("?)((?:[_\w]+_|)JQUERY)\b\1)'
comment : heredoc with embedded javascript and intented terminator
captures :
0 : punctuation.definition.string.begin.crystal
push :
2019-12-09 23:38:57 +01:00
- meta_scope : string.unquoted.embedded.js.crystal
- meta_content_scope : text.js.embedded.crystal
2018-09-05 23:29:41 +02:00
- match : \s*\2$
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : heredoc
2019-12-09 23:38:57 +01:00
- include : scope:source.js
2018-09-05 23:29:41 +02:00
- include : interpolated_crystal
- include : escaped_char
- match : '(?><<-("?)((?:[_\w]+_|)(?:SH|SHELL))\b\1)'
comment : heredoc with embedded shell and intented terminator
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.unquoted.embedded.shell.crystal
- meta_content_scope : text.shell.embedded.crystal
- match : \s*\2$
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : heredoc
- include : scope:source.shell
- include : interpolated_crystal
- include : escaped_char
- match : '(?><<-("?)((?:[_\w]+_|)RUBY)\b\1)'
comment : heredoc with embedded crystal and intented terminator
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.unquoted.embedded.crystal.crystal
- meta_content_scope : text.crystal.embedded.crystal
- match : \s*\2$
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : heredoc
- include : scope:source.crystal
- include : interpolated_crystal
- include : escaped_char
- match : (?>\=\s*<<(\w+))
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.unquoted.heredoc.crystal
- match : ^\1$
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : heredoc
- include : interpolated_crystal
- include : escaped_char
- match : (?><<-(\w+))
comment : heredoc with indented terminator
captures :
0 : punctuation.definition.string.begin.crystal
push :
- meta_scope : string.unquoted.heredoc.crystal
- match : \s*\1$
captures :
0 : punctuation.definition.string.end.crystal
pop : true
- include : heredoc
- include : interpolated_crystal
- include : escaped_char
- match : '(?<=\{|do|\{\s|do\s)(\|)'
captures :
1 : punctuation.separator.variable.crystal
push :
- match : (\|)
captures :
1 : punctuation.separator.variable.crystal
pop : true
- match : "[_a-zA-Z][_a-zA-Z0-9]*"
scope : variable.other.block.crystal
- match : ","
scope : punctuation.separator.variable.crystal
- match : "=>"
scope : punctuation.separator.key-value
- match : '<<=|%=|&=|\*=|\*\*=|\+=|\-=|\^=|\|{1,2}=|<<'
scope : keyword.operator.assignment.augmented.crystal
- match : '<=>|<(?!<|=)|>(?!<|=|>)|<=|>=|===|==|=~|!=|!~|(?<=[ \t])\?'
scope : keyword.operator.comparison.crystal
- match : '(?<=[ \t])!+|\bnot\b|&&|\band\b|\|\||\bor\b|\^'
scope : keyword.operator.logical.crystal
- match : '(\{\%|\%\}|\{\{|\}\})'
scope : keyword.operator.macro.crystal
- match : (%|&|\*\*|\*|\+|\-|/)
scope : keyword.operator.arithmetic.crystal
- match : "="
scope : keyword.operator.assignment.crystal
- match : \||~|>>
scope : keyword.operator.other.crystal
- match : ":"
scope : punctuation.separator.other.crystal
- match : \;
scope : punctuation.separator.statement.crystal
- match : ","
scope : punctuation.separator.object.crystal
- match : '\.|::'
scope : punctuation.separator.method.crystal
- match : '\{|\}'
scope : punctuation.section.scope.crystal
- match : '\[|\]'
scope : punctuation.section.array.crystal
- match : \(|\)
scope : punctuation.section.function.crystal
escaped_char :
- match : '\\(?:[0-7]{1,3}|x[\da-fA-F]{1,2}|.)'
scope : constant.character.escape.crystal
heredoc :
- match : ^<<-?\w+
push :
- match : $
pop : true
- include : main
interpolated_crystal :
- match : '#\{(\})'
scope : source.crystal.embedded.source
captures :
0 : punctuation.section.embedded.crystal
1 : source.crystal.embedded.source.empty
- match : '#\{'
captures :
0 : punctuation.section.embedded.crystal
push :
- meta_scope : source.crystal.embedded.source
- match : '\}'
captures :
0 : punctuation.section.embedded.crystal
pop : true
- include : nest_curly_and_self
- include : main
- match : '(#@)[a-zA-Z_]\w*'
scope : variable.other.readwrite.instance.crystal
captures :
1 : punctuation.definition.variable.crystal
- match : '(#@@)[a-zA-Z_]\w*'
scope : variable.other.readwrite.class.crystal
captures :
1 : punctuation.definition.variable.crystal
- match : '(#\$)[a-zA-Z_]\w*'
scope : variable.other.readwrite.global.crystal
captures :
1 : punctuation.definition.variable.crystal
nest_brackets :
- match : '\['
captures :
0 : punctuation.section.scope.crystal
push :
- match : '\]'
captures :
0 : punctuation.section.scope.crystal
pop : true
- include : nest_brackets
nest_brackets_i :
- match : '\['
captures :
0 : punctuation.section.scope.crystal
push :
- match : '\]'
captures :
0 : punctuation.section.scope.crystal
pop : true
- include : interpolated_crystal
- include : escaped_char
- include : nest_brackets_i
nest_brackets_r :
- match : '\['
captures :
0 : punctuation.section.scope.crystal
push :
- match : '\]'
captures :
0 : punctuation.section.scope.crystal
pop : true
- include : regex_sub
- include : nest_brackets_r
nest_curly :
- match : '\{'
captures :
0 : punctuation.section.scope.crystal
push :
- match : '\}'
captures :
0 : punctuation.section.scope.crystal
pop : true
- include : nest_curly
nest_curly_and_self :
- match : '\{'
captures :
0 : punctuation.section.scope.crystal
push :
- match : '\}'
captures :
0 : punctuation.section.scope.crystal
pop : true
- include : nest_curly_and_self
- include : main
nest_curly_i :
- match : '\{'
captures :
0 : punctuation.section.scope.crystal
push :
- match : '\}'
captures :
0 : punctuation.section.scope.crystal
pop : true
- include : interpolated_crystal
- include : escaped_char
- include : nest_curly_i
nest_curly_r :
- match : '\{'
captures :
0 : punctuation.section.scope.crystal
push :
- match : '\}'
captures :
0 : punctuation.section.scope.crystal
pop : true
- include : regex_sub
- include : nest_curly_r
nest_ltgt :
- match : \<
captures :
0 : punctuation.section.scope.crystal
push :
- match : \>
captures :
0 : punctuation.section.scope.crystal
pop : true
- include : nest_ltgt
nest_ltgt_i :
- match : \<
captures :
0 : punctuation.section.scope.crystal
push :
- match : \>
captures :
0 : punctuation.section.scope.crystal
pop : true
- include : interpolated_crystal
- include : escaped_char
- include : nest_ltgt_i
nest_ltgt_r :
- match : \<
captures :
0 : punctuation.section.scope.crystal
push :
- match : \>
captures :
0 : punctuation.section.scope.crystal
pop : true
- include : regex_sub
- include : nest_ltgt_r
nest_parens :
- match : \(
captures :
0 : punctuation.section.scope.crystal
push :
- match : \)
captures :
0 : punctuation.section.scope.crystal
pop : true
- include : nest_parens
nest_parens_i :
- match : \(
captures :
0 : punctuation.section.scope.crystal
push :
- match : \)
captures :
0 : punctuation.section.scope.crystal
pop : true
- include : interpolated_crystal
- include : escaped_char
- include : nest_parens_i
nest_parens_r :
- match : \(
captures :
0 : punctuation.section.scope.crystal
push :
- match : \)
captures :
0 : punctuation.section.scope.crystal
pop : true
- include : regex_sub
- include : nest_parens_r
regex_sub :
- include : interpolated_crystal
- include : escaped_char
- match : '(\{)\d+(,\d+)?(\})'
scope : string.regexp.arbitrary-repitition.crystal
captures :
1 : punctuation.definition.arbitrary-repitition.crystal
3 : punctuation.definition.arbitrary-repitition.crystal
- match : '\[(?:\^?\])?'
captures :
0 : punctuation.definition.character-class.crystal
push :
- meta_scope : string.regexp.character-class.crystal
- match : '\]'
captures :
0 : punctuation.definition.character-class.crystal
pop : true
- include : escaped_char
- match : \(
captures :
0 : punctuation.definition.group.crystal
push :
- meta_scope : string.regexp.group.crystal
- match : \)
captures :
0 : punctuation.definition.group.crystal
pop : true
- include : regex_sub
- match : '(?<=^|\s)(#)\s[[a-zA-Z0-9,. \t?!-][^\x{00}-\x{7F}]]*$'
comment : We are restrictive in what we allow to go after the comment character to avoid false positives, since the availability of comments depend on regexp flags.
scope : comment.line.number-sign.crystal
captures :
1 : punctuation.definition.comment.crystal