|
@@ -469,12 +469,13 @@ export const language = <ILanguage>{
|
|
|
{ include: '@whitespace' },
|
|
|
|
|
|
[
|
|
|
- /[a-zA-Z\-_][\w\-_]+/,
|
|
|
+ /[a-zA-Z\-_][\w\-_]*/,
|
|
|
{
|
|
|
cases: {
|
|
|
'@keywords': 'keyword',
|
|
|
'@builtinFunctions': 'type.identifier',
|
|
|
'@builtinFileHandlers': 'variable.predefined',
|
|
|
+ '@quoteLikeOps': { token: '@rematch', next: 'quotedConstructs' },
|
|
|
'@default': '',
|
|
|
},
|
|
|
},
|
|
@@ -547,6 +548,75 @@ export const language = <ILanguage>{
|
|
|
[/./, 'string'],
|
|
|
],
|
|
|
|
|
|
+ // Quoted constructs
|
|
|
+ // Percent strings in Ruby are similar to quote-like operators in Perl.
|
|
|
+ // This is adapted from pstrings in ../ruby/ruby.ts.
|
|
|
+ quotedConstructs: [
|
|
|
+ [/(q|qw|tr|y)\s*\(/, { token: 'string.delim', switchTo: '@qstring.(.)' }],
|
|
|
+ [/(q|qw|tr|y)\s*\[/, { token: 'string.delim', switchTo: '@qstring.[.]' }],
|
|
|
+ [/(q|qw|tr|y)\s*\{/, { token: 'string.delim', switchTo: '@qstring.{.}' }],
|
|
|
+ [/(q|qw|tr|y)\s*</, { token: 'string.delim', switchTo: '@qstring.<.>' }],
|
|
|
+ [/(q|qw|tr|y)#/, { token: 'string.delim', switchTo: '@qstring.#.#' }],
|
|
|
+ [/(q|qw|tr|y)\s*([^A-Za-z0-9#\s])/, { token: 'string.delim', switchTo: '@qstring.$2.$2' }],
|
|
|
+ [/(q|qw|tr|y)\s+(\w)/, { token: 'string.delim', switchTo: '@qstring.$2.$2' }],
|
|
|
+
|
|
|
+ [/(qr|m|s)\s*\(/, { token: 'regexp.delim', switchTo: '@qregexp.(.)' }],
|
|
|
+ [/(qr|m|s)\s*\[/, { token: 'regexp.delim', switchTo: '@qregexp.[.]' }],
|
|
|
+ [/(qr|m|s)\s*\{/, { token: 'regexp.delim', switchTo: '@qregexp.{.}' }],
|
|
|
+ [/(qr|m|s)\s*</, { token: 'regexp.delim', switchTo: '@qregexp.<.>' }],
|
|
|
+ [/(qr|m|s)#/, { token: 'regexp.delim', switchTo: '@qregexp.#.#' }],
|
|
|
+ [/(qr|m|s)\s*([^A-Za-z0-9_#\s])/, { token: 'regexp.delim', switchTo: '@qregexp.$2.$2' }],
|
|
|
+ [/(qr|m|s)\s+(\w)/, { token: 'regexp.delim', switchTo: '@qregexp.$2.$2' }],
|
|
|
+
|
|
|
+ [/(qq|qx)\s*\(/, { token: 'string.delim', switchTo: '@qqstring.(.)' }],
|
|
|
+ [/(qq|qx)\s*\[/, { token: 'string.delim', switchTo: '@qqstring.[.]' }],
|
|
|
+ [/(qq|qx)\s*\{/, { token: 'string.delim', switchTo: '@qqstring.{.}' }],
|
|
|
+ [/(qq|qx)\s*</, { token: 'string.delim', switchTo: '@qqstring.<.>' }],
|
|
|
+ [/(qq|qx)#/, { token: 'string.delim', switchTo: '@qqstring.#.#' }],
|
|
|
+ [/(qq|qx)\s*([^A-Za-z0-9#\s])/, { token: 'string.delim', switchTo: '@qqstring.$2.$2' }],
|
|
|
+ [/(qq|qx)\s+(\w)/, { token: 'string.delim', switchTo: '@qqstring.$2.$2' }],
|
|
|
+ ],
|
|
|
+
|
|
|
+ // Non-expanded quoted string
|
|
|
+ // qstring<open>.<close>
|
|
|
+ // open = open delimiter
|
|
|
+ // close = close delimiter
|
|
|
+ qstring: [
|
|
|
+ [/\\./, 'string.escape'],
|
|
|
+ [/./, {
|
|
|
+ cases: {
|
|
|
+ '$#==$S3': { token: 'string.delim', next: '@pop' },
|
|
|
+ '$#==$S2': { token: 'string.delim', next: '@push' }, // nested delimiters
|
|
|
+ '@default': 'string'
|
|
|
+ }
|
|
|
+ }],
|
|
|
+ ],
|
|
|
+
|
|
|
+ // Quoted regexp
|
|
|
+ // qregexp.<open>.<close>
|
|
|
+ // open = open delimiter
|
|
|
+ // close = close delimiter
|
|
|
+ qregexp: [
|
|
|
+ { include: '@variables' },
|
|
|
+ [/\\./, 'regexp.escape'],
|
|
|
+ [/./, {
|
|
|
+ cases: {
|
|
|
+ '$#==$S3': { token: 'regexp.delim', next: '@pop' },
|
|
|
+ '$#==$S2': { token: 'regexp.delim', next: '@push' }, // nested delimiters
|
|
|
+ '@default': 'regexp'
|
|
|
+ }
|
|
|
+ }],
|
|
|
+ ],
|
|
|
+
|
|
|
+ // Expanded quoted string
|
|
|
+ // qqstring.<open>.<close>
|
|
|
+ // open = open delimiter
|
|
|
+ // close = close delimiter
|
|
|
+ qqstring: [
|
|
|
+ { include: '@variables' },
|
|
|
+ { include: '@qstring' },
|
|
|
+ ],
|
|
|
+
|
|
|
heredoc: [
|
|
|
[
|
|
|
/<<\s*['"`]?([\w\-]+)['"`]?/,
|