-//\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
-\r
-namespace Mono.CodeContracts.Rewrite {\r
- public static class Rewriter {\r
-\r
- public static RewriterResults Rewrite (RewriterOptions options)\r
- {\r
- if (!options.Rewrite) {\r
- return RewriterResults.Warning("Not asked to rewrite");\r
- }\r
-\r
- if (!options.Assembly.IsSet) {\r
- return RewriterResults.Error ("No assembly given to rewrite");\r
- }\r
- AssemblyDefinition assembly = options.Assembly.IsFilename ?\r
- AssemblyDefinition.ReadAssembly (options.Assembly.Filename) :\r
- AssemblyDefinition.ReadAssembly (options.Assembly.Streams.Assembly);\r
- \r
- if (options.ForceAssemblyRename != null) {\r
- assembly.Name = new AssemblyNameDefinition (options.ForceAssemblyRename, new Version (0, 0, 0, 0));\r
- }\r
-\r
- List<string> errors = new List<string> ();\r
- List<string> warnings = new List<string> ();\r
-\r
- bool usingMdb = false;\r
- bool usingPdb = false;\r
- List<ISymbolReader> symReaders = new List<ISymbolReader> ();\r
- if (options.Debug) {\r
- if (options.Assembly.IsStream && options.Assembly.Streams.Symbols == null) {\r
- warnings.Add ("-debug specified, but no symbol stream provided.");\r
- } else {\r
- try {\r
- ISymbolReaderProvider symProv = new Mono.Cecil.Mdb.MdbReaderProvider ();\r
- foreach (var module in assembly.Modules) {\r
- ISymbolReader sym = options.Assembly.IsFilename ?\r
- symProv.GetSymbolReader (module, options.Assembly.Filename) :\r
- symProv.GetSymbolReader (module, options.Assembly.Streams.Symbols);\r
- module.ReadSymbols (sym);\r
- symReaders.Add(sym);\r
- }\r
- usingMdb = true;\r
- } catch {\r
- try {\r
- ISymbolReaderProvider symProv = new Mono.Cecil.Pdb.PdbReaderProvider ();\r
- foreach (var module in assembly.Modules) {\r
- ISymbolReader sym = options.Assembly.IsFilename ?\r
- symProv.GetSymbolReader (module, options.Assembly.Filename) :\r
- symProv.GetSymbolReader (module, options.Assembly.Streams.Symbols);\r
- module.ReadSymbols (sym);\r
- symReaders.Add(sym);\r
- }\r
- usingPdb = true;\r
- } catch {\r
- }\r
- }\r
- if (!usingMdb && !usingPdb) {\r
- warnings.Add ("-debug specified, but no MDB or PDB symbol file found.");\r
- }\r
- }\r
- }\r
-\r
- var output = options.OutputFile.IsSet ? options.OutputFile : 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
- // TODO: Get symbol writing to work.\r
- ISymbolWriterProvider symProv = null;\r
- if (usingMdb) {\r
- symProv = new Mono.Cecil.Mdb.MdbWriterProvider ();\r
- } else if (usingPdb) {\r
- symProv = new Mono.Cecil.Pdb.PdbWriterProvider ();\r
- } else {\r
- warnings.Add ("-writePDBFile specified, but no symbol file found, cannot write symbols.");\r
- }\r
- if (symProv != null) {\r
- symWriter = output.IsFilename ?\r
- symProv.GetSymbolWriter (assembly.MainModule, output.Filename) :\r
- symProv.GetSymbolWriter (assembly.MainModule, output.Streams.Symbols);\r
- }\r
- }\r
- try {\r
- PerformRewrite rewriter = new PerformRewrite (symWriter, options);\r
- rewriter.Rewrite (assembly);\r
-\r
- if (output.IsFilename) {\r
- assembly.Name.Name = Path.GetFileNameWithoutExtension (output.Filename);\r
- assembly.Write (output.Filename);\r
- } else {\r
- assembly.Write (output.Streams.Assembly);\r
- }\r
- } finally {\r
- if (symWriter != null) {\r
- symWriter.Dispose ();\r
- }\r
- foreach (var symReader in 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);
+ }
+
+ }
+}