Merge pull request #409 from Alkarex/patch-1
[mono.git] / mcs / class / Mono.CodeContracts / Mono.CodeContracts.Rewrite / Rewriter.cs
index 0b4a8bec2dfa481953ec7cf858ef486109173165..36d6822f61114952d3e7fa6f8645bb40dbd5a101 100644 (file)
-//\r
-// Rewriter.cs\r
-//\r
-// Authors:\r
-//     Chris Bacon (chrisbacon76@gmail.com)\r
-//\r
-// Copyright (C) 2010 Novell, Inc (http://www.novell.com)\r
-//\r
-// Permission is hereby granted, free of charge, to any person obtaining\r
-// a copy of this software and associated documentation files (the\r
-// "Software"), to deal in the Software without restriction, including\r
-// without limitation the rights to use, copy, modify, merge, publish,\r
-// distribute, sublicense, and/or sell copies of the Software, and to\r
-// permit persons to whom the Software is furnished to do so, subject to\r
-// the following conditions:\r
-// \r
-// The above copyright notice and this permission notice shall be\r
-// included in all copies or substantial portions of the Software.\r
-// \r
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
-//\r
-\r
-using System;\r
-using System.Collections.Generic;\r
-using System.Linq;\r
-using System.Text;\r
-using Mono.Cecil.Cil;\r
-using Mono.Cecil;\r
-using System.IO;\r
-using Mono.CompilerServices.SymbolWriter;\r
-\r
-namespace Mono.CodeContracts.Rewrite {\r
-       public class Rewriter {\r
-\r
-               public static RewriterResults Rewrite (RewriterOptions options)\r
-               {\r
-                       Rewriter rewriter = new Rewriter(options);\r
-                       return rewriter.RewriteImpl();\r
-               }\r
-               \r
-               private Rewriter(RewriterOptions options)\r
-               {\r
-                       this.options = options;\r
-               }\r
-               \r
-               private RewriterOptions options;\r
-               private List<string> warnings = new List<string> ();\r
-               private List<string> errors = new List<string> ();\r
-               private bool usingMdb = false;\r
-               private bool usingPdb = false;\r
-               private List<ISymbolReader> symReaders = new List<ISymbolReader> ();\r
-               \r
-               private void LoadSymbolReader (AssemblyDefinition assembly) {\r
-                       if (this.options.Assembly.IsStream && this.options.Assembly.Streams.Symbols == null) {\r
-                               this.warnings.Add ("-debug specified, but no symbol stream provided.");\r
-                       } else {\r
-                               try {\r
-                                       //ISymbolReaderProvider symProv = new Mono.Cecil.Mdb.MdbReaderProvider ();\r
-                                       foreach (ModuleDefinition module in assembly.Modules) {\r
-                                               //ISymbolReader sym = this.options.Assembly.IsFilename ?\r
-                                               //      symProv.GetSymbolReader (module, this.options.Assembly.Filename) :\r
-                                               //      symProv.GetSymbolReader (module, this.options.Assembly.Streams.Symbols);\r
-                                               //module.ReadSymbols (sym);\r
-                                               //this.symReaders.Add (sym);\r
-                                               module.LoadSymbols ();\r
-                                       }\r
-                                       this.usingMdb = true;\r
-                               } catch {\r
-//                                     try {\r
-//                                             ISymbolReaderProvider symProv = new Mono.Cecil.Pdb.PdbReaderProvider ();\r
-//                                             foreach (var module in assembly.Modules) {\r
-//                                                     ISymbolReader sym = this.options.Assembly.IsFilename ?\r
-//                                                             symProv.GetSymbolReader (module, this.options.Assembly.Filename) :\r
-//                                                             symProv.GetSymbolReader (module, this.options.Assembly.Streams.Symbols);\r
-//                                                     module.ReadSymbols (sym);\r
-//                                                     this.symReaders.Add (sym);\r
-//                                             }\r
-//                                             this.usingPdb = true;\r
-//                                     } catch {\r
-//                                     }\r
-                               }\r
-                               if (!this.usingMdb && !this.usingPdb) {\r
-                                       this.warnings.Add ("-debug specified, but no MDB or PDB symbol file found.");\r
-                               }\r
-                       }\r
-               }\r
-               \r
-               private ISymbolWriter LoadSymbolWriter(AssemblyDefinition assembly, AssemblyRef output)\r
-               {\r
-                       // TODO: Get symbol writing to work.\r
-//                     ISymbolWriterProvider symProv = null;\r
-//                     if (this.usingMdb) {\r
-//                             symProv = new Mono.Cecil.Mdb.MdbWriterProvider ();\r
-//                     } else if (this.usingPdb) {\r
-//                             symProv = new Mono.Cecil.Pdb.PdbWriterProvider ();\r
-//                     } else {\r
-//                             this.warnings.Add ("-writePDBFile specified, but no symbol file found, cannot write symbols.");\r
-//                     }\r
-//                     if (symProv != null) {\r
-//                             return output.IsFilename ?\r
-//                                     symProv.GetSymbolWriter (assembly.MainModule, output.Filename) :\r
-//                                     symProv.GetSymbolWriter (assembly.MainModule, output.Streams.Symbols);\r
-//                     }\r
-                       return null;\r
-               }\r
-\r
-\r
-               private RewriterResults RewriteImpl ()\r
-               {\r
-                       if (!this.options.Rewrite) {\r
-                               return RewriterResults.Warning ("Not asked to rewrite");\r
-                       }\r
-\r
-                       if (!this.options.Assembly.IsSet) {\r
-                               return RewriterResults.Error ("No assembly given to rewrite");\r
-                       }\r
-                       AssemblyDefinition assembly = this.options.Assembly.IsFilename ?\r
-                               AssemblyFactory.GetAssembly (this.options.Assembly.Filename) :\r
-                               AssemblyFactory.GetAssembly (this.options.Assembly.Streams.Assembly);\r
-                       \r
-                       if (this.options.ForceAssemblyRename != null) {\r
-                               assembly.Name.Name = this.options.ForceAssemblyRename;\r
-                       } else if (this.options.OutputFile.IsSet && this.options.OutputFile.IsFilename) {\r
-                               assembly.Name.Name = Path.GetFileNameWithoutExtension(this.options.OutputFile.Filename);\r
-                       }\r
-\r
-                       if (options.Debug) {\r
-                               this.LoadSymbolReader (assembly);\r
-                       }\r
-\r
-                       var output = this.options.OutputFile.IsSet ? this.options.OutputFile : this.options.Assembly;\r
-                       ISymbolWriter symWriter = null;\r
-                       if (options.WritePdbFile) {\r
-                               if (!options.Debug) {\r
-                                       return RewriterResults.Error ("Must specify -debug if using -writePDBFile.");\r
-                               }\r
-                               if (output.IsStream && output.Streams.Symbols==null){\r
-                                       return RewriterResults.Error ("-writePDFFile specified, but no output symbol stream provided.");\r
-                               }\r
-                               symWriter = this.LoadSymbolWriter (assembly, output);\r
-                       }\r
-                       \r
-                       try {\r
-                               PerformRewrite rewriter = new PerformRewrite (symWriter, this.options);\r
-                               rewriter.Rewrite (assembly);\r
-\r
-                               if (output.IsFilename) {\r
-                                       AssemblyFactory.SaveAssembly(assembly, output.Filename);\r
-                               } else {\r
-                                       AssemblyFactory.SaveAssembly(assembly, output.Streams.Assembly);\r
-                               }\r
-                       } finally {\r
-                               if (symWriter != null) {\r
-                                       symWriter.Dispose ();\r
-                               }\r
-                               foreach (var symReader in this.symReaders) {\r
-                                       try {\r
-                                               if (symReader != null) {\r
-                                                       symReader.Dispose ();\r
-                                               }\r
-                                       } catch {\r
-                                       }\r
-                               }\r
-                       }\r
-\r
-                       return new RewriterResults (warnings, errors);\r
-               }\r
-               \r
-       }\r
-}\r
+//
+// Rewriter.cs
+//
+// Authors:
+//     Chris Bacon (chrisbacon76@gmail.com)
+//
+// Copyright (C) 2010 Chris Bacon
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Mono.Cecil.Cil;
+using Mono.Cecil;
+using System.IO;
+
+namespace Mono.CodeContracts.Rewrite {
+       public class Rewriter {
+
+               public static RewriterResults Rewrite (RewriterOptions options)
+               {
+                       Rewriter rewriter = new Rewriter(options);
+                       return rewriter.RewriteImpl();
+               }
+               
+               private Rewriter(RewriterOptions options)
+               {
+                       this.options = options;
+               }
+               
+               private RewriterOptions options;
+               private List<string> warnings = new List<string> ();
+               private List<string> errors = new List<string> ();
+
+               private RewriterResults RewriteImpl ()
+               {
+                       if (!this.options.Rewrite) {
+                               return RewriterResults.Warning ("Not asked to rewrite");
+                       }
+
+                       if (!this.options.Assembly.IsSet) {
+                               return RewriterResults.Error ("No assembly given to rewrite");
+                       }
+
+                       var readerParameters = new ReaderParameters ();
+
+                       if (options.Debug)
+                               readerParameters.ReadSymbols = true;
+
+                       var assembly = this.options.Assembly.IsFilename ?
+                               AssemblyDefinition.ReadAssembly (options.Assembly.Filename, readerParameters) :
+                               AssemblyDefinition.ReadAssembly (options.Assembly.Streams.Assembly, readerParameters);
+                       
+                       if (this.options.ForceAssemblyRename != null) {
+                               assembly.Name.Name = this.options.ForceAssemblyRename;
+                       } else if (this.options.OutputFile.IsSet && this.options.OutputFile.IsFilename) {
+                               assembly.Name.Name = Path.GetFileNameWithoutExtension(this.options.OutputFile.Filename);
+                       }
+
+                       var output = this.options.OutputFile.IsSet ? this.options.OutputFile : this.options.Assembly;
+                       var writerParameters = new WriterParameters ();
+                       if (options.WritePdbFile) {
+                               if (!options.Debug) {
+                                       return RewriterResults.Error ("Must specify -debug if using -writePDBFile.");
+                               }
+                               
+                               writerParameters.WriteSymbols = true;
+                       }
+                       
+                       PerformRewrite rewriter = new PerformRewrite (this.options);
+                       rewriter.Rewrite (assembly);
+
+                       if (output.IsFilename) {
+                               assembly.Write (output.Filename, writerParameters);
+                       } else {
+                               assembly.Write (output.Streams.Assembly, writerParameters);
+                       }
+               
+                       return new RewriterResults (warnings, errors);
+               }
+               
+       }
+}