Protobuf: Added support for RPC (#2414)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
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.