Commit f08c2f7f7c041d84a04b7c03d4083fa6466bd5cc

Michael Schmidt 2021-04-03T11:36:51

Ruby: Added missing regex interpolation (#2841)

diff --git a/components/prism-ruby.js b/components/prism-ruby.js
index fdb2726..fe4e0ef 100644
--- a/components/prism-ruby.js
+++ b/components/prism-ruby.js
@@ -53,9 +53,12 @@
 				}
 			},
 			{
-				pattern: /(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[gim]{0,3}(?=\s*(?:$|[\r\n,.;})]))/,
+				pattern: /(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[gim]{0,3}(?=\s*(?:$|[\r\n,.;})#]))/,
 				lookbehind: true,
-				greedy: true
+				greedy: true,
+				inside: {
+					'interpolation': interpolation
+				}
 			}
 		],
 		'variable': /[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,
diff --git a/components/prism-ruby.min.js b/components/prism-ruby.min.js
index 6817670..949e439 100644
--- a/components/prism-ruby.min.js
+++ b/components/prism-ruby.min.js
@@ -1 +1 @@
-!function(e){e.languages.ruby=e.languages.extend("clike",{comment:[/#.*/,{pattern:/^=begin\s[\s\S]*?^=end/m,greedy:!0}],"class-name":{pattern:/(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/});var n={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:e.languages.ruby}};delete e.languages.ruby.function,e.languages.insertBefore("ruby","keyword",{regex:[{pattern:RegExp("%r(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1[gim]{0,3}","\\((?:[^()\\\\]|\\\\[^])*\\)[gim]{0,3}","\\{(?:[^#{}\\\\]|#(?:\\{[^}]+\\})?|\\\\[^])*\\}[gim]{0,3}","\\[(?:[^\\[\\]\\\\]|\\\\[^])*\\][gim]{0,3}","<(?:[^<>\\\\]|\\\\[^])*>[gim]{0,3}"].join("|")+")"),greedy:!0,inside:{interpolation:n}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[gim]{0,3}(?=\s*(?:$|[\r\n,.;})]))/,lookbehind:!0,greedy:!0}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:{pattern:/(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/,lookbehind:!0},"method-definition":{pattern:/(\bdef\s+)[\w.]+/,lookbehind:!0,inside:{function:/\w+$/,rest:e.languages.ruby}}}),e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z]\w*(?:[?!]|\b)/}),e.languages.ruby.string=[{pattern:RegExp("%[qQiIwWxs]?(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","\\((?:[^()\\\\]|\\\\[^])*\\)","\\{(?:[^#{}\\\\]|#(?:\\{[^}]+\\})?|\\\\[^])*\\}","\\[(?:[^\\[\\]\\\\]|\\\\[^])*\\]","<(?:[^<>\\\\]|\\\\[^])*>"].join("|")+")"),greedy:!0,inside:{interpolation:n}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:n}}],e.languages.rb=e.languages.ruby}(Prism);
\ No newline at end of file
+!function(e){e.languages.ruby=e.languages.extend("clike",{comment:[/#.*/,{pattern:/^=begin\s[\s\S]*?^=end/m,greedy:!0}],"class-name":{pattern:/(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/});var n={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:e.languages.ruby}};delete e.languages.ruby.function,e.languages.insertBefore("ruby","keyword",{regex:[{pattern:RegExp("%r(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1[gim]{0,3}","\\((?:[^()\\\\]|\\\\[^])*\\)[gim]{0,3}","\\{(?:[^#{}\\\\]|#(?:\\{[^}]+\\})?|\\\\[^])*\\}[gim]{0,3}","\\[(?:[^\\[\\]\\\\]|\\\\[^])*\\][gim]{0,3}","<(?:[^<>\\\\]|\\\\[^])*>[gim]{0,3}"].join("|")+")"),greedy:!0,inside:{interpolation:n}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[gim]{0,3}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:n}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:{pattern:/(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/,lookbehind:!0},"method-definition":{pattern:/(\bdef\s+)[\w.]+/,lookbehind:!0,inside:{function:/\w+$/,rest:e.languages.ruby}}}),e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z]\w*(?:[?!]|\b)/}),e.languages.ruby.string=[{pattern:RegExp("%[qQiIwWxs]?(?:"+["([^a-zA-Z0-9\\s{(\\[<])(?:(?!\\1)[^\\\\]|\\\\[^])*\\1","\\((?:[^()\\\\]|\\\\[^])*\\)","\\{(?:[^#{}\\\\]|#(?:\\{[^}]+\\})?|\\\\[^])*\\}","\\[(?:[^\\[\\]\\\\]|\\\\[^])*\\]","<(?:[^<>\\\\]|\\\\[^])*>"].join("|")+")"),greedy:!0,inside:{interpolation:n}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:n}}],e.languages.rb=e.languages.ruby}(Prism);
\ No newline at end of file
diff --git a/tests/languages/ruby/regex_feature.test b/tests/languages/ruby/regex_feature.test
index 0dee02d..f0fbdfb 100644
--- a/tests/languages/ruby/regex_feature.test
+++ b/tests/languages/ruby/regex_feature.test
@@ -1,45 +1,113 @@
 /[foo]\/bar/gim
 /[bar]/,
 /./i;
+/foo#{bar}/;
 %r!foo?bar#{39+3}!
 %r(foo?bar#{39+3})
 %r{foo?bar#{39+3}}
 %r[foo?bar#{39+3}]
 %r<foo?bar#{39+3}>
 
+/foo/ # comment
+/foo#{bar}/ # comment
+
 ----------------------------------------------------
 
 [
-	["regex", "/[foo]\\/bar/gim"],
-	["regex", "/[bar]/"], ["punctuation", ","],
-	["regex", "/./i"], ["punctuation", ";"],
-	["regex", ["%r!foo?bar", ["interpolation", [
-		["delimiter", "#{"],
-		["number", "39"], ["operator", "+"], ["number", "3"],
-		["delimiter", "}"]
-	]], "!"]],
-	["regex", ["%r(foo?bar", ["interpolation", [
-		["delimiter", "#{"],
-		["number", "39"], ["operator", "+"], ["number", "3"],
-		["delimiter", "}"]
-	]], ")"]],
-	["regex", ["%r{foo?bar", ["interpolation", [
-		["delimiter", "#{"],
-		["number", "39"], ["operator", "+"], ["number", "3"],
-		["delimiter", "}"]
-	]], "}"]],
-	["regex", ["%r[foo?bar", ["interpolation", [
-		["delimiter", "#{"],
-		["number", "39"], ["operator", "+"], ["number", "3"],
-		["delimiter", "}"]
-	]], "]"]],
-	["regex", ["%r<foo?bar", ["interpolation", [
-		["delimiter", "#{"],
-		["number", "39"], ["operator", "+"], ["number", "3"],
-		["delimiter", "}"]
-	]], ">"]]
+	["regex", ["/[foo]\\/bar/gim"]],
+
+	["regex", ["/[bar]/"]],
+	["punctuation", ","],
+
+	["regex", ["/./i"]],
+	["punctuation", ";"],
+
+	["regex", [
+		"/foo",
+		["interpolation", [
+			["delimiter", "#{"],
+			"bar",
+			["delimiter", "}"]
+		]],
+		"/"
+	]],
+	["punctuation", ";"],
+
+	["regex", [
+		"%r!foo?bar",
+		["interpolation", [
+			["delimiter", "#{"],
+			["number", "39"],
+			["operator", "+"],
+			["number", "3"],
+			["delimiter", "}"]
+		]],
+		"!"
+	]],
+
+	["regex", [
+		"%r(foo?bar",
+		["interpolation", [
+			["delimiter", "#{"],
+			["number", "39"],
+			["operator", "+"],
+			["number", "3"],
+			["delimiter", "}"]
+		]],
+		")"
+	]],
+
+	["regex", [
+		"%r{foo?bar",
+		["interpolation", [
+			["delimiter", "#{"],
+			["number", "39"],
+			["operator", "+"],
+			["number", "3"],
+			["delimiter", "}"]
+		]],
+		"}"
+	]],
+
+	["regex", [
+		"%r[foo?bar",
+		["interpolation", [
+			["delimiter", "#{"],
+			["number", "39"],
+			["operator", "+"],
+			["number", "3"],
+			["delimiter", "}"]
+		]],
+		"]"
+	]],
+
+	["regex", [
+		"%r<foo?bar",
+		["interpolation", [
+			["delimiter", "#{"],
+			["number", "39"],
+			["operator", "+"],
+			["number", "3"],
+			["delimiter", "}"]
+		]],
+		">"
+	]],
+
+	["regex", ["/foo/"]],
+	["comment", "# comment"],
+
+	["regex", [
+		"/foo",
+		["interpolation", [
+			["delimiter", "#{"],
+			"bar",
+			["delimiter", "}"]
+		]],
+		"/"
+	]],
+	["comment", "# comment"]
 ]
 
 ----------------------------------------------------
 
-Checks for regex.
\ No newline at end of file
+Checks for regex.