Skip to content

Commit 8dbe67c

Browse files
Copilotjonpryor
andcommitted
refactor: Use XLinq (System.Xml.Linq) instead of XmlDocument for descriptor generation
Co-authored-by: jonpryor <155958+jonpryor@users.noreply.github.com>
1 parent 31fce8d commit 8dbe67c

File tree

1 file changed

+16
-29
lines changed

1 file changed

+16
-29
lines changed

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

Lines changed: 16 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
using System.IO;
66
using System.Linq;
77
using System.Text;
8-
using System.Xml;
8+
using System.Xml.Linq;
99
using Microsoft.Build.Framework;
1010
using Microsoft.Build.Utilities;
1111
using Mono.Cecil;
@@ -269,55 +269,38 @@ private void AddTypeIfNeeded(TypeDefinition resolvedType, Dictionary<TypeDefinit
269269

270270
private void GenerateLinkerDescriptor(Dictionary<TypeDefinition, HashSet<string>> referencedTypes)
271271
{
272-
var doc = new XmlDocument();
273-
274-
var xmlDeclaration = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
275-
doc.InsertBefore(xmlDeclaration, doc.DocumentElement);
276-
277-
var linkerNode = doc.CreateElement("linker");
278-
doc.AppendChild(linkerNode);
279-
280272
// Group types by assembly
281273
var typesByAssembly = referencedTypes
282274
.GroupBy(kvp => kvp.Key.Module.Assembly.Name.Name)
283275
.OrderBy(g => g.Key);
284276

277+
var linkerElement = new XElement("linker");
278+
285279
foreach (var assemblyGroup in typesByAssembly)
286280
{
287-
var assemblyNode = doc.CreateElement("assembly");
288-
var fullnameAttr = doc.CreateAttribute("fullname");
289-
fullnameAttr.Value = assemblyGroup.Key;
290-
assemblyNode.Attributes.Append(fullnameAttr);
281+
var assemblyElement = new XElement("assembly",
282+
new XAttribute("fullname", assemblyGroup.Key));
291283

292284
foreach (var typeEntry in assemblyGroup.OrderBy(t => t.Key.FullName))
293285
{
294286
var type = typeEntry.Key;
295287
var properties = typeEntry.Value;
296288

297-
var typeNode = doc.CreateElement("type");
298-
299-
var typeFullnameAttr = doc.CreateAttribute("fullname");
300-
typeFullnameAttr.Value = type.FullName;
301-
typeNode.Attributes.Append(typeFullnameAttr);
302-
303-
var requiredAttr = doc.CreateAttribute("required");
304-
requiredAttr.Value = "false";
305-
typeNode.Attributes.Append(requiredAttr);
289+
var typeElement = new XElement("type",
290+
new XAttribute("fullname", type.FullName),
291+
new XAttribute("required", "false"));
306292

307293
// Add property elements for each public property
308294
foreach (var propName in properties.OrderBy(p => p))
309295
{
310-
var propertyNode = doc.CreateElement("property");
311-
var nameAttr = doc.CreateAttribute("name");
312-
nameAttr.Value = propName;
313-
propertyNode.Attributes.Append(nameAttr);
314-
typeNode.AppendChild(propertyNode);
296+
typeElement.Add(new XElement("property",
297+
new XAttribute("name", propName)));
315298
}
316299

317-
assemblyNode.AppendChild(typeNode);
300+
assemblyElement.Add(typeElement);
318301
}
319302

320-
linkerNode.AppendChild(assemblyNode);
303+
linkerElement.Add(assemblyElement);
321304
}
322305

323306
// Ensure output directory exists
@@ -327,6 +310,10 @@ private void GenerateLinkerDescriptor(Dictionary<TypeDefinition, HashSet<string>
327310
Directory.CreateDirectory(outputDir);
328311
}
329312

313+
var doc = new XDocument(
314+
new XDeclaration("1.0", "UTF-8", null),
315+
linkerElement);
316+
330317
doc.Save(OutputDescriptorPath);
331318
Log.LogMessage(MessageImportance.High, $"BindableTypeLinkerGenerator: Saved descriptor to {OutputDescriptorPath}");
332319
}

0 commit comments

Comments
 (0)