Skip to content

Commit 4affa1b

Browse files
committed
pbjs proto target field options, language-level compliance with jspb test.proto
1 parent 8fdebf8 commit 4affa1b

File tree

10 files changed

+127
-37
lines changed

10 files changed

+127
-37
lines changed

cli/targets/proto.js

Lines changed: 65 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ var Namespace = protobuf.Namespace,
1010
Field = protobuf.Field,
1111
OneOf = protobuf.OneOf,
1212
Service = protobuf.Service,
13-
Method = protobuf.Method;
13+
Method = protobuf.Method,
14+
types = protobuf.types,
15+
util = protobuf.util;
1416

1517
var out = [];
1618
var indent = 0;
@@ -61,6 +63,22 @@ function under_score(name) {
6163
.replace(/([A-Z])(?=[a-z]|$)/g, function($0, $1) { return "_" + $1.toLowerCase(); });
6264
}
6365

66+
function escape(str) {
67+
return str.replace(/[\\"']/g, '\\$&')
68+
.replace(/\u0000/g, '\\0');
69+
}
70+
71+
function value(v) {
72+
switch (typeof v) {
73+
case 'boolean':
74+
return v ? 'true' : 'false';
75+
case 'number':
76+
return v.toString();
77+
default:
78+
return '"' + escape(v + '') + '"';
79+
}
80+
}
81+
6482
function buildRoot(root) {
6583
root.resolveAll();
6684
var pkg = [];
@@ -135,12 +153,18 @@ function buildType(type) {
135153
first = true;
136154
type.fieldsArray.forEach(build);
137155
consolidateExtends(type.nestedArray).remaining.forEach(build);
156+
if (type.extensions && type.extensions.length) {
157+
push("");
158+
type.extensions.forEach(function(range) {
159+
push("extensions " + range[0] + " to " + (range[1] === 0x1FFFFFFF ? "max" : range[1]) + ";");
160+
});
161+
}
138162
--indent;
139163
push("}");
140164
}
141165

142166
function buildField(field, passExtend) {
143-
if (field.partOf || field.declaringType || (field.extend !== undefined && !passExtend))
167+
if (field.partOf || field.declaringField || (field.extend !== undefined && !passExtend))
144168
return;
145169
if (first)
146170
first = false, push("");
@@ -154,22 +178,46 @@ function buildField(field, passExtend) {
154178
else
155179
sb.push(field.type);
156180
sb.push(under_score(field.name), "=", field.id);
157-
var opts = [];
158-
if (field.repeated) {
159-
if (syntax === 2) {
160-
if (field.packed)
161-
opts.push("packed=true");
162-
} else {
163-
if (!field.packed)
164-
opts.push("packed=false");
165-
}
166-
// TODO: Proper field options
167-
}
168-
if (opts.length)
169-
sb.push("[" + opts.join(', ') + "]");
181+
var opts = buildFieldOptions(field);
182+
if (opts)
183+
sb.push(opts);
170184
push(sb.join(" ") + ";");
171185
}
172186

187+
function buildFieldOptions(field) {
188+
var keys;
189+
if (!field.options || !(keys = Object.keys(field.options)).length)
190+
return null;
191+
var sb = [];
192+
Object.keys(field.options).forEach(function(key) {
193+
var val = field.options[key];
194+
var wireType = types.packed[field.resolvedType instanceof Enum ? "uint32" : field.type];
195+
switch (key) {
196+
case "packed":
197+
val = Boolean(val);
198+
// skip when not packable or syntax default
199+
if (wireType === undefined || (syntax === 3) === val)
200+
return;
201+
break;
202+
case "default":
203+
// skip default (resolved) default values
204+
if (field.long && !util.longNeq(field.defaultValue, types.defaults[field.type]) || !field.long && field.defaultValue === types.defaults[field.type])
205+
return;
206+
// enum defaults specified as strings are type references and not enclosed in quotes
207+
if (field.resolvedType instanceof Enum)
208+
break;
209+
// otherwise fallthrough
210+
default:
211+
val = value(val);
212+
break;
213+
}
214+
sb.push(key + "=" + val);
215+
});
216+
return sb.length
217+
? "[" + sb.join(", ") + "]"
218+
: null;
219+
}
220+
173221
function consolidateExtends(nested) {
174222
var ext = {};
175223
nested = nested.filter(function(obj) {
@@ -201,7 +249,8 @@ function buildOneOf(oneof) {
201249
var field = oneof.parent.get(fieldName);
202250
if (first)
203251
push(""), first = false;
204-
push(field.type + " " + under_score(field.name) + " = " + field.id + ";");
252+
var opts = buildFieldOptions(field);
253+
push(field.type + " " + under_score(field.name) + " = " + field.id + (opts ? " " + opts : "") + ";");
205254
});
206255
--indent;
207256
push("}");

dist/protobuf.js

Lines changed: 31 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/protobuf.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/protobuf.min.js

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/protobuf.min.js.gz

76 Bytes
Binary file not shown.

dist/protobuf.min.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/namespace.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,14 +236,17 @@ NamespacePrototype.define = function define(path, json) {
236236
NamespacePrototype.resolveAll = function resolve() {
237237
var nested = this.getNestedArray(), i = 0;
238238
while (i < nested.length)
239-
nested[i++].resolve();
239+
if (nested[i] instanceof Namespace)
240+
nested[i++].resolveAll();
241+
else
242+
nested[i++].resolve();
240243
return ReflectionObject.prototype.resolve.call(this);
241244
};
242245

243246
/**
244247
* Looks up the reflection object at the specified path, relative to this namespace.
245248
* @param {string|string[]} path Path to look up
246-
* @param {boolean} [parentAlreadyChecked] Whether the parent has already been checked
249+
* @param {boolean} [parentAlreadyChecked=false] Whether the parent has already been checked
247250
* @returns {?ReflectionObject} Looked up object or `null` if none could be found
248251
*/
249252
NamespacePrototype.lookup = function lookup(path, parentAlreadyChecked) {

src/parse.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ function parse(source, root) {
145145
return sign * parseInt(token, 16);
146146
if (/^0[0-7]+$/.test(token))
147147
return sign * parseInt(token, 8);
148-
if (/^[0-9]*(?:\.[0-9]*)?(?:[e][+-]?[0-9]+)?$/.test(tokenLower))
148+
if (/^(?!e)[0-9]*(?:\.[0-9]*)?(?:[e][+-]?[0-9]+)?$/.test(tokenLower))
149149
return sign * parseFloat(token);
150150
throw illegal(token, 'number');
151151
}

src/tokenize.js

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
"use strict";
2-
/* eslint-disable default-case, callback-return */
32
module.exports = tokenize;
43

54
var delimRe = /[\s{}=;:[\],'"()<>]/g,
@@ -20,12 +19,27 @@ var s_nl = "\n",
2019
s_sl = '/',
2120
s_as = '*';
2221

22+
function unescape(str) {
23+
return str.replace(/\\(.?)/g, function($0, $1) {
24+
switch ($1) {
25+
case "\\":
26+
case "":
27+
return $1;
28+
case "0":
29+
return "\u0000";
30+
default:
31+
return $1;
32+
}
33+
});
34+
}
35+
2336
/**
2437
* Tokenizes the given .proto source and returns an object with useful utility functions.
2538
* @param {string} source Source contents
2639
* @returns {TokenizerHandle} Tokenizer handle
2740
*/
2841
function tokenize(source) {
42+
/* eslint-disable default-case, callback-return */
2943
source = source.toString();
3044

3145
var offset = 0,
@@ -60,7 +74,7 @@ function tokenize(source) {
6074
offset = re.lastIndex;
6175
push(stringDelim);
6276
stringDelim = null;
63-
return match[1];
77+
return unescape(match[1]);
6478
}
6579

6680
/**
@@ -188,4 +202,5 @@ function tokenize(source) {
188202
push: push,
189203
skip: skip
190204
};
205+
/* eslint-enable default-case, callback-return */
191206
}

types/protobuf.js.d.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
2-
* protobuf.js v6.0.0-dev TypeScript definitions
3-
* Generated Mon, 28 Nov 2016 15:09:05 UTC
2+
* protobuf.js v6.0.0 TypeScript definitions
3+
* Generated Tue, 29 Nov 2016 12:18:27 UTC
44
*/
55
declare module protobuf {
66

@@ -704,7 +704,7 @@ declare module protobuf {
704704
/**
705705
* Looks up the reflection object at the specified path, relative to this namespace.
706706
* @param {string|string[]} path Path to look up
707-
* @param {boolean} [parentAlreadyChecked] Whether the parent has already been checked
707+
* @param {boolean} [parentAlreadyChecked=false] Whether the parent has already been checked
708708
* @returns {?ReflectionObject} Looked up object or `null` if none could be found
709709
*/
710710
lookup(path: (string|string[]), parentAlreadyChecked?: boolean): ReflectionObject;

0 commit comments

Comments
 (0)