Closed
Conversation
For each schema with bitfield points that have level annotations, emit a static factory method that returns a BitfieldChangeDetector configured with the appropriate property getters and GetLevel calls. The runtime change detection logic lives in the consuming project.
The source generator now emits a change detection factory that references BitfieldChangeDetector<T>, which lives in the consuming project. The test project needs a minimal stub so the generated code compiles.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This adds an optional codegen feature to automatically create a BitfieldChangeDetector setup based on the schema.
New Schema.GenerateChangeDetectionFactory flag (opt-in).
Finds bitfields with level mappings.
Emits a {SchemaName}ChangeDetection static class.
Adds a CreateDetector() method that returns a preconfigured detector.
What it generates:
public static BitfieldChangeDetector<Client> CreateDetector() { return new BitfieldChangeDetector<Client>() .Track(c => c.SomeBitfield, v => v.GetLevel()) .Track(c => c.AnotherBitfield, v => v.GetLevel()); }Why?
This saves time in the consuming projects as individual register tracking is no longer required if you enable the factory.
Consumer requirements:
You’ll need to provide a BitfieldChangeDetector with:
BitfieldChangeDetector<TClient> Track<T>( Func<TClient, T> getter, Func<T, Level> getLevel) where T : struct, Enum;