public MethodReferenceVisitor(TypeHandler typeHandler,
                               DataCollector dataCollector,
                               PdbLocator pdbLocator)
 {
     this.typeHandler   = typeHandler ?? throw new ArgumentNullException(nameof(typeHandler));
     this.dataCollector = dataCollector ?? throw new ArgumentNullException(nameof(dataCollector));
     this.pdbLocator    = pdbLocator ?? throw new ArgumentNullException(nameof(pdbLocator));
 }
        private void AddSymbolsFromBinary(string binary, bool resolveMainMethod = false)
        {
            string pdb = PdbLocator.FindPdbFile(binary, _settings.GetPathExtension(_executable), _logger);

            if (pdb == null)
            {
                _logger.DebugWarning($"No .pdb file found for '{binary}'");
                return;
            }

            AddSymbolsFromBinary(binary, pdb, resolveMainMethod);
        }
        private void AddSymbolsFromBinary(string binary)
        {
            string pdb = PdbLocator.FindPdbFile(binary, _pathExtension, _logger);

            if (pdb == null)
            {
                _logger.DebugWarning($"No .pdb file found for '{binary}'");
                return;
            }

            AddSymbolsFromBinary(binary, pdb);
        }
        public TypeHandler(Assembly[] assemblies,
                           NamespaceFilter nameFilter,
                           NamespaceFilter namespaceFollowFilter,
                           DataCollector dataCollector,
                           PdbLocator pdbLocator)
        {
            this.assemblies            = assemblies;
            this.nameFilter            = nameFilter;
            this.namespaceFollowFilter = namespaceFollowFilter;
            this.dataCollector         = dataCollector;
            this.pdbLocator            = pdbLocator;

            foreach (var assembly in assemblies)
            {
                Cache.CollectedAssemblies.Add(assembly, 1);
            }
        }
示例#5
0
        public void Index(string outputFileName)
        {
            // create the Sourcetrail data collector
            var dataCollector = new DataCollector(outputFileName);

            var pdbLocator = new PdbLocator();
            // set up the type handler
            var typeHandler = new TypeHandler(assemblies, nameFilter, namespaceFollowFilter, dataCollector, pdbLocator);

            typeHandler.MethodCollected += (sender, args) => collectedMethods.Add(args.CollectedMethod);

            foreach (var assembly in assemblies)
            {
                Console.WriteLine("Indexing assembly {0}{1}", assembly.Location, Environment.NewLine);

                pdbLocator.AddAssembly(assembly);
                try
                {
                    Console.WriteLine("Collecting types...");
                    // collect all types first
                    foreach (var type in assembly.GetTypes())
                    {
                        typeHandler.AddToDbIfValid(type);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Exception indexing assemby '{0}'\r\n{1}", assembly.Location, ex);
                }
            }

            Console.WriteLine("{1}Collected {0} types{1}", Cache.CollectedTypes.Count, Environment.NewLine);

            // set up the visitor for parsed methods
            var referenceVisitor = new MethodReferenceVisitor(typeHandler, dataCollector, pdbLocator);
            var ilParser         = new ILParser(referenceVisitor);

            referenceVisitor.ParseMethod += (sender, args) => CollectReferencesFromILCode(
                ilParser,
                args.CollectedMethod.Method, args.CollectedMethod.MethodId, args.CollectedMethod.ClassId);
            // parse IL of colected methods
            HandleCollectedMethods(ilParser);

            dataCollector.Dispose();
        }