Merge pull request #1949 from lewurm/fixtype
[mono.git] / mcs / tools / linker / Mono.Linker.Steps / OutputStep.cs
index 1065a427b110b9421a60b2e5faad41c1bc72683e..0260c892e99b74494f18250b4979bf3c20fbff4c 100644 (file)
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
+using System;
 using System.IO;
 
 using Mono.Cecil;
+using Mono.Cecil.Cil;
 
 namespace Mono.Linker.Steps {
 
@@ -37,6 +39,7 @@ namespace Mono.Linker.Steps {
                protected override void Process ()
                {
                        CheckOutputDirectory ();
+                       Annotations.SaveDependencies ();
                }
 
                void CheckOutputDirectory ()
@@ -59,21 +62,63 @@ namespace Mono.Linker.Steps {
                        CopyConfigFileIfNeeded (assembly, directory);
 
                        switch (Annotations.GetAction (assembly)) {
+                       case AssemblyAction.Save:
                        case AssemblyAction.Link:
-                               AssemblyFactory.SaveAssembly (assembly, GetAssemblyFileName (assembly, directory));
+                               Context.Annotations.AddDependency (assembly);
+                               assembly.Write (GetAssemblyFileName (assembly, directory), SaveSymbols (assembly));
                                break;
                        case AssemblyAction.Copy:
-                               CopyAssembly (GetOriginalAssemblyFileInfo (assembly), directory);
+                               Context.Annotations.AddDependency (assembly);
+                               CloseSymbols (assembly);
+                               CopyAssembly (GetOriginalAssemblyFileInfo (assembly), directory, Context.LinkSymbols);
+                               break;
+                       case AssemblyAction.Delete:
+                               CloseSymbols (assembly);
+                               var target = GetAssemblyFileName (assembly, directory);
+                               if (File.Exists (target)) {
+                                       File.Delete (target);
+                                       File.Delete (target + ".mdb");
+                                       File.Delete (GetConfigFile (target));
+                               }
+                               break;
+                       default:
+                               CloseSymbols (assembly);
                                break;
                        }
                }
 
+               void CloseSymbols (AssemblyDefinition assembly)
+               {
+                       Annotations.CloseSymbolReader (assembly);
+               }
+
+               WriterParameters SaveSymbols (AssemblyDefinition assembly)
+               {
+                       var parameters = new WriterParameters ();
+                       if (!Context.LinkSymbols)
+                               return parameters;
+
+                       if (!assembly.MainModule.HasSymbols)
+                               return parameters;
+
+                       if (Context.SymbolWriterProvider != null)
+                               parameters.SymbolWriterProvider = Context.SymbolWriterProvider;
+                       else
+                               parameters.WriteSymbols = true;
+                       return parameters;
+               }
+
                static void CopyConfigFileIfNeeded (AssemblyDefinition assembly, string directory)
                {
                        string config = GetConfigFile (GetOriginalAssemblyFileInfo (assembly).FullName);
                        if (!File.Exists (config))
                                return;
 
+                       string target = Path.GetFullPath (GetConfigFile (GetAssemblyFileName (assembly, directory)));
+
+                       if (config == target)
+                               return;
+
                        File.Copy (config, GetConfigFile (GetAssemblyFileName (assembly, directory)), true);
                }
 
@@ -84,17 +129,30 @@ namespace Mono.Linker.Steps {
 
                static FileInfo GetOriginalAssemblyFileInfo (AssemblyDefinition assembly)
                {
-                       return assembly.MainModule.Image.FileInformation;
+                       return new FileInfo (assembly.MainModule.FullyQualifiedName);
                }
 
-               static void CopyAssembly (FileInfo fi, string directory)
+               static void CopyAssembly (FileInfo fi, string directory, bool symbols)
                {
-                       File.Copy (fi.FullName, Path.Combine (directory, fi.Name), true);
+                       string target = Path.GetFullPath (Path.Combine (directory, fi.Name));
+                       string source = fi.FullName;
+                       if (source == target)
+                               return;
+
+                       File.Copy (source, target, true);
+
+                       if (!symbols)
+                               return;
+
+                       source += ".mdb";
+                       if (!File.Exists (source))
+                               return;
+                       File.Copy (source, target + ".mdb", true);
                }
 
                static string GetAssemblyFileName (AssemblyDefinition assembly, string directory)
                {
-                       string file = assembly.Name.Name + (assembly.Kind == AssemblyKind.Dll ? ".dll" : ".exe");
+                       string file = assembly.Name.Name + (assembly.MainModule.Kind == ModuleKind.Dll ? ".dll" : ".exe");
                        return Path.Combine (directory, file);
                }
        }