Commit 939a17c49a7aad74bef1d0aaf58752448ba1aa3c

Michael Schmidt 2020-06-07T18:52:25

Protobuf: Added support for RPC (#2414)

diff --git a/components/prism-protobuf.js b/components/prism-protobuf.js
index 4e369f8..c74f920 100644
--- a/components/prism-protobuf.js
+++ b/components/prism-protobuf.js
@@ -3,16 +3,23 @@
 	var builtinTypes = /\b(?:double|float|[su]?int(?:32|64)|s?fixed(?:32|64)|bool|string|bytes)\b/;
 
 	Prism.languages.protobuf = Prism.languages.extend('clike', {
-		'class-name': {
-			pattern: /(\b(?:enum|extend|message|service)\s+)[A-Za-z_]\w*(?=\s*\{)/,
-			lookbehind: true
-		},
-		'keyword': /\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|service|syntax|to)\b/
+		'class-name': [
+			{
+				pattern: /(\b(?:enum|extend|message|service)\s+)[A-Za-z_]\w*(?=\s*\{)/,
+				lookbehind: true
+			},
+			{
+				pattern: /(\b(?:rpc\s+\w+|returns)\s*\(\s*(?:stream\s+)?)\.?[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*(?=\s*\))/,
+				lookbehind: true
+			}
+		],
+		'keyword': /\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|returns|rpc(?=\s+\w)|service|stream|syntax|to)\b(?!\s*=\s*\d)/,
+		'function': /[a-z_]\w*(?=\s*\()/i
 	});
 
 	Prism.languages.insertBefore('protobuf', 'operator', {
 		'map': {
-			pattern: /\bmap<\s*[\w.]+\s*,\s*[\w.]+\s*>(?=\s+[A-Za-z_]\w*\s*[=;])/,
+			pattern: /\bmap<\s*[\w.]+\s*,\s*[\w.]+\s*>(?=\s+[a-z_]\w*\s*[=;])/i,
 			alias: 'class-name',
 			inside: {
 				'punctuation': /[<>.,]/,
@@ -21,14 +28,14 @@
 		},
 		'builtin': builtinTypes,
 		'positional-class-name': {
-			pattern: /(?:\b|\B\.)[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*(?=\s+[A-Za-z_]\w*\s*[=;])/,
+			pattern: /(?:\b|\B\.)[a-z_]\w*(?:\.[a-z_]\w*)*(?=\s+[a-z_]\w*\s*[=;])/i,
 			alias: 'class-name',
 			inside: {
 				'punctuation': /\./
 			}
 		},
 		'annotation': {
-			pattern: /(\[\s*)[A-Za-z_]\w*(?=\s*=)/,
+			pattern: /(\[\s*)[a-z_]\w*(?=\s*=)/i,
 			lookbehind: true
 		}
 	});
diff --git a/components/prism-protobuf.min.js b/components/prism-protobuf.min.js
index ffbdaee..7fce235 100644
--- a/components/prism-protobuf.min.js
+++ b/components/prism-protobuf.min.js
@@ -1 +1 @@
-!function(e){var a=/\b(?:double|float|[su]?int(?:32|64)|s?fixed(?:32|64)|bool|string|bytes)\b/;e.languages.protobuf=e.languages.extend("clike",{"class-name":{pattern:/(\b(?:enum|extend|message|service)\s+)[A-Za-z_]\w*(?=\s*\{)/,lookbehind:!0},keyword:/\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|service|syntax|to)\b/}),e.languages.insertBefore("protobuf","operator",{map:{pattern:/\bmap<\s*[\w.]+\s*,\s*[\w.]+\s*>(?=\s+[A-Za-z_]\w*\s*[=;])/,alias:"class-name",inside:{punctuation:/[<>.,]/,builtin:a}},builtin:a,"positional-class-name":{pattern:/(?:\b|\B\.)[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*(?=\s+[A-Za-z_]\w*\s*[=;])/,alias:"class-name",inside:{punctuation:/\./}},annotation:{pattern:/(\[\s*)[A-Za-z_]\w*(?=\s*=)/,lookbehind:!0}})}(Prism);
\ No newline at end of file
+!function(e){var s=/\b(?:double|float|[su]?int(?:32|64)|s?fixed(?:32|64)|bool|string|bytes)\b/;e.languages.protobuf=e.languages.extend("clike",{"class-name":[{pattern:/(\b(?:enum|extend|message|service)\s+)[A-Za-z_]\w*(?=\s*\{)/,lookbehind:!0},{pattern:/(\b(?:rpc\s+\w+|returns)\s*\(\s*(?:stream\s+)?)\.?[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*(?=\s*\))/,lookbehind:!0}],keyword:/\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|returns|rpc(?=\s+\w)|service|stream|syntax|to)\b(?!\s*=\s*\d)/,function:/[a-z_]\w*(?=\s*\()/i}),e.languages.insertBefore("protobuf","operator",{map:{pattern:/\bmap<\s*[\w.]+\s*,\s*[\w.]+\s*>(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/[<>.,]/,builtin:s}},builtin:s,"positional-class-name":{pattern:/(?:\b|\B\.)[a-z_]\w*(?:\.[a-z_]\w*)*(?=\s+[a-z_]\w*\s*[=;])/i,alias:"class-name",inside:{punctuation:/\./}},annotation:{pattern:/(\[\s*)[a-z_]\w*(?=\s*=)/i,lookbehind:!0}})}(Prism);
\ No newline at end of file
diff --git a/tests/languages/protobuf/keyword_feature.test b/tests/languages/protobuf/keyword_feature.test
index 1272833..a5ae3f0 100644
--- a/tests/languages/protobuf/keyword_feature.test
+++ b/tests/languages/protobuf/keyword_feature.test
@@ -11,7 +11,10 @@ public
 repeated
 required
 reserved
+returns
+rpc LotsOfReplies(
 service
+stream
 syntax
 to
 
@@ -31,7 +34,12 @@ to
 	["keyword", "repeated"],
 	["keyword", "required"],
 	["keyword", "reserved"],
+	["keyword", "returns"],
+	["keyword", "rpc"],
+	["function", "LotsOfReplies"],
+	["punctuation", "("],
 	["keyword", "service"],
+	["keyword", "stream"],
 	["keyword", "syntax"],
 	["keyword", "to"]
 ]
diff --git a/tests/languages/protobuf/rpc_feature.test b/tests/languages/protobuf/rpc_feature.test
new file mode 100644
index 0000000..a880283
--- /dev/null
+++ b/tests/languages/protobuf/rpc_feature.test
@@ -0,0 +1,68 @@
+rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);
+rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);
+rpc CancelOperation(CancelOperationRequest) returns (google.protobuf.Empty) {
+	option (google.api.http) = { post: "/v1/{name=operations/**}:cancel" body: "*" };
+}
+
+----------------------------------------------------
+
+[
+	["keyword", "rpc"],
+	["function", "LotsOfReplies"],
+	["punctuation", "("],
+	["class-name", "HelloRequest"],
+	["punctuation", ")"],
+	["keyword", "returns"],
+	["punctuation", "("],
+	["keyword", "stream"],
+	["class-name", "HelloResponse"],
+	["punctuation", ")"],
+	["punctuation", ";"],
+
+	["keyword", "rpc"],
+	["function", "BidiHello"],
+	["punctuation", "("],
+	["keyword", "stream"],
+	["class-name", "HelloRequest"],
+	["punctuation", ")"],
+	["keyword", "returns"],
+	["punctuation", "("],
+	["keyword", "stream"],
+	["class-name", "HelloResponse"],
+	["punctuation", ")"],
+	["punctuation", ";"],
+
+	["keyword", "rpc"],
+	["function", "CancelOperation"],
+	["punctuation", "("],
+	["class-name", "CancelOperationRequest"],
+	["punctuation", ")"],
+	["keyword", "returns"],
+	["punctuation", "("],
+	["class-name", "google.protobuf.Empty"],
+	["punctuation", ")"],
+	["punctuation", "{"],
+	["keyword", "option"],
+	["punctuation", "("],
+	"google",
+	["punctuation", "."],
+	"api",
+	["punctuation", "."],
+	"http",
+	["punctuation", ")"],
+	["operator", "="],
+	["punctuation", "{"],
+	" post",
+	["punctuation", ":"],
+	["string", "\"/v1/{name=operations/**}:cancel\""],
+	" body",
+	["punctuation", ":"],
+	["string", "\"*\""],
+	["punctuation", "}"],
+	["punctuation", ";"],
+	["punctuation", "}"]
+]
+
+----------------------------------------------------
+
+Check for RPC definitions.