Skip to content

Commit 24504ec

Browse files
Copilotjonpryor
andcommitted
feat: Add support for generic type arguments in BindableTypeLinkerGenerator
Co-authored-by: jonpryor <155958+jonpryor@users.noreply.github.com>
1 parent 19edfc4 commit 24504ec

File tree

1 file changed

+54
-36
lines changed

1 file changed

+54
-36
lines changed

src/SourceGenerators/Uno.UI.Tasks/LinkerHintsGenerator/BindableTypeLinkerGeneratorTask.cs

Lines changed: 54 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -191,50 +191,68 @@ private Dictionary<string, TypeDefinition> FindReferencedTypes(List<TypeDefiniti
191191
// Iterate over all public properties
192192
foreach (var property in bindableType.Properties.Where(p => p.GetMethod?.IsPublic == true))
193193
{
194-
var propertyType = property.PropertyType;
194+
ProcessPropertyType(property.PropertyType, referencedTypes);
195+
}
196+
}
195197

196-
// Resolve the type
197-
TypeDefinition? resolvedType = null;
198-
try
199-
{
200-
resolvedType = propertyType.Resolve();
201-
}
202-
catch (Exception ex)
203-
{
204-
Log.LogMessage(MessageImportance.Low, $"Failed to resolve type {propertyType.FullName}: {ex.Message}");
205-
continue;
206-
}
198+
Log.LogMessage(DefaultLogMessageLevel, $"BindableTypeLinkerGenerator: Found {referencedTypes.Count} referenced types to preserve");
199+
return referencedTypes;
200+
}
207201

208-
if (resolvedType == null)
209-
{
210-
continue;
211-
}
202+
private void ProcessPropertyType(TypeReference propertyType, Dictionary<string, TypeDefinition> referencedTypes)
203+
{
204+
// Resolve the type
205+
TypeDefinition? resolvedType = null;
206+
try
207+
{
208+
resolvedType = propertyType.Resolve();
209+
}
210+
catch (Exception ex)
211+
{
212+
Log.LogMessage(MessageImportance.Low, $"Failed to resolve type {propertyType.FullName}: {ex.Message}");
213+
return;
214+
}
212215

213-
// Skip if type already has Bindable attribute
214-
if (HasBindableAttribute(resolvedType))
215-
{
216-
Log.LogMessage(MessageImportance.Low, $"Skipping {resolvedType.FullName} - already has Bindable attribute");
217-
continue;
218-
}
216+
if (resolvedType == null)
217+
{
218+
return;
219+
}
219220

220-
// Skip if type has no properties
221-
if (!resolvedType.Properties.Any())
222-
{
223-
Log.LogMessage(MessageImportance.Low, $"Skipping {resolvedType.FullName} - has no properties");
224-
continue;
225-
}
221+
// Process the main type
222+
AddTypeIfNeeded(resolvedType, referencedTypes);
226223

227-
// Add to referenced types
228-
if (!referencedTypes.ContainsKey(resolvedType.FullName))
229-
{
230-
referencedTypes[resolvedType.FullName] = resolvedType;
231-
Log.LogMessage(DefaultLogMessageLevel, $"BindableTypeLinkerGenerator: Adding referenced type {resolvedType.FullName}");
232-
}
224+
// Process generic arguments (e.g., List<Entity> should also process Entity)
225+
if (propertyType is GenericInstanceType genericType)
226+
{
227+
foreach (var genericArg in genericType.GenericArguments)
228+
{
229+
ProcessPropertyType(genericArg, referencedTypes);
233230
}
234231
}
232+
}
235233

236-
Log.LogMessage(DefaultLogMessageLevel, $"BindableTypeLinkerGenerator: Found {referencedTypes.Count} referenced types to preserve");
237-
return referencedTypes;
234+
private void AddTypeIfNeeded(TypeDefinition resolvedType, Dictionary<string, TypeDefinition> referencedTypes)
235+
{
236+
// Skip if type already has Bindable attribute
237+
if (HasBindableAttribute(resolvedType))
238+
{
239+
Log.LogMessage(MessageImportance.Low, $"Skipping {resolvedType.FullName} - already has Bindable attribute");
240+
return;
241+
}
242+
243+
// Skip if type has no properties
244+
if (!resolvedType.Properties.Any())
245+
{
246+
Log.LogMessage(MessageImportance.Low, $"Skipping {resolvedType.FullName} - has no properties");
247+
return;
248+
}
249+
250+
// Add to referenced types
251+
if (!referencedTypes.ContainsKey(resolvedType.FullName))
252+
{
253+
referencedTypes[resolvedType.FullName] = resolvedType;
254+
Log.LogMessage(DefaultLogMessageLevel, $"BindableTypeLinkerGenerator: Adding referenced type {resolvedType.FullName}");
255+
}
238256
}
239257

240258
private void GenerateLinkerDescriptor(Dictionary<string, TypeDefinition> referencedTypes)

0 commit comments

Comments
 (0)