X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FMono.CodeContracts%2FMono.CodeContracts.Rewrite%2FRewriter.cs;h=36d6822f61114952d3e7fa6f8645bb40dbd5a101;hb=e2b2d181084848f3c5dde2788370db1b79893c69;hp=b366321b72ec0007502cf52b14a0c4d9c99acf3a;hpb=aa9a2d7ce72da959546b2800a0617fccc0224672;p=mono.git diff --git a/mcs/class/Mono.CodeContracts/Mono.CodeContracts.Rewrite/Rewriter.cs b/mcs/class/Mono.CodeContracts/Mono.CodeContracts.Rewrite/Rewriter.cs index b366321b72e..36d6822f611 100644 --- a/mcs/class/Mono.CodeContracts/Mono.CodeContracts.Rewrite/Rewriter.cs +++ b/mcs/class/Mono.CodeContracts/Mono.CodeContracts.Rewrite/Rewriter.cs @@ -1,149 +1,103 @@ -// -// Rewriter.cs -// -// Authors: -// Chris Bacon (chrisbacon76@gmail.com) -// -// Copyright (C) 2010 Novell, Inc (http://www.novell.com) -// -// 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 static class Rewriter { - - public static RewriterResults Rewrite (RewriterOptions options) - { - if (!options.Rewrite) { - return RewriterResults.Warning("Not asked to rewrite"); - } - - if (!options.Assembly.IsSet) { - return RewriterResults.Error ("No assembly given to rewrite"); - } - AssemblyDefinition assembly = options.Assembly.IsFilename ? - AssemblyDefinition.ReadAssembly (options.Assembly.Filename) : - AssemblyDefinition.ReadAssembly (options.Assembly.Streams.Assembly); - - if (options.ForceAssemblyRename != null) { - assembly.Name = new AssemblyNameDefinition (options.ForceAssemblyRename, new Version (0, 0, 0, 0)); - } - - List errors = new List (); - List warnings = new List (); - - bool usingMdb = false; - bool usingPdb = false; - List symReaders = new List (); - if (options.Debug) { - if (options.Assembly.IsStream && options.Assembly.Streams.Symbols == null) { - warnings.Add ("-debug specified, but no symbol stream provided."); - } else { - try { - ISymbolReaderProvider symProv = new Mono.Cecil.Mdb.MdbReaderProvider (); - foreach (var module in assembly.Modules) { - ISymbolReader sym = options.Assembly.IsFilename ? - symProv.GetSymbolReader (module, options.Assembly.Filename) : - symProv.GetSymbolReader (module, options.Assembly.Streams.Symbols); - module.ReadSymbols (sym); - symReaders.Add(sym); - } - usingMdb = true; - } catch { - try { - ISymbolReaderProvider symProv = new Mono.Cecil.Pdb.PdbReaderProvider (); - foreach (var module in assembly.Modules) { - ISymbolReader sym = options.Assembly.IsFilename ? - symProv.GetSymbolReader (module, options.Assembly.Filename) : - symProv.GetSymbolReader (module, options.Assembly.Streams.Symbols); - module.ReadSymbols (sym); - symReaders.Add(sym); - } - usingPdb = true; - } catch { - } - } - if (!usingMdb && !usingPdb) { - warnings.Add ("-debug specified, but no MDB or PDB symbol file found."); - } - } - } - - var output = options.OutputFile.IsSet ? options.OutputFile : options.Assembly; - ISymbolWriter symWriter = null; - if (options.WritePdbFile) { - if (!options.Debug) { - return RewriterResults.Error ("Must specify -debug if using -writePDBFile."); - } - if (output.IsStream && output.Streams.Symbols==null){ - return RewriterResults.Error ("-writePDFFile specified, but no output symbol stream provided."); - } - // TODO: Get symbol writing to work. - ISymbolWriterProvider symProv = null; - if (usingMdb) { - symProv = new Mono.Cecil.Mdb.MdbWriterProvider (); - } else if (usingPdb) { - symProv = new Mono.Cecil.Pdb.PdbWriterProvider (); - } else { - warnings.Add ("-writePDBFile specified, but no symbol file found, cannot write symbols."); - } - if (symProv != null) { - symWriter = output.IsFilename ? - symProv.GetSymbolWriter (assembly.MainModule, output.Filename) : - symProv.GetSymbolWriter (assembly.MainModule, output.Streams.Symbols); - } - } - try { - PerformRewrite rewriter = new PerformRewrite (symWriter, options); - rewriter.Rewrite (assembly); - - if (output.IsFilename) { - assembly.Name.Name = Path.GetFileNameWithoutExtension (output.Filename); - assembly.Write (output.Filename); - } else { - assembly.Write (output.Streams.Assembly); - } - } finally { - if (symWriter != null) { - symWriter.Dispose (); - } - foreach (var symReader in symReaders) { - try { - if (symReader != null) { - symReader.Dispose (); - } - } catch { - } - } - } - - return new RewriterResults (warnings, errors); - } - - } -} +// +// 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 warnings = new List (); + private List errors = new List (); + + 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); + } + + } +}