protected override void ParseFile(string fileName, IProgressMonitor parentMonitor) { if (!File.Exists(fileName)) { return; } IProgressMonitor monitor = parentMonitor; IDisposable timer = Counters.AssemblyParseTime.BeginTiming(); // Update the package version SystemPackage pkg = Runtime.SystemAssemblyService.GetPackageFromPath(assemblyFile); if (pkg != null) { packageVersion = pkg.Name + " " + pkg.Version; } try { if (parentMonitor == null) { monitor = ProjectDomService.GetParseProgressMonitor(); } parsing = true; if (monitor != null) { monitor.BeginTask(string.Format(GettextCatalog.GetString("Parsing assembly: {0}"), Path.GetFileName(fileName)), 1); } if (useExternalProcess) { using (DatabaseGenerator helper = GetGenerator(true)) { string tmpDbFile = helper.GenerateDatabase(runtime.Id, fx.Id, baseDir, assemblyFile); if (Disposed) { if (tmpDbFile != null) { File.Delete(tmpDbFile); } return; } if (tmpDbFile != null) { // GenerateDatabase generates the info in a temp file. Now we have to // unlock the current database file, copy the new file over it, and // read (and lock) the database again. UnlockDatabaseFile(); File.Delete(RealDataFile); File.Move(tmpDbFile, RealDataFile); Read(); } } } else { DomCecilCompilationUnit ainfo = DomCecilCompilationUnit.Load(fileName, false, true, false); UpdateTypeInformation(ainfo.Types, ainfo.Attributes, fileName); // Reset the error retry count, since the file has been // successfully parsed. FileEntry e = GetFile(fileName); e.ParseErrorRetries = 0; Flush(); } } catch (Exception ex) { FileEntry e = GetFile(fileName); e.LastParseTime = DateTime.MinValue; if (e.ParseErrorRetries > 0) { if (--e.ParseErrorRetries == 0) { e.DisableParse = true; } } else { e.ParseErrorRetries = 3; } if (monitor != null) { monitor.ReportError("Error parsing assembly: " + fileName, ex); } throw; } finally { parsing = false; if (monitor != null) { monitor.EndTask(); if (parentMonitor == null) { monitor.Dispose(); } } timer.Dispose(); } ProjectDomService.NotifyAssemblyInfoChange(fileName, assemblyFile); }