From 939a17c49a7aad74bef1d0aaf58752448ba1aa3c Mon Sep 17 00:00:00 2001 From: Michael Schmidt Date: Sun, 7 Jun 2020 18:52:25 +0200 Subject: [PATCH] Protobuf: Added support for RPC (#2414) --- components/prism-protobuf.js | 23 ++++--- components/prism-protobuf.min.js | 2 +- tests/languages/protobuf/keyword_feature.test | 8 +++ tests/languages/protobuf/rpc_feature.test | 68 +++++++++++++++++++ 4 files changed, 92 insertions(+), 9 deletions(-) create mode 100644 tests/languages/protobuf/rpc_feature.test diff --git a/components/prism-protobuf.js b/components/prism-protobuf.js index 4e369f84e9..c74f9206c2 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 ffbdaee557..7fce235d4a 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 1272833b68..a5ae3f0a3c 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 0000000000..a88028353b --- /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.