fix(adapter): Detect duplicate adapter names, reject indexers, validate internal constructor accessibility#114
Merged
JerrettDavis merged 6 commits intofeat/adapter-generatorfrom Feb 11, 2026
Conversation
…indexers, and internal ctor accessibility Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com>
Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com>
…eck in ref-return validation Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com>
…ty validation Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com>
…te adapter check Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com>
Copilot
AI
changed the title
[WIP] Add Adapter pattern generator
fix(adapter): Detect duplicate adapter names, reject indexers, validate internal constructor accessibility
Feb 11, 2026
JerrettDavis
approved these changes
Feb 11, 2026
JerrettDavis
added a commit
that referenced
this pull request
Feb 13, 2026
* feat(generators): Add Adapter pattern generator Implements the Adapter pattern generator per issue #33: ## Features - Object adapter generation via [GenerateAdapter] attribute - Explicit member mapping via [AdapterMap] attribute - Support for interface and abstract class targets - Support for properties and methods (including async) - Override keyword for abstract class members - ThrowingStub policy for incremental development - Multiple adapters from single host class ## Diagnostics (PKADP001-008) - PKADP001: Host must be static partial - PKADP002: Target must be interface or abstract class - PKADP003: Missing mapping for target member - PKADP004: Duplicate mapping for target member - PKADP005: Signature mismatch - PKADP006: Type name conflict - PKADP007: Invalid adaptee type - PKADP008: Mapping method must be static ## Tests - 14 generator unit tests - 20 demo integration tests - All pass on net8.0, net9.0, net10.0 ## Documentation - Full docs at docs/generators/adapter.md - Real-world demos: Clock, Payment Gateway, Logger adapters Closes #33 * fix(adapter): Address Copilot review feedback - Filter mapping methods by adaptee type (fixes multiple adapters from same host) - Exclude events from target members (not supported) - For abstract class targets, only collect abstract members - Handle struct adaptee constructor (no null check for value types) Addresses feedback from GitHub Copilot review on PR #108. * fix(adapter): address PR review comments - Use SymbolDisplay.FormatPrimitive for default value formatting - Add setter stub for mapped properties with setters - Validate ref/out/in parameter modifiers in signature check - De-duplicate members from interface diamond inheritance - Add tests for PKADP007 (invalid adaptee), PKADP008 (non-static map) - Add test for overlapping member names across adapters - Add test for interface diamond de-duplication - Add test for ref parameter validation - Fix docs: Charge -> ChargeAsync in example * fix(adapter): address all remaining PR review comments - Add PKADP006 type name conflict check before generating adapter - Add PKADP009 for events not supported in target contract - Add PKADP010 for generic methods not supported - Add PKADP011 for overloaded methods not supported - Add PKADP012 for abstract class without parameterless constructor - Add tests for all new diagnostics (events, generics, overloads, ctor) - Add test for struct adaptee (no null check) - Add test for type name conflict - Update AnalyzerReleases.Unshipped.md with new diagnostic IDs * fix(adapter): address latest PR review feedback - Fix parameterless ctor check to include protected internal and internal - Fix overload detection to compare full signatures (not just name count) - Diamond inheritance (same signature from multiple paths) no longer falsely triggers PKADP011 - Add PKADP013 diagnostic for settable properties (not supported) - Remove setter stub generation (now a compile-time error) - Add SymbolDisplayFormat for consistent type output with global:: prefix - Fix interface diamond test to use actual diamond (IBase1, IBase2) - Add tests for settable property diagnostic - Update test assertions to match global:: prefixed types * Address review feedback: fully-qualified types, member ordering, and diagnostic improvements (#110) * Initial plan * fix(adapter): address review feedback - fully-qualified types, member ordering, and code style Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com> * fix(adapter): Add missing diagnostics, validation, and deterministic ordering (#111) * Initial plan * fix(adapter): Address PR review feedback - diagnostics, validation, and docs Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com> * fix(adapter): Add parameter validation and nullability-aware type comparison (#112) * Initial plan * fix(adapter): Address review feedback - add parameter validation and improve type comparison Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com> * fix(adapter): Only reject unbound generic types, allow closed generics Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com> * fix(adapter): Remove redundant type checks and add missing diagnostic tests (#113) * Initial plan * fix(adapter): Remove redundant type checks and add missing diagnostic tests Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com> * fix(adapter): Detect duplicate adapter names, reject indexers, validate internal constructor accessibility (#114) * Initial plan * fix(adapter): Address review feedback - duplicate adapter detection, indexers, and internal ctor accessibility Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com> * docs(adapter): Add PKADP018 indexer diagnostic to documentation Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com> * fix(adapter): Improve variable naming and remove redundant indexer check in ref-return validation Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com> * refactor(adapter): Improve code readability in constructor and property validation Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com> * refactor(adapter): Use ContainsKey instead of TryGetValue for duplicate adapter check Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com> * fix(adapter): Cross-host collision detection, diagnostic locations, and declaration order (#115) * Initial plan * fix(adapter): Add tests and fix cross-host collision detection, member locations, and declaration order Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com> * fix(adapter): Address enum defaults, partial types, ordering, and DIM filtering (#116) * Initial plan * fix(adapter): Apply PR review fixes - enum defaults, partial types, ordering, accessibility, interface DIMs Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com> * refactor(adapter): Combine internal accessibility checks and clarify ordering comment Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com> * refactor(adapter): Simplify conflict detection and filtering logic with LINQ Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com> --------- Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com>
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.
Addresses four issues in the adapter generator that could cause silent failures or confusing diagnostics:
Changes
Duplicate adapter detection: Track generated adapter type names across multiple
[GenerateAdapter]attributes to detect conflicts beforeAddSource()is called. Previously, duplicate names would causeAddSource()to throw without a helpful diagnostic.Indexer rejection: Added
PKADP018diagnostic when target contracts contain indexers. Previously indexers were silently filtered out, causing the generated adapter to fail compilation without indicating why.Internal constructor accessibility: Enhanced abstract class constructor validation to use
IsSymbolAccessibleWithin()forinternalconstructors, correctly rejecting those from referenced assemblies.Documentation: Updated
AnalyzerReleases.Unshipped.mdanddocs/generators/adapter.mdwithPKADP018.Example
✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.