Ejemplo n.º 1
0
        /// <summary>
        /// Traverse the given assembly (located in options.Assembly) for contracts and return the contracts.
        /// </summary>
        /// <remarks>
        /// We use dictionary mapping special string ids that are unique to each member in an XML file to
        /// the contracts that that member has.
        /// </remarks>
        static IDictionary <string, XContract[]> GetContracts(Options options, DocTracker docTracker)
        {
            Contract.Requires(options != null);
            Contract.Requires(docTracker != null);
            Contract.Ensures(Contract.Result <IDictionary <string, XContract[]> >() != null);

            #region Establish host and load assembly

            Contract.Assume(options.resolvedPaths != null);

            var host = new CodeContractAwareHostEnvironment(options.libpaths);
            foreach (var p in options.resolvedPaths)
            {
                host.AddResolvedPath(p);
            }
            IModule module = host.LoadUnitFrom(options.assembly) as IModule;
            if (module == null || module == Dummy.Module || module == Dummy.Assembly)
            {
                Console.WriteLine("'{0}' is not a PE file containing a CLR module or assembly.", options.assembly);
                Environment.Exit(1);
            }
            #endregion
            #region Create the contracts dictionary
            Dictionary <string, XContract[]> contracts = new Dictionary <string, XContract[]>(StringComparer.Ordinal); //Use Ordinal compare for faster string comparison.
            #endregion
            #region Traverse module and extract contracts
            var contractsVisitor = new ContractVisitor(host, contracts, options, docTracker);
            var traverser        = new ContractTraverser(host);
            traverser.PreorderVisitor = contractsVisitor;
            traverser.Traverse(module);
            #endregion
            return(contracts);
        }
Ejemplo n.º 2
0
    /// <summary>
    /// Traverse the given assembly (located in options.Assembly) for contracts and return the contracts.
    /// </summary>
    /// <remarks>
    /// We use dictionary mapping special string ids that are unique to each member in an XML file to 
    /// the contracts that that member has.
    /// </remarks>
    static IDictionary<string, XContract[]> GetContracts(Options options, DocTracker docTracker) {
      Contract.Requires(options != null);
      Contract.Requires(docTracker != null);
      Contract.Ensures(Contract.Result<IDictionary<string,XContract[]>>() != null);
      
      #region Establish host and load assembly

      Contract.Assume(options.resolvedPaths != null);

      var host = new CodeContractAwareHostEnvironment(options.libpaths);
      foreach (var p in options.resolvedPaths) {
        host.AddResolvedPath(p);
      }
      IModule module = host.LoadUnitFrom(options.assembly) as IModule;
      if (module == null || module == Dummy.Module || module == Dummy.Assembly) {
        Console.WriteLine("'{0}' is not a PE file containing a CLR module or assembly.", options.assembly);
        Environment.Exit(1);
      }
      #endregion
      #region Create the contracts dictionary
      Dictionary<string, XContract[]> contracts = new Dictionary<string, XContract[]>(StringComparer.Ordinal);  //Use Ordinal compare for faster string comparison.
      #endregion
      #region Traverse module and extract contracts
      var contractsVisitor = new ContractVisitor(host, contracts, options, docTracker);
      var traverser = new ContractTraverser(host);
      traverser.PreorderVisitor = contractsVisitor;
      traverser.Traverse(module);
      #endregion
      return contracts;
    }