Merge pull request #2678 from murgatroid99/reflection_no_package_fix

reflection: Fix references to symbols with no package
This commit is contained in:
Michael Lumish 2024-02-27 13:10:30 -08:00 committed by GitHub
commit cfa8072099
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 13 additions and 8 deletions

View File

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

View File

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

View File

@ -113,8 +113,12 @@ export class ReflectionV1Implementation {
let referencedFile: IFileDescriptorProto | null = null; let referencedFile: IFileDescriptorProto | null = null;
if (ref.startsWith('.')) { if (ref.startsWith('.')) {
// absolute reference -- just remove the leading '.' and use the ref directly /* absolute reference -- In files with no package, symbols are
referencedFile = this.symbols[ref.slice(1)]; * 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 { } else {
// relative reference -- need to seek upwards up the current package scope until we find it // relative reference -- need to seek upwards up the current package scope until we find it
let pkg = pkgScope; let pkg = pkgScope;
@ -315,7 +319,7 @@ export class ReflectionV1Implementation {
private getFileDependencies(file: IFileDescriptorProto): IFileDescriptorProto[] { private getFileDependencies(file: IFileDescriptorProto): IFileDescriptorProto[] {
const visited: Set<IFileDescriptorProto> = new Set(); const visited: Set<IFileDescriptorProto> = new Set();
const toVisit: IFileDescriptorProto[] = [...(this.fileDependencies.get(file) || [])]; const toVisit: IFileDescriptorProto[] = [...(this.fileDependencies.get(file) || [])];
while (toVisit.length > 0) { while (toVisit.length > 0) {
const current = toVisit.pop(); const current = toVisit.pop();

View File

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