Author: jbevain
Date: 2007-11-21 06:45:28 -0500 (Wed, 21 Nov 2007)
New Revision: 90073

Modified:
   trunk/mcs/tools/linker/ChangeLog
   trunk/mcs/tools/linker/Mono.Linker.Steps/ResolveFromXmlStep.cs
Log:
2007-11-21  Jb Evain  <[EMAIL PROTECTED]>

        * Mono.Linker.Steps/ResolveFromXmlStep.cs:
                Implement resolving from xml patterns.


Modified: trunk/mcs/tools/linker/ChangeLog
===================================================================
--- trunk/mcs/tools/linker/ChangeLog    2007-11-21 11:43:43 UTC (rev 90072)
+++ trunk/mcs/tools/linker/ChangeLog    2007-11-21 11:45:28 UTC (rev 90073)
@@ -1,3 +1,8 @@
+2007-11-21  Jb Evain  <[EMAIL PROTECTED]>
+
+       * Mono.Linker.Steps/ResolveFromXmlStep.cs:
+               Implement resolving from xml patterns.
+
 2007-10-25  Jb Evain  <[EMAIL PROTECTED]>
 
        * monolinker.exe.sources

Modified: trunk/mcs/tools/linker/Mono.Linker.Steps/ResolveFromXmlStep.cs
===================================================================
--- trunk/mcs/tools/linker/Mono.Linker.Steps/ResolveFromXmlStep.cs      
2007-11-21 11:43:43 UTC (rev 90072)
+++ trunk/mcs/tools/linker/Mono.Linker.Steps/ResolveFromXmlStep.cs      
2007-11-21 11:45:28 UTC (rev 90073)
@@ -30,6 +30,7 @@
 using System;
 using SR = System.Reflection;
 using System.Text;
+using System.Text.RegularExpressions;
 using System.Xml.XPath;
 
 using Mono.Cecil;
@@ -93,32 +94,65 @@
                        while (iterator.MoveNext ()) {
                                XPathNavigator nav = iterator.Current;
                                string fullname = GetFullName (nav);
+
+                               if (IsTypePattern (fullname)) {
+                                       ProcessTypePattern (fullname, assembly, 
nav);
+                                       continue;
+                               }
+
                                TypeDefinition type = assembly.MainModule.Types 
[fullname];
                                if (type == null)
                                        continue;
 
-                               TypePreserve preserve = GetTypePreserve (nav);
+                               ProcessType (type, nav);
+                       }
+               }
 
-                               if (!IsRequired (nav)) {
-                                       Annotations.SetPreserve (type, 
preserve);
+               static bool IsTypePattern (string fullname)
+               {
+                       return fullname.IndexOf ("*") != -1;
+               }
+
+               static Regex CreateRegexFromPattern (string pattern)
+               {
+                       return new Regex (pattern.Replace(".", 
@"\.").Replace("*", "(.*)"));
+               }
+
+               void ProcessTypePattern (string fullname, AssemblyDefinition 
assembly, XPathNavigator nav)
+               {
+                       Regex regex = CreateRegexFromPattern (fullname);
+
+                       foreach (TypeDefinition type in 
assembly.MainModule.Types) {
+                               if (!regex.Match (type.FullName).Success)
                                        continue;
-                               }
 
-                               Annotations.Mark (type);
+                               ProcessType (type, nav);
+                       }
+               }
 
-                               switch (preserve) {
-                               case TypePreserve.Nothing:
-                                       if (nav.HasChildren) {
-                                               MarkSelectedFields (nav, type);
-                                               MarkSelectedMethods (nav, type);
-                                       } else
-                                               Annotations.SetPreserve (type, 
TypePreserve.All);
-                                       break;
-                               default:
-                                       Annotations.SetPreserve (type, 
preserve);
-                                       break;
-                               }
+               void ProcessType (TypeDefinition type, XPathNavigator nav)
+               {
+                       TypePreserve preserve = GetTypePreserve (nav);
+
+                       if (!IsRequired (nav)) {
+                               Annotations.SetPreserve (type, preserve);
+                               return;
                        }
+
+                       Annotations.Mark (type);
+
+                       switch (preserve) {
+                       case TypePreserve.Nothing:
+                               if (nav.HasChildren) {
+                                       MarkSelectedFields (nav, type);
+                                       MarkSelectedMethods (nav, type);
+                               } else
+                                       Annotations.SetPreserve (type, 
TypePreserve.All);
+                               break;
+                       default:
+                               Annotations.SetPreserve (type, preserve);
+                               break;
+                       }
                }
 
                void MarkSelectedFields (XPathNavigator nav, TypeDefinition 
type)

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to