From a8c7d5f0694b6728dfe682402300bece7547e0cd Mon Sep 17 00:00:00 2001 From: Hyeseong Kim Date: Mon, 16 Aug 2021 18:49:37 +0900 Subject: [PATCH] feat: Add pbkit as a Protobuf parser (#592) * Add protobuf parser * feat: add protocol buffers parser * doc: add pbkit to README * remove an unused babel plugin * remove verdored parser * chore: up pbkit (#1) it resolves some parse error cases Co-authored-by: JongChan Choi --- README.md | 3 ++ website/package.json | 1 + website/src/parsers/protobuf/codeExample.txt | 32 +++++++++++++++++++ website/src/parsers/protobuf/index.js | 6 ++++ website/src/parsers/protobuf/pbkit.js | 33 ++++++++++++++++++++ website/webpack.config.js | 12 +++---- website/yarn.lock | 5 +++ 7 files changed, 86 insertions(+), 6 deletions(-) create mode 100644 website/src/parsers/protobuf/codeExample.txt create mode 100644 website/src/parsers/protobuf/index.js create mode 100644 website/src/parsers/protobuf/pbkit.js diff --git a/README.md b/README.md index 687e1381..4c63caa2 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,8 @@ The AST explorer provides following code parsers: - [regexp-tree][] - [regexpp][] - [regjsparser][] +- Protocol Buffers: + - [pbkit][] - Scala - [Scalameta][] - Solidity: @@ -150,6 +152,7 @@ are included so you can prototype your own plugins: [luaparse]: https://oxyc.github.io/luaparse/ [meriyah]: https://github.com/meriyah/meriyah/ [parse5]: https://github.com/inikulin/parse5 +[pbkit]: https://github.com/riiid/pbkit [postcss-safe-parser]: https://github.com/postcss/postcss-safe-parser [postcss-scss]: https://github.com/postcss/postcss-scss [postcss]: https://github.com/postcss/postcss diff --git a/website/package.json b/website/package.json index 28b914b0..79c8bc2f 100644 --- a/website/package.json +++ b/website/package.json @@ -115,6 +115,7 @@ "meriyah": "^1.9.12", "parse5": "^6.0.0", "parse5-htmlparser2-tree-adapter": "^6.0.0", + "pbkit": "^0.0.12", "php-parser": "^3.0.0", "postcss": "^7.0.27", "postcss-less": "^3.1.2", diff --git a/website/src/parsers/protobuf/codeExample.txt b/website/src/parsers/protobuf/codeExample.txt new file mode 100644 index 00000000..2330717b --- /dev/null +++ b/website/src/parsers/protobuf/codeExample.txt @@ -0,0 +1,32 @@ +syntax = "proto3"; +package tutorial; + +import "google/protobuf/timestamp.proto"; + +option go_package = "github.com/protocolbuffers/protobuf/examples/go/tutorialpb"; + +message Person { + string name = 1; + int32 id = 2; // Unique ID number for this person. + string email = 3; + + enum PhoneType { + MOBILE = 0; + HOME = 1; + WORK = 2; + } + + message PhoneNumber { + string number = 1; + PhoneType type = 2; + } + + repeated PhoneNumber phones = 4; + + google.protobuf.Timestamp last_updated = 5; +} + +// Our address book file is just one of these. +message AddressBook { + repeated Person people = 1; +} diff --git a/website/src/parsers/protobuf/index.js b/website/src/parsers/protobuf/index.js new file mode 100644 index 00000000..d8d8cb98 --- /dev/null +++ b/website/src/parsers/protobuf/index.js @@ -0,0 +1,6 @@ +import 'codemirror/mode/protobuf/protobuf'; + +export const id = 'protobuf'; +export const displayName = 'Protocol Buffers'; +export const mimeTypes = ['text/x-protobuf']; +export const fileExtension = 'proto'; diff --git a/website/src/parsers/protobuf/pbkit.js b/website/src/parsers/protobuf/pbkit.js new file mode 100644 index 00000000..672824fc --- /dev/null +++ b/website/src/parsers/protobuf/pbkit.js @@ -0,0 +1,33 @@ +import defaultParserInterface from '../utils/defaultParserInterface'; +import pkg from 'pbkit/package.json'; + +const ID = 'pbkit'; + +export default { + ...defaultParserInterface, + id: ID, + displayName: ID, + version: pkg.version, + homepage: 'https://github.com/riiid/pbkit', + locationProps: new Set(['start', 'end']), + typeProps: new Set(['type']), + + loadParser(callback) { + require(['pbkit/core/parser/proto'], callback); + }, + + parse(parser, code) { + return parser.parse(code).ast; + }, + + nodeToRange(node) { + const { start, end } = node; + return [start, end]; + }, + + opensByDefault(node, key) { + if (key === 'statements') { + return true; + } + }, +}; diff --git a/website/webpack.config.js b/website/webpack.config.js index e8735d4b..a5400c9d 100644 --- a/website/webpack.config.js +++ b/website/webpack.config.js @@ -43,11 +43,11 @@ const plugins = [ // Shim ESLint stuff that's only relevant for Node.js new webpack.NormalModuleReplacementPlugin( /cli-engine/, - 'node-libs-browser/mock/empty' + 'node-libs-browser/mock/empty', ), new webpack.NormalModuleReplacementPlugin( /load-rules/, - __dirname + '/src/parsers/js/transformers/eslint1/loadRulesShim.js' + __dirname + '/src/parsers/js/transformers/eslint1/loadRulesShim.js', ), // There seems to be a problem with webpack loading an index.js file that @@ -60,7 +60,7 @@ const plugins = [ if (/css-tree/.test(module.context)) { module.request += '/index.js'; } - } + }, ), // More shims @@ -68,7 +68,7 @@ const plugins = [ // Doesn't look like jest-validate is useful in our case (prettier uses it) new webpack.NormalModuleReplacementPlugin( /jest-validate/, - __dirname + '/src/shims/jest-validate.js' + __dirname + '/src/shims/jest-validate.js', ), // Hack to disable Webpack dynamic requires in ESLint, so we don't end up @@ -94,7 +94,7 @@ const plugins = [ new webpack.ProgressPlugin({ modules: false, activeModules: false, - profile: false + profile: false, }), ]; @@ -270,5 +270,5 @@ module.exports = Object.assign({ { devtool: 'eval', } : - {} + {}, ); diff --git a/website/yarn.lock b/website/yarn.lock index e7eae039..a5d0747e 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -8445,6 +8445,11 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" +pbkit@^0.0.12: + version "0.0.12" + resolved "https://registry.yarnpkg.com/pbkit/-/pbkit-0.0.12.tgz#f67a307867763da732f38198a53034342373d62d" + integrity sha512-NtHgxsdLpxwXyKWeeObkFbVLPQWoigyQfHJVZZJVI2h2pLC7wM39mbMzT0l89MPjB7Z7QTKzzVhtzMG9zWC2ug== + php-parser@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/php-parser/-/php-parser-3.0.0.tgz#7e0abef4941cabbf10f25f1445bca0f758f5102f"