Skip to content

Track CCW info for '[ReadOnly]Dictionary[Key|Value]Collection<TKey, TValue>' typs in 'cswinrtgen'#2159

Merged
Sergio0694 merged 5 commits intostaging/3.0from
user/sergiopedri/dictionary-collection-ccw
Jan 15, 2026
Merged

Track CCW info for '[ReadOnly]Dictionary[Key|Value]Collection<TKey, TValue>' typs in 'cswinrtgen'#2159
Sergio0694 merged 5 commits intostaging/3.0from
user/sergiopedri/dictionary-collection-ccw

Conversation

@Sergio0694
Copy link
Member

Title. This results in the following additional instantiations in WinRT.Interop.dll (there's more):

Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR enhances the WinRT interop generator to track CCW (COM Callable Wrapper) information for dictionary collection types (DictionaryKeyCollection, DictionaryValueCollection, ReadOnlyDictionaryKeyCollection, and ReadOnlyDictionaryValueCollection). The changes ensure these collection types are properly instantiated in WinRT.Interop.dll when their parent dictionary types are discovered, enabling correct marshalling to native code.

Key changes:

  • Refactored generic interface type tracking from extension methods to a dedicated method in InteropTypeDiscovery.Generics.cs
  • Added automatic tracking of dictionary key/value collection types when discovering IDictionary<TKey, TValue> and IReadOnlyDictionary<TKey, TValue> instantiations
  • Enhanced documentation in dictionary collection classes to clarify the concrete types returned by Keys and Values properties

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
WindowsRuntimeReadOnlyDictionary{TKey, TValue}.cs Added XML documentation remarks clarifying the concrete types returned by Keys and Values properties
WindowsRuntimeObservableMap{TKey, TValue}.cs Added XML documentation remarks for dictionary collection properties with inherited documentation for interface implementations
WindowsRuntimeDictionary{TKey, TValue}.cs Added XML documentation remarks for dictionary collection properties with inherited documentation for interface implementations
InteropGenerator.Discover.cs Added module parameter to TryTrackExposedUserDefinedType call to support enhanced type discovery
InteropGeneratorDiscoveryStateExtensions.cs Deleted file - functionality moved to InteropTypeDiscovery.Generics.cs
InteropTypeDiscovery.cs Added module parameter to TryTrackExposedUserDefinedType method signature
InteropTypeDiscovery.Generics.cs Refactored generic interface tracking into dedicated method with automatic tracking of dictionary collection types when parent dictionary types are discovered

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@Sergio0694 Sergio0694 force-pushed the user/sergiopedri/generic-ccw2 branch from 4147e26 to 10baca1 Compare January 14, 2026 05:07
Added XML documentation remarks to the Keys and Values properties in WindowsRuntimeDictionary, WindowsRuntimeObservableMap, and WindowsRuntimeReadOnlyDictionary classes to clarify the concrete collection types returned. This improves API documentation and developer understanding of the property return types.
Replaces direct calls to TrackGenericInterfaceType with a new TryTrackWindowsRuntimeGenericInterfaceTypeInstance method. This centralizes and extends the logic for tracking constructed generic Windows Runtime interface types, ensuring all necessary related types and delegates are also tracked for code generation.
Deleted the InteropGeneratorDiscoveryStateExtensions.cs file, which contained extension methods for tracking generic interface and delegate types in the interop generator discovery process. This may be part of a refactor or cleanup to simplify or relocate this logic.
Updated generic type discovery logic to explicitly track constructed DictionaryKeyCollection, DictionaryValueCollection, ReadOnlyDictionaryKeyCollection, and ReadOnlyDictionaryValueCollection types when discovering IDictionary<TKey, TValue> and IReadOnlyDictionary<TKey, TValue> instantiations. This ensures correct marshaling of these types, which may not be present in input assemblies but are generated during emit. Also refactored method signatures to consistently pass the current module and args where needed.
@Sergio0694 Sergio0694 force-pushed the user/sergiopedri/dictionary-collection-ccw branch from ff013e4 to c083109 Compare January 15, 2026 19:18
@Sergio0694 Sergio0694 changed the base branch from user/sergiopedri/generic-ccw2 to staging/3.0 January 15, 2026 19:18
Switched from a thread-static TypeSignatureEquatableSet.Builder to a ConcurrentBag-based pool to handle recursive calls during interface discovery. This avoids conflicts and improves resource reuse when analyzing types that may trigger nested discovery logic.
@Sergio0694 Sergio0694 merged commit e11a8b3 into staging/3.0 Jan 15, 2026
10 checks passed
@Sergio0694 Sergio0694 deleted the user/sergiopedri/dictionary-collection-ccw branch January 15, 2026 22:58
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.

2 participants