55using System . IO ;
66using System . Linq ;
77using System . Text ;
8- using System . Xml ;
8+ using System . Xml . Linq ;
99using Microsoft . Build . Framework ;
1010using Microsoft . Build . Utilities ;
1111using 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