@@ -66,6 +66,8 @@ internal GeneratedCode(GeneratedCode parent)
66
66
internal bool IsEmpty => this . modulesAndMembers . Count == 0 && this . types . Count == 0 && this . fieldsToSyntax . Count == 0 && this . safeHandleTypes . Count == 0 && this . specialTypes . Count == 0
67
67
&& this . inlineArrayIndexerExtensionsMembers . Count == 0 && this . comInterfaceFriendlyExtensionsMembers . Count == 0 && this . macros . Count == 0 && this . inlineArrays . Count == 0 ;
68
68
69
+ internal bool NeedsWinRTCustomMarshaler { get ; private set ; }
70
+
69
71
internal IEnumerable < MemberDeclarationSyntax > GeneratedTypes => this . GetTypesWithInjectedFields ( )
70
72
. Concat ( this . specialTypes . Values . Where ( st => ! st . TopLevel ) . Select ( st => st . Type ) )
71
73
. Concat ( this . safeHandleTypes )
@@ -111,6 +113,7 @@ internal void AddMemberToModule(string moduleName, MemberDeclarationSyntax membe
111
113
}
112
114
113
115
methodsList . Add ( member ) ;
116
+ this . NeedsWinRTCustomMarshaler |= RequiresWinRTCustomMarshaler ( member ) ;
114
117
}
115
118
116
119
internal void AddMemberToModule ( string moduleName , IEnumerable < MemberDeclarationSyntax > members )
@@ -123,6 +126,7 @@ internal void AddMemberToModule(string moduleName, IEnumerable<MemberDeclaration
123
126
}
124
127
125
128
methodsList . AddRange ( members ) ;
129
+ this . NeedsWinRTCustomMarshaler |= members . Any ( m => RequiresWinRTCustomMarshaler ( m ) ) ;
126
130
}
127
131
128
132
internal void AddConstant ( FieldDefinitionHandle fieldDefHandle , FieldDeclarationSyntax constantDeclaration , TypeDefinitionHandle ? fieldType )
@@ -183,6 +187,7 @@ internal void AddInteropType(TypeDefinitionHandle typeDefinitionHandle, bool has
183
187
{
184
188
this . ThrowIfNotGenerating ( ) ;
185
189
this . types . Add ( ( typeDefinitionHandle , hasUnmanagedName ) , typeDeclaration ) ;
190
+ this . NeedsWinRTCustomMarshaler |= RequiresWinRTCustomMarshaler ( typeDeclaration ) ;
186
191
}
187
192
188
193
internal void GenerationTransaction ( Action generator )
@@ -378,6 +383,10 @@ private static void Commit<T>(List<T> source, List<T>? target)
378
383
source . Clear ( ) ;
379
384
}
380
385
386
+ private static bool RequiresWinRTCustomMarshaler ( SyntaxNode node )
387
+ => node . DescendantNodesAndSelf ( ) . OfType < AttributeSyntax > ( )
388
+ . Any ( a => a . Name . ToString ( ) == "MarshalAs" && a . ToString ( ) . Contains ( WinRTCustomMarshalerFullName ) ) ;
389
+
381
390
private void Commit ( GeneratedCode ? parent )
382
391
{
383
392
foreach ( KeyValuePair < string , List < MemberDeclarationSyntax > > item in this . modulesAndMembers )
@@ -407,6 +416,13 @@ private void Commit(GeneratedCode? parent)
407
416
Commit ( this . releaseMethodsWithSafeHandleTypesGenerating , parent ? . releaseMethodsWithSafeHandleTypesGenerating ) ;
408
417
Commit ( this . inlineArrayIndexerExtensionsMembers , parent ? . inlineArrayIndexerExtensionsMembers ) ;
409
418
Commit ( this . comInterfaceFriendlyExtensionsMembers , parent ? . comInterfaceFriendlyExtensionsMembers ) ;
419
+
420
+ if ( parent is not null )
421
+ {
422
+ parent . NeedsWinRTCustomMarshaler |= this . NeedsWinRTCustomMarshaler ;
423
+ }
424
+
425
+ this . NeedsWinRTCustomMarshaler = false ;
410
426
}
411
427
412
428
private IEnumerable < MemberDeclarationSyntax > GetTypesWithInjectedFields ( )
0 commit comments