public IEnumerable <Achievement> PerformStaticAnalysis(StaticAnalysisManifest staticAnalysisManifest, bool onlyUnlockable) { IEnumerable <Achievement> unlockedAchievements = Enumerable.Empty <Achievement>(); using (var statisAnalysisSession = new StatisAnalysisSession(staticAnalysisManifest)) { OnStaticAnalysisStarted(this, new EventArgs()); var stopwatch = new Stopwatch(); stopwatch.Start(); var allAchievements = onlyUnlockable ? AchievementRepository.GetUnlockableAchievements() : AchievementRepository.GetAchievements(); var availableStaticAnalysisAchievements = allAchievements.Where ( a => typeof(StaticAnalysisAchievementBase).IsAssignableFrom(a.AchievementType) ).ToList(); unlockedAchievements = GetUnlockedAchievements ( statisAnalysisSession, availableStaticAnalysisAchievements ).ToList(); stopwatch.Stop(); OnStaticAnalysisCompleted(this, new StaticAnalysisEventArgs { AchievementsTested = availableStaticAnalysisAchievements.Count, ElapsedMilliseconds = (int)stopwatch.ElapsedMilliseconds }); } if (unlockedAchievements.Any()) { foreach (var completedAchievement in unlockedAchievements) { AchievementRepository.MarkAchievementAsCompleted(completedAchievement); } OnAchievementsUnlocked(this, new AchievementEventArgs { UnlockedAchievements = unlockedAchievements }); } return(unlockedAchievements); }