[linker] Provide better error message when an error occurs while processing xml descr...
authorRolf Bjarne Kvinge <rolf@xamarin.com>
Thu, 5 Nov 2015 11:20:16 +0000 (12:20 +0100)
committerRolf Bjarne Kvinge <rolf@xamarin.com>
Thu, 5 Nov 2015 11:35:34 +0000 (12:35 +0100)
With this mtouch will show:

> error MT2001: Could not link assemblies. Reason: Failed to process XML description: /work/maccore/master/maccore/tests/link sdk/extra-linker-defs.xml
> Failed to process XML description: /work/maccore/master/maccore/tests/link sdk/extra-linker-defs.xml
> Failed to resolve assembly: 'MonoTouch, Culture=neutral, PublicKeyToken=null'

instead of:

> error MT2002: Failed to resolve assembly: 'MonoTouch, Culture=neutral, PublicKeyToken=null'

which is a lot less helpful.

mcs/tools/linker/Mono.Linker.Steps/BlacklistStep.cs
mcs/tools/linker/Mono.Linker.Steps/ResolveFromXmlStep.cs

index c65d3037c8e64b6960bf38b312bc2e801aaac43b..b09e9e6a7220b46214d66da56c9c6d980ff7df03 100644 (file)
@@ -61,22 +61,23 @@ namespace Mono.Linker.Steps {
                                }
                        }
 
-                       foreach (var rsc in Context.GetAssemblies ()
-                                                               .SelectMany (asm => asm.Modules)
-                                                               .SelectMany (mod => mod.Resources)
-                                                               .Where (res => res.ResourceType == ResourceType.Embedded)
-                                                               .Where (res => Path.GetExtension (res.Name) == ".xml")
-                                                               .Where (res => IsReferenced (GetAssemblyName (res.Name)))
-                                                               .Cast<EmbeddedResource> ()) {
-                               try {
-                                       if (Context.LogInternalExceptions)
-                                               Console.WriteLine ("Processing embedded resource linker descriptor: {0}", rsc.Name);
-
-                                       Context.Pipeline.AddStepAfter (typeof (TypeMapStep), GetExternalResolveStep (rsc));
-                               } catch (XmlException ex) {
-                                       /* This could happen if some broken XML file is embedded. */
-                                       if (Context.LogInternalExceptions)
-                                               Console.WriteLine ("Error processing {0}: {1}", rsc.Name, ex);
+                       foreach (var asm in Context.GetAssemblies ()) {
+                               foreach (var rsc in asm.Modules
+                                                                       .SelectMany (mod => mod.Resources)
+                                                                       .Where (res => res.ResourceType == ResourceType.Embedded)
+                                                                       .Where (res => Path.GetExtension (res.Name) == ".xml")
+                                                                       .Where (res => IsReferenced (GetAssemblyName (res.Name)))
+                                                                       .Cast<EmbeddedResource> ()) {
+                                       try {
+                                               if (Context.LogInternalExceptions)
+                                                       Console.WriteLine ("Processing embedded resource linker descriptor: {0}", rsc.Name);
+
+                                               Context.Pipeline.AddStepAfter (typeof (TypeMapStep), GetExternalResolveStep (rsc, asm));
+                                       } catch (XmlException ex) {
+                                               /* This could happen if some broken XML file is embedded. */
+                                               if (Context.LogInternalExceptions)
+                                                       Console.WriteLine ("Error processing {0}: {1}", rsc.Name, ex);
+                                       }
                                }
                        }
                }
@@ -99,14 +100,14 @@ namespace Mono.Linker.Steps {
                        return false;
                }
 
-               static ResolveFromXmlStep GetExternalResolveStep (EmbeddedResource resource)
+               static ResolveFromXmlStep GetExternalResolveStep (EmbeddedResource resource, AssemblyDefinition assembly)
                {
-                       return new ResolveFromXmlStep (GetExternalDescriptor (resource));
+                       return new ResolveFromXmlStep (GetExternalDescriptor (resource), "resource " + resource.Name + " in " + assembly.FullName);
                }
 
                static ResolveFromXmlStep GetResolveStep (string descriptor)
                {
-                       return new ResolveFromXmlStep (GetDescriptor (descriptor));
+                       return new ResolveFromXmlStep (GetDescriptor (descriptor), "descriptor " + descriptor + " from " + Assembly.GetExecutingAssembly ().FullName);
                }
 
                static XPathDocument GetExternalDescriptor (EmbeddedResource resource)
index 6a797c16e4ecd0baeb9d8ac9945c2729f4a9a84b..5e9f681fd1784d25dfd201c93fc913c409c6fa9f 100644 (file)
@@ -38,6 +38,13 @@ using Mono.Cecil;
 
 namespace Mono.Linker.Steps {
 
+       public class XmlResolutionException : Exception {
+               public XmlResolutionException (string message, Exception innerException)
+                       : base (message, innerException)
+               {
+               }
+       }
+
        public class ResolveFromXmlStep : ResolveStep {
 
                static readonly string _signature = "signature";
@@ -47,10 +54,12 @@ namespace Mono.Linker.Steps {
                static readonly string _ns = string.Empty;
 
                XPathDocument _document;
+               string _xmlDocumentLocation;
 
-               public ResolveFromXmlStep (XPathDocument document)
+               public ResolveFromXmlStep (XPathDocument document, string xmlDocumentLocation = "<unspecified>")
                {
                        _document = document;
+                       _xmlDocumentLocation = xmlDocumentLocation;
                }
 
                protected override void Process ()
@@ -63,7 +72,11 @@ namespace Mono.Linker.Steps {
                        if (nav.LocalName != "linker")
                                return;
 
-                       ProcessAssemblies (Context, nav.SelectChildren ("assembly", _ns));
+                       try {
+                               ProcessAssemblies (Context, nav.SelectChildren ("assembly", _ns));
+                       } catch (Exception ex) {
+                               throw new XmlResolutionException (string.Format ("Failed to process XML description: {0}", _xmlDocumentLocation), ex);
+                       }
                }
 
                void ProcessAssemblies (LinkContext context, XPathNodeIterator iterator)