Commit a7b95dd3aafd8967d594e67c2e4e7f95b4140a67

Michael Schmidt 2019-09-24T17:38:09

Added support for syntax in Java 13 (#2060) This adds support for the new `yield` keyword and text blocks (triple quoted strings) which are both introduced in Java 13.

diff --git a/components/prism-java.js b/components/prism-java.js
index 6433162..4704d25 100644
--- a/components/prism-java.js
+++ b/components/prism-java.js
@@ -1,6 +1,6 @@
 (function (Prism) {
 
-	var keywords = /\b(?:abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while|var|null|exports|module|open|opens|provides|requires|to|transitive|uses|with)\b/;
+	var keywords = /\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|null|open|opens|package|private|protected|provides|public|requires|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/;
 
 	// based on the java naming conventions
 	var className = /\b[A-Z](?:\w*[a-z]\w*)?\b/;
@@ -28,6 +28,15 @@
 		}
 	});
 
+	Prism.languages.insertBefore('java', 'string', {
+		'triple-quoted-string': {
+			// http://openjdk.java.net/jeps/355#Description
+			pattern: /"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,
+			greedy: true,
+			alias: 'string'
+		}
+	});
+
 	Prism.languages.insertBefore('java', 'class-name', {
 		'annotation': {
 			alias: 'punctuation',
diff --git a/components/prism-java.min.js b/components/prism-java.min.js
index 7c3aa01..20a2d47 100644
--- a/components/prism-java.min.js
+++ b/components/prism-java.min.js
@@ -1 +1 @@
-!function(e){var t=/\b(?:abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while|var|null|exports|module|open|opens|provides|requires|to|transitive|uses|with)\b/,a=/\b[A-Z](?:\w*[a-z]\w*)?\b/;e.languages.java=e.languages.extend("clike",{"class-name":[a,/\b[A-Z]\w*(?=\s+\w+\s*[;,=())])/],keyword:t,function:[e.languages.clike.function,{pattern:/(\:\:)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x[\da-f_]*\.?[\da-f_p+-]+\b|(?:\b\d[\d_]*\.?[\d_]*|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|([-+&|])\2|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","class-name",{annotation:{alias:"punctuation",pattern:/(^|[^.])@\w+/,lookbehind:!0},namespace:{pattern:/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)[a-z]\w*(\.[a-z]\w*)+/,lookbehind:!0,inside:{punctuation:/\./}},generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})}(Prism);
\ No newline at end of file
+!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|null|open|opens|package|private|protected|provides|public|requires|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,a=/\b[A-Z](?:\w*[a-z]\w*)?\b/;e.languages.java=e.languages.extend("clike",{"class-name":[a,/\b[A-Z]\w*(?=\s+\w+\s*[;,=())])/],keyword:t,function:[e.languages.clike.function,{pattern:/(\:\:)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x[\da-f_]*\.?[\da-f_p+-]+\b|(?:\b\d[\d_]*\.?[\d_]*|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|([-+&|])\2|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"}}),e.languages.insertBefore("java","class-name",{annotation:{alias:"punctuation",pattern:/(^|[^.])@\w+/,lookbehind:!0},namespace:{pattern:/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)[a-z]\w*(\.[a-z]\w*)+/,lookbehind:!0,inside:{punctuation:/\./}},generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})}(Prism);
\ No newline at end of file
diff --git a/components/prism-scala.js b/components/prism-scala.js
index 8a7ef7e..0ea3e99 100644
--- a/components/prism-scala.js
+++ b/components/prism-scala.js
@@ -1,15 +1,14 @@
 Prism.languages.scala = Prism.languages.extend('java', {
 	'keyword': /<-|=>|\b(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|null|object|override|package|private|protected|return|sealed|self|super|this|throw|trait|try|type|val|var|while|with|yield)\b/,
-	'string': [
-		{
-			pattern: /"""[\s\S]*?"""/,
-			greedy: true
-		},
-		{
-			pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
-			greedy: true
-		}
-	],
+	'triple-quoted-string': {
+		pattern: /"""[\s\S]*?"""/,
+		greedy: true,
+		alias: 'string'
+	},
+	'string': {
+		pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
+		greedy: true
+	},
 	'builtin': /\b(?:String|Int|Long|Short|Byte|Boolean|Double|Float|Char|Any|AnyRef|AnyVal|Unit|Nothing)\b/,
 	'number': /\b0x[\da-f]*\.?[\da-f]+|(?:\b\d+\.?\d*|\B\.\d+)(?:e\d+)?[dfl]?/i,
 	'symbol': /'[^\d\s\\]\w*/
diff --git a/components/prism-scala.min.js b/components/prism-scala.min.js
index a21496f..6ec5866 100644
--- a/components/prism-scala.min.js
+++ b/components/prism-scala.min.js
@@ -1 +1 @@
-Prism.languages.scala=Prism.languages.extend("java",{keyword:/<-|=>|\b(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|null|object|override|package|private|protected|return|sealed|self|super|this|throw|trait|try|type|val|var|while|with|yield)\b/,string:[{pattern:/"""[\s\S]*?"""/,greedy:!0},{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0}],builtin:/\b(?:String|Int|Long|Short|Byte|Boolean|Double|Float|Char|Any|AnyRef|AnyVal|Unit|Nothing)\b/,number:/\b0x[\da-f]*\.?[\da-f]+|(?:\b\d+\.?\d*|\B\.\d+)(?:e\d+)?[dfl]?/i,symbol:/'[^\d\s\\]\w*/}),delete Prism.languages.scala["class-name"],delete Prism.languages.scala.function;
\ No newline at end of file
+Prism.languages.scala=Prism.languages.extend("java",{keyword:/<-|=>|\b(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|null|object|override|package|private|protected|return|sealed|self|super|this|throw|trait|try|type|val|var|while|with|yield)\b/,"triple-quoted-string":{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},builtin:/\b(?:String|Int|Long|Short|Byte|Boolean|Double|Float|Char|Any|AnyRef|AnyVal|Unit|Nothing)\b/,number:/\b0x[\da-f]*\.?[\da-f]+|(?:\b\d+\.?\d*|\B\.\d+)(?:e\d+)?[dfl]?/i,symbol:/'[^\d\s\\]\w*/}),delete Prism.languages.scala["class-name"],delete Prism.languages.scala.function;
\ No newline at end of file
diff --git a/tests/languages/java/keyword_feature.test b/tests/languages/java/keyword_feature.test
index 5e5604d..1b4bc16 100644
--- a/tests/languages/java/keyword_feature.test
+++ b/tests/languages/java/keyword_feature.test
@@ -23,6 +23,7 @@ var null
 module requires transitive
 exports uses open
 opens with to provides
+yield
 
 ----------------------------------------------------
 
@@ -51,7 +52,8 @@ opens with to provides
 	["keyword", "var"], ["keyword", "null"],
 	["keyword", "module"], ["keyword", "requires"], ["keyword", "transitive"],
 	["keyword", "exports"], ["keyword", "uses"], ["keyword", "open"],
-	["keyword", "opens"], ["keyword", "with"], ["keyword", "to"], ["keyword","provides"]
+	["keyword", "opens"], ["keyword", "with"], ["keyword", "to"], ["keyword", "provides"],
+	["keyword", "yield"]
 ]
 
 ----------------------------------------------------
diff --git a/tests/languages/java/string_feature.test b/tests/languages/java/string_feature.test
new file mode 100644
index 0000000..7c580e6
--- /dev/null
+++ b/tests/languages/java/string_feature.test
@@ -0,0 +1,50 @@
+"foo"
+"\"foo\""
+
+"""
+foo
+"""
+
+var a = """
+\"""
+foo""";
+
+"""
+The quick brown fox""" + "  \n" + """
+jumps over the lazy dog
+"""
+
+String empty = """
+""";
+
+
+----------------------------------------------------
+
+[
+	["string", "\"foo\""],
+	["string", "\"\\\"foo\\\"\""],
+
+	["triple-quoted-string", "\"\"\"\nfoo\n\"\"\""],
+
+	["keyword", "var"],
+	" a ",
+	["operator", "="],
+	["triple-quoted-string", "\"\"\"\n\\\"\"\"\nfoo\"\"\""],
+	["punctuation", ";"],
+
+	["triple-quoted-string", "\"\"\"\nThe quick brown fox\"\"\""],
+	["operator", "+"],
+	["string", "\"  \\n\""],
+	["operator", "+"],
+	["triple-quoted-string", "\"\"\"\njumps over the lazy dog\n\"\"\""],
+
+	["class-name", "String"],
+	" empty ",
+	["operator", "="],
+	["triple-quoted-string", "\"\"\"\n\"\"\""],
+	["punctuation", ";"]
+]
+
+----------------------------------------------------
+
+Checks for strings.
diff --git a/tests/languages/scala/string_feature.test b/tests/languages/scala/string_feature.test
index 978b1c2..502625d 100644
--- a/tests/languages/scala/string_feature.test
+++ b/tests/languages/scala/string_feature.test
@@ -23,12 +23,12 @@ bar"""
 	["string", "'\\t'"],
 	["string", "\"\""],
 	["string", "\"fo\\\"obar\""],
-	["string", "\"\"\"fo\"o\r\nbar\"\"\""],
-	["string", "\"\"\"fo\"o\r\n// comment\r\nbar\"\"\""],
+	["triple-quoted-string", "\"\"\"fo\"o\r\nbar\"\"\""],
+	["triple-quoted-string", "\"\"\"fo\"o\r\n// comment\r\nbar\"\"\""],
 	["string", "\"foo /* comment */ bar\""],
 	["string", "'foo // bar'"]
 ]
 
 ----------------------------------------------------
 
-Checks for characters and strings.
\ No newline at end of file
+Checks for characters and strings.