/// <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); }