reflection: Fix references to symbols with no package

This commit is contained in:
Michael Lumish 2024-02-27 12:43:28 -08:00
parent c10d973d38
commit 0207979a4d
4 changed files with 13 additions and 8 deletions

View File

@ -1,6 +1,6 @@
{
"name": "@grpc/reflection",
"version": "1.0.2",
"version": "1.0.3",
"author": {
"name": "Google Inc."
},

View File

@ -8,6 +8,7 @@ import 'unscoped.proto';
service SampleService {
rpc Hello (HelloRequest) returns (HelloResponse) {}
rpc Hello2 (HelloRequest) returns (CommonMessage) {}
rpc Hello3 (ProcessRequest) returns (TopLevelMessage) {}
}
service IgnoreService {

View File

@ -113,8 +113,12 @@ export class ReflectionV1Implementation {
let referencedFile: IFileDescriptorProto | null = null;
if (ref.startsWith('.')) {
// absolute reference -- just remove the leading '.' and use the ref directly
referencedFile = this.symbols[ref.slice(1)];
/* absolute reference -- In files with no package, symbols are
* populated in the symbols table with a leading period in the key.
* If there is a package, the symbol does not have a leading period in
* the key. For simplicity, we check without the period, then with it.
*/
referencedFile = this.symbols[ref.slice(1)] ?? this.symbols[ref];
} else {
// relative reference -- need to seek upwards up the current package scope until we find it
let pkg = pkgScope;
@ -315,7 +319,7 @@ export class ReflectionV1Implementation {
private getFileDependencies(file: IFileDescriptorProto): IFileDescriptorProto[] {
const visited: Set<IFileDescriptorProto> = new Set();
const toVisit: IFileDescriptorProto[] = [...(this.fileDependencies.get(file) || [])];
while (toVisit.length > 0) {
const current = toVisit.pop();

View File

@ -51,7 +51,7 @@ describe('GrpcReflectionService', () => {
const names = descriptors.map((desc) => desc.name);
assert.deepEqual(
new Set(names),
new Set(['sample.proto', 'vendor.proto', 'vendor_dependency.proto'])
new Set(['root.proto', 'sample.proto', 'vendor.proto', 'vendor_dependency.proto'])
);
});
@ -99,7 +99,7 @@ describe('GrpcReflectionService', () => {
const names = descriptors.map((desc) => desc.name);
assert.deepEqual(
new Set(names),
new Set(['sample.proto', 'vendor.proto', 'vendor_dependency.proto']),
new Set(['root.proto', 'sample.proto', 'vendor.proto', 'vendor_dependency.proto']),
);
});
@ -129,7 +129,7 @@ describe('GrpcReflectionService', () => {
const names = descriptors.map((desc) => desc.name);
assert.deepEqual(
new Set(names),
new Set(['sample.proto', 'vendor.proto', 'vendor_dependency.proto']),
new Set(['root.proto', 'sample.proto', 'vendor.proto', 'vendor_dependency.proto']),
);
});
@ -169,7 +169,7 @@ describe('GrpcReflectionService', () => {
const names = descriptors.map((desc) => desc.name);
assert.deepEqual(
new Set(names),
new Set(['sample.proto', 'vendor.proto', 'vendor_dependency.proto']),
new Set(['root.proto', 'sample.proto', 'vendor.proto', 'vendor_dependency.proto']),
);
});
});