Skip to content

Commit 1f18453

Browse files
committed
New: Emit an error on resolveAll() if any extension fields cannot be resolved, see #595 + test case
1 parent c0ab94c commit 1f18453

3 files changed

Lines changed: 42 additions & 0 deletions

File tree

src/root.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,17 @@ RootPrototype.loadSync = function loadSync(filename, options) {
232232
return this.load(filename, options, SYNC);
233233
};
234234

235+
/**
236+
* @override
237+
*/
238+
RootPrototype.resolveAll = function resolveAll() {
239+
if (this.deferred.length)
240+
throw Error("unresolvable extensions: " + this.deferred.map(function(field) {
241+
return "'extend " + field.extend + "' in " + field.parent.getFullName();
242+
}).join(", "));
243+
return Namespace.prototype.resolveAll.call(this);
244+
};
245+
235246
/**
236247
* Handles a deferred declaring extension field by creating a sister field to represent it within its extended type.
237248
* @param {Field} field Declaring extension field witin the declaring type

tests/data/extend.proto

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
syntax = "proto3";
2+
3+
message A {
4+
message B {
5+
message One {
6+
extensions 1000 to max;
7+
}
8+
}
9+
message C {
10+
message Two {
11+
extend B.One {
12+
Two two = 1000;
13+
}
14+
}
15+
}
16+
}

tests/extend.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
var tape = require("tape");
2+
3+
var protobuf = require("..");
4+
5+
tape.test("extensions", function(test) {
6+
7+
protobuf.load("tests/data/extend.proto", function(err, root) {
8+
if (err)
9+
return test.fail(err.message);
10+
root.resolveAll();
11+
test.pass("should parse and resolve without errors");
12+
test.end();
13+
});
14+
15+
});

0 commit comments

Comments
 (0)