Merge pull request #487 from mayerwin/patch-1
[mono.git] / mcs / tools / linker / Mono.Linker / LinkContext.cs
index e1edf53953658a0540e9109de86d70a70eed970b..8d97f8dc1504b62d710c91111c05e999ed479cab 100644 (file)
@@ -29,7 +29,9 @@
 using System;
 using System.Collections;
 using System.IO;
+
 using Mono.Cecil;
+using Mono.Cecil.Cil;
 
 namespace Mono.Linker {
 
@@ -44,6 +46,10 @@ namespace Mono.Linker {
 
                AssemblyResolver _resolver;
 
+               ReaderParameters _readerParameters;
+               ISymbolReaderProvider _symbolReaderProvider;
+               ISymbolWriterProvider _symbolWriterProvider;
+
                AnnotationStore _annotations;
 
                public Pipeline Pipeline {
@@ -77,6 +83,16 @@ namespace Mono.Linker {
                        get { return _resolver; }
                }
 
+               public ISymbolReaderProvider SymbolReaderProvider {
+                       get { return _symbolReaderProvider; }
+                       set { _symbolReaderProvider = value; }
+               }
+
+               public ISymbolWriterProvider SymbolWriterProvider {
+                       get { return _symbolWriterProvider; }
+                       set { _symbolWriterProvider = value; }
+               }
+
                public LinkContext (Pipeline pipeline)
                        : this (pipeline, new AssemblyResolver ())
                {
@@ -89,6 +105,9 @@ namespace Mono.Linker {
                        _actions = new Hashtable ();
                        _parameters = new Hashtable ();
                        _annotations = new AnnotationStore ();
+                       _readerParameters = new ReaderParameters {
+                               AssemblyResolver = _resolver,
+                       };
                }
 
                public TypeDefinition GetType (string fullName)
@@ -114,9 +133,8 @@ namespace Mono.Linker {
                public AssemblyDefinition Resolve (string name)
                {
                        if (File.Exists (name)) {
-                               AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly (name);
+                               AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly (name, _readerParameters);
                                _resolver.CacheAssembly (assembly);
-                               SafeLoadSymbols (assembly);
                                return assembly;
                        }
 
@@ -126,33 +144,45 @@ namespace Mono.Linker {
                public AssemblyDefinition Resolve (IMetadataScope scope)
                {
                        AssemblyNameReference reference = GetReference (scope);
+                       try {
+                               AssemblyDefinition assembly = _resolver.Resolve (reference, _readerParameters);
 
-                       AssemblyDefinition assembly = _resolver.Resolve (reference);
+                               if (SeenFirstTime (assembly)) {
+                                       SafeReadSymbols (assembly);
+                                       SetAction (assembly);
+                               }
 
-                       if (SeenFirstTime (assembly)) {
-                               SetAction (assembly);
-                               SafeLoadSymbols (assembly);
+                               return assembly;
                        }
+                       catch {
+                               throw new AssemblyResolutionException (reference);
+                       }
+               }
 
-                       return assembly;
+               bool SeenFirstTime (AssemblyDefinition assembly)
+               {
+                       return !_annotations.HasAction (assembly);
                }
 
-               public void SafeLoadSymbols (AssemblyDefinition assembly)
+               public void SafeReadSymbols (AssemblyDefinition assembly)
                {
                        if (!_linkSymbols)
                                return;
 
-                       try {
-                               // throw new NotImplementedException ();
-                               // assembly.MainModule.LoadSymbols ();
-                       } catch {
-                               return; // resharper loves this
-                       }
-               }
+                       if (assembly.MainModule.HasSymbols)
+                               return;
 
-               bool SeenFirstTime (AssemblyDefinition assembly)
-               {
-                       return !_annotations.HasAction (assembly);
+                       try {
+                               if (_symbolReaderProvider != null) {
+                                       var symbolReader = _symbolReaderProvider.GetSymbolReader (
+                                               assembly.MainModule,
+                                               assembly.MainModule.FullyQualifiedName);
+
+                                       _annotations.AddSymbolReader (assembly, symbolReader);
+                                       assembly.MainModule.ReadSymbols (symbolReader);
+                               } else
+                                       assembly.MainModule.ReadSymbols ();
+                       } catch {}
                }
 
                static AssemblyNameReference GetReference (IMetadataScope scope)