private void EnsureTypeContractRuntime ()\r
{\r
if (this.typeContractsRuntime == null) {\r
+ // namespace System.Diagnostics.Contracts {\r
+ // [CompilerGenerated]\r
+ // private static class __ContractsRuntime {\r
+ // }\r
+ // }\r
+ \r
// Create type\r
TypeReference typeObject = this.module.Import (typeof (object));\r
TypeDefinition type = new TypeDefinition (Namespace, "__ContractsRuntime",\r
private void EnsureTypeContractException ()\r
{\r
if (this.options.ThrowOnFailure && this.typeContractException == null) {\r
+ // [CompilerGenerated]\r
+ // private class ContractException : Exception {\r
+ // internal ContractException(ContractFailureKind kind, string usermsg, string condition, Exception inner)\r
+ // : base(failure, inner)\r
+ // {\r
+ // }\r
+ // }\r
+ \r
+ // Prepare type references\r
TypeReference typeVoid = this.module.Import (typeof (void));\r
TypeReference typeContractFailureKind = this.module.Import (typeof (ContractFailureKind));\r
TypeReference typeString = this.module.Import (typeof (string));\r
private void EnsureMethodTriggerFailure ()\r
{\r
if (this.methodTriggerFailure == null) {\r
+ // if the ThrowOnFailure option is true, then:\r
+ // internal static void TriggerFailure(ContractFailureKind kind, string message, string userMessage, string conditionText, Exception inner)\r
+ // {\r
+ // throw new ContractException(kind, message, userMessage, conditionText, inner);\r
+ // }\r
+ \r
+ // if the ThrowOnFailure option is false, then:\r
+ // internal static void TriggerFailure(ContractFailureKind kind, string message, string userMessage, string conditionText, Exception inner)\r
+ // {\r
+ // Debug.Fail(message, userMessage);\r
+ // }\r
+ \r
+ // Prepare type references\r
TypeReference typeVoid = this.module.Import (typeof (void));\r
TypeReference typeContractFailureKind = this.module.Import (typeof (ContractFailureKind));\r
TypeReference typeString = this.module.Import (typeof (string));\r
private void EnsureMethodReportFailure ()\r
{\r
if (this.methodReportFailure == null) {\r
+ // internal static void ReportFailure(ContractFailureKind kind, string message, string conditionText, Exception inner)\r
+ // {\r
+ // string s = ContractHelper.RaiseContractFailedEvent(kind, message, conditionText, inner);\r
+ // if (s != null) {\r
+ // TriggerFailure(kind, s, message, conditionText, inner);\r
+ // }\r
+ // }\r
+ \r
+ // Prepare type references\r
TypeReference typeVoid = this.module.Import (typeof (void));\r
TypeReference typeContractFailureKind = this.module.Import (typeof (ContractFailureKind));\r
TypeReference typeString = this.module.Import (typeof (string));\r
{\r
this.EnsureGlobal ();\r
if (this.methodRequires == null) {\r
+ // [DebuggerNonUserCode]\r
+ // [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]\r
+ // internal static void Requires(bool condition, string message, string conditionText)\r
+ // {\r
+ // if (!condition) {\r
+ // ReportFailure(ContractFailureKind.Precondition, message, conditionText, null);\r
+ // }\r
+ // }\r
+ \r
+ // Prepare type references\r
TypeReference typeVoid = this.module.Import (typeof (void));\r
TypeReference typeBoolean = this.module.Import (typeof (bool));\r
TypeReference typeString = this.module.Import (typeof (string));\r
using System.IO;\r
\r
namespace Mono.CodeContracts.Rewrite {\r
- public static class Rewriter {\r
+ public class Rewriter {\r
\r
public static RewriterResults Rewrite (RewriterOptions options)\r
{\r
- if (!options.Rewrite) {\r
- return RewriterResults.Warning("Not asked to rewrite");\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 (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.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
- if (!options.Assembly.IsSet) {\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 = options.Assembly.IsFilename ?\r
- AssemblyDefinition.ReadAssembly (options.Assembly.Filename) :\r
- AssemblyDefinition.ReadAssembly (options.Assembly.Streams.Assembly);\r
+ AssemblyDefinition assembly = this.options.Assembly.IsFilename ?\r
+ AssemblyDefinition.ReadAssembly (this.options.Assembly.Filename) :\r
+ AssemblyDefinition.ReadAssembly (this.options.Assembly.Streams.Assembly);\r
\r
- if (options.ForceAssemblyRename != null) {\r
- assembly.Name = new AssemblyNameDefinition (options.ForceAssemblyRename, new Version (0, 0, 0, 0));\r
+ if (this.options.ForceAssemblyRename != null) {\r
+ assembly.Name = new AssemblyNameDefinition (this.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
+ this.LoadSymbolReader (assembly);\r
}\r
\r
- var output = options.OutputFile.IsSet ? options.OutputFile : options.Assembly;\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
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
+ symWriter = this.LoadSymbolWriter (assembly, output);\r
}\r
+ \r
try {\r
- PerformRewrite rewriter = new PerformRewrite (symWriter, options);\r
+ PerformRewrite rewriter = new PerformRewrite (symWriter, this.options);\r
rewriter.Rewrite (assembly);\r
\r
if (output.IsFilename) {\r
if (symWriter != null) {\r
symWriter.Dispose ();\r
}\r
- foreach (var symReader in symReaders) {\r
+ foreach (var symReader in this.symReaders) {\r
try {\r
if (symReader != null) {\r
symReader.Dispose ();\r
\r
return new RewriterResults (warnings, errors);\r
}\r
-\r
+ \r
}\r
}\r