/// <summary>
        /// Retrieves the analyzers contained within a given NuGet package corresponding to a given language
        /// </summary>
        private IEnumerable <DiagnosticAnalyzer> GetAnalyzers(IPackage package, string language)
        {
            string packageRootDir         = this.packageHandler.GetLocalPackageRootDirectory(package);
            string additionalSearchFolder = this.packageHandler.LocalCacheRoot;

            this.logger.LogInfo(UIResources.APG_LocatingAnalyzers);
            string[] analyzerFiles = Directory.GetFiles(packageRootDir, "*.dll", SearchOption.AllDirectories);

            string roslynLanguageName = SupportedLanguages.GetRoslynLanguageName(language);

            this.logger.LogDebug(UIResources.APG_LogAnalyzerLanguage, roslynLanguageName);

            DiagnosticAssemblyScanner        diagnosticAssemblyScanner = new DiagnosticAssemblyScanner(this.logger, additionalSearchFolder);
            IEnumerable <DiagnosticAnalyzer> analyzers = diagnosticAssemblyScanner.InstantiateDiagnostics(roslynLanguageName, analyzerFiles.Where(x => !x.Contains("Microsoft.CodeAnalysis")).ToArray());

            return(analyzers);
        }
        /// <summary>
        /// Attempts to generate a rules file for assemblies in the specified package.
        /// </summary>
        /// <param name="additionalSearchFolder">Root directory to search when looking for analyzer dependencies</param>
        /// <param name="baseTempDir">Base temporary working directory for this generation run</param>
        /// <param name="rulesFilePath">Full name of the file to create</param>
        private bool TryGenerateRulesFile(IPackage package, string additionalSearchFolder, string baseTempDir, string rulesFilePath, string language)
        {
            bool success = false;

            this.logger.LogInfo(UIResources.APG_GeneratingRules);

            this.logger.LogInfo(UIResources.APG_LocatingAnalyzers);

            string[] files = GetFilesFromPackage(package, baseTempDir).ToArray();

            string roslynLanguageName = SupportedLanguages.GetRoslynLanguageName(language);

            this.logger.LogDebug(UIResources.APG_LogAnalyzerLanguage, roslynLanguageName);

            DiagnosticAssemblyScanner        diagnosticAssemblyScanner = new DiagnosticAssemblyScanner(this.logger, additionalSearchFolder);
            IEnumerable <DiagnosticAnalyzer> analyzers = diagnosticAssemblyScanner.InstantiateDiagnostics(roslynLanguageName, files.ToArray());

            this.logger.LogInfo(UIResources.APG_AnalyzersLocated, analyzers.Count());

            if (analyzers.Any())
            {
                RuleGenerator ruleGen = new RuleGenerator(this.logger);
                Rules         rules   = ruleGen.GenerateRules(analyzers);

                Debug.Assert(rules != null, "Not expecting the generated rules to be null");

                if (rules != null)
                {
                    rules.Save(rulesFilePath, logger);
                    this.logger.LogDebug(UIResources.APG_RulesGeneratedToFile, rules.Count, rulesFilePath);
                    success = true;
                }
            }
            else
            {
                this.logger.LogWarning(UIResources.APG_NoAnalyzersFound);
            }
            return(success);
        }
        public bool Generate(NuGetReference analyzeRef, string language, string sqaleFilePath)
        {
            // sqale file path is optional
            if (analyzeRef == null)
            {
                throw new ArgumentNullException("analyzeRef");
            }
            if (string.IsNullOrWhiteSpace(language))
            {
                throw new ArgumentNullException("language");
            }
            SupportedLanguages.ThrowIfNotSupported(language);

            string   nuGetDirectory = Utilities.CreateTempDirectory(".nuget");
            IPackage package        = this.packageHandler.FetchPackage(analyzeRef.PackageId, analyzeRef.Version, nuGetDirectory);

            if (package != null)
            {
                // Create a uniquely-named temp directory for this generation run
                string baseDirectory = Utilities.CreateTempDirectory(".gen");
                baseDirectory = CreateSubDirectory(baseDirectory, Guid.NewGuid().ToString());
                this.logger.LogDebug(UIResources.APG_CreatedTempWorkingDir, baseDirectory);

                PluginManifest pluginDefn = CreatePluginDefinition(package);

                string rulesFilePath = Path.Combine(baseDirectory, "rules.xml");

                bool success = TryGenerateRulesFile(package, nuGetDirectory, baseDirectory, rulesFilePath, language);

                if (success)
                {
                    BuildPlugin(package, language, rulesFilePath, sqaleFilePath, pluginDefn, baseDirectory);
                }
            }

            return(package != null);
        }