Skip to content

Add linked descriptor types for runtime reflection#9

Draft
iainmcgin wants to merge 2 commits intomainfrom
buffa-descriptor-linked-types
Draft

Add linked descriptor types for runtime reflection#9
iainmcgin wants to merge 2 commits intomainfrom
buffa-descriptor-linked-types

Conversation

@iainmcgin
Copy link
Copy Markdown
Collaborator

Introduces MessageDescriptor, FieldDescriptor, EnumDescriptor and
supporting types as the processed, feature-resolved layer on top of the
raw FileDescriptorProto tree. Where raw protos use string type_name
references and unresolved FeatureSet options, these use pool indices
(MessageIndex/EnumIndex, avoiding Arc cycles) and pre-resolved edition
features (FieldPresence, packed, delimited).

FieldKind flattens protobuf's type × label × map-entry axes into a
single Copy discriminant via a SingularKind sub-enum — invalid states
like List(List(...)) are unrepresentable, and no Box allocation is
needed.

These types are constructed by DescriptorPool (next PR) and consumed by
DynamicMessage. #[non_exhaustive] with pub fields allows reads without
external construction.

Moves the generated FileDescriptorProto/DescriptorProto types and
vendored descriptor.proto sources from buffa-codegen into a new
buffa-descriptor crate that depends only on buffa. This makes the
descriptor types available without pulling in quote/syn/prettyplease,
laying the foundation for runtime reflection.

buffa-codegen re-exports buffa_descriptor::generated so all existing
crate::generated:: paths resolve unchanged. gen_descriptor_types now
takes an explicit output directory argument, eliminating the previous
cwd-sensitivity.
@iainmcgin iainmcgin force-pushed the buffa-descriptor-crate branch from 93b88c2 to e1e0949 Compare March 24, 2026 20:54
Introduces MessageDescriptor, FieldDescriptor, EnumDescriptor and
supporting types as the processed, feature-resolved layer on top of the
raw FileDescriptorProto tree. Where raw protos use string type_name
references and unresolved FeatureSet options, these use pool indices
(MessageIndex/EnumIndex, avoiding Arc cycles) and pre-resolved edition
features (FieldPresence, packed, delimited).

FieldKind flattens protobuf's type × label × map-entry axes into a
single Copy discriminant via a SingularKind sub-enum — invalid states
like List(List(...)) are unrepresentable, and no Box allocation is
needed.

These types are constructed by DescriptorPool (next PR) and consumed by
DynamicMessage. #[non_exhaustive] with pub fields allows reads without
external construction.
@iainmcgin iainmcgin force-pushed the buffa-descriptor-linked-types branch from 21128f0 to 75f320c Compare March 24, 2026 20:54
Base automatically changed from buffa-descriptor-crate to main March 26, 2026 18:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant