Removed code that is no longer required due to change to Cecil 0.6.*
[mono.git] / mcs / class / Mono.CodeContracts / Mono.CodeContracts.Rewrite / Rewriter.cs
1 //\r
2 // Rewriter.cs\r
3 //\r
4 // Authors:\r
5 //      Chris Bacon (chrisbacon76@gmail.com)\r
6 //\r
7 // Copyright (C) 2010 Novell, Inc (http://www.novell.com)\r
8 //\r
9 // Permission is hereby granted, free of charge, to any person obtaining\r
10 // a copy of this software and associated documentation files (the\r
11 // "Software"), to deal in the Software without restriction, including\r
12 // without limitation the rights to use, copy, modify, merge, publish,\r
13 // distribute, sublicense, and/or sell copies of the Software, and to\r
14 // permit persons to whom the Software is furnished to do so, subject to\r
15 // the following conditions:\r
16 // \r
17 // The above copyright notice and this permission notice shall be\r
18 // included in all copies or substantial portions of the Software.\r
19 // \r
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
27 //\r
28 \r
29 using System;\r
30 using System.Collections.Generic;\r
31 using System.Linq;\r
32 using System.Text;\r
33 using Mono.Cecil.Cil;\r
34 using Mono.Cecil;\r
35 using System.IO;\r
36 using Mono.CompilerServices.SymbolWriter;\r
37 \r
38 namespace Mono.CodeContracts.Rewrite {\r
39         public class Rewriter {\r
40 \r
41                 public static RewriterResults Rewrite (RewriterOptions options)\r
42                 {\r
43                         Rewriter rewriter = new Rewriter(options);\r
44                         return rewriter.RewriteImpl();\r
45                 }\r
46                 \r
47                 private Rewriter(RewriterOptions options)\r
48                 {\r
49                         this.options = options;\r
50                 }\r
51                 \r
52                 private RewriterOptions options;\r
53                 private List<string> warnings = new List<string> ();\r
54                 private List<string> errors = new List<string> ();\r
55                 private bool usingMdb = false;\r
56                 private bool usingPdb = false;\r
57                 \r
58                 private void LoadSymbolReader (AssemblyDefinition assembly) {\r
59                         if (this.options.Assembly.IsStream && this.options.Assembly.Streams.Symbols == null) {\r
60                                 this.warnings.Add ("-debug specified, but no symbol stream provided.");\r
61                         } else {\r
62                                 try {\r
63                                         foreach (ModuleDefinition module in assembly.Modules) {\r
64                                                 module.LoadSymbols ();\r
65                                         }\r
66                                         this.usingMdb = true;\r
67                                 } catch {\r
68                                 }\r
69                                 if (!this.usingMdb && !this.usingPdb) {\r
70                                         this.warnings.Add ("-debug specified, but no MDB or PDB symbol file found.");\r
71                                 }\r
72                         }\r
73                 }\r
74                 \r
75                 private ISymbolWriter LoadSymbolWriter(AssemblyDefinition assembly, AssemblyRef output)\r
76                 {\r
77                         // TODO: Get symbol writing to work.\r
78 //                      ISymbolWriterProvider symProv = null;\r
79 //                      if (this.usingMdb) {\r
80 //                              symProv = new Mono.Cecil.Mdb.MdbWriterProvider ();\r
81 //                      } else if (this.usingPdb) {\r
82 //                              symProv = new Mono.Cecil.Pdb.PdbWriterProvider ();\r
83 //                      } else {\r
84 //                              this.warnings.Add ("-writePDBFile specified, but no symbol file found, cannot write symbols.");\r
85 //                      }\r
86 //                      if (symProv != null) {\r
87 //                              return output.IsFilename ?\r
88 //                                      symProv.GetSymbolWriter (assembly.MainModule, output.Filename) :\r
89 //                                      symProv.GetSymbolWriter (assembly.MainModule, output.Streams.Symbols);\r
90 //                      }\r
91                         return null;\r
92                 }\r
93 \r
94 \r
95                 private RewriterResults RewriteImpl ()\r
96                 {\r
97                         if (!this.options.Rewrite) {\r
98                                 return RewriterResults.Warning ("Not asked to rewrite");\r
99                         }\r
100 \r
101                         if (!this.options.Assembly.IsSet) {\r
102                                 return RewriterResults.Error ("No assembly given to rewrite");\r
103                         }\r
104                         AssemblyDefinition assembly = this.options.Assembly.IsFilename ?\r
105                                 AssemblyFactory.GetAssembly (this.options.Assembly.Filename) :\r
106                                 AssemblyFactory.GetAssembly (this.options.Assembly.Streams.Assembly);\r
107                         \r
108                         if (this.options.ForceAssemblyRename != null) {\r
109                                 assembly.Name.Name = this.options.ForceAssemblyRename;\r
110                         } else if (this.options.OutputFile.IsSet && this.options.OutputFile.IsFilename) {\r
111                                 assembly.Name.Name = Path.GetFileNameWithoutExtension(this.options.OutputFile.Filename);\r
112                         }\r
113 \r
114                         if (options.Debug) {\r
115                                 this.LoadSymbolReader (assembly);\r
116                         }\r
117 \r
118                         var output = this.options.OutputFile.IsSet ? this.options.OutputFile : this.options.Assembly;\r
119                         ISymbolWriter symWriter = null;\r
120                         if (options.WritePdbFile) {\r
121                                 if (!options.Debug) {\r
122                                         return RewriterResults.Error ("Must specify -debug if using -writePDBFile.");\r
123                                 }\r
124                                 if (output.IsStream && output.Streams.Symbols==null){\r
125                                         return RewriterResults.Error ("-writePDFFile specified, but no output symbol stream provided.");\r
126                                 }\r
127                                 symWriter = this.LoadSymbolWriter (assembly, output);\r
128                         }\r
129                         \r
130                         try {\r
131                                 PerformRewrite rewriter = new PerformRewrite (symWriter, this.options);\r
132                                 rewriter.Rewrite (assembly);\r
133 \r
134                                 if (output.IsFilename) {\r
135                                         AssemblyFactory.SaveAssembly(assembly, output.Filename);\r
136                                 } else {\r
137                                         AssemblyFactory.SaveAssembly(assembly, output.Streams.Assembly);\r
138                                 }\r
139                         } finally {\r
140                                 if (symWriter != null) {\r
141                                         symWriter.Dispose ();\r
142                                 }\r
143                         }\r
144 \r
145                         return new RewriterResults (warnings, errors);\r
146                 }\r
147                 \r
148         }\r
149 }\r