private static async Task<DiagnosticAnalysisResult> AnalyzeAsync(TestWorkspace workspace, ProjectId projectId, Type analyzerType, CancellationToken cancellationToken = default(CancellationToken)) { var diagnosticService = workspace.ExportProvider.GetExportedValue<IDiagnosticAnalyzerService>(); var executor = new VisualStudioDiagnosticAnalyzerExecutor(diagnosticService, new MyUpdateSource(workspace)); var analyzerReference = new AnalyzerFileReference(analyzerType.Assembly.Location, new TestAnalyzerAssemblyLoader()); var project = workspace.CurrentSolution.GetProject(projectId).AddAnalyzerReference(analyzerReference); var analyzerDriver = (await project.GetCompilationAsync()).WithAnalyzers(analyzerReference.GetAnalyzers(project.Language).Where(a => a.GetType() == analyzerType).ToImmutableArray()); var result = await executor.AnalyzeAsync(analyzerDriver, project, cancellationToken); return result.AnalysisResult[analyzerDriver.Analyzers[0]]; }
public async Task TestHostAnalyzers() { var code = @"class Test { void Method() { var t = new Test(); } }"; using (var workspace = await CreateWorkspaceAsync(LanguageNames.CSharp, code)) { var analyzerType = typeof(CSharpUseExplicitTypeDiagnosticAnalyzer); var analyzerReference = new AnalyzerFileReference(analyzerType.Assembly.Location, new TestAnalyzerAssemblyLoader()); var mockAnalyzerService = CreateMockDiagnosticAnalyzerService(new[] { analyzerReference }); // add host analyzer as global assets var snapshotService = workspace.Services.GetService<ISolutionSynchronizationService>(); var assetBuilder = new CustomAssetBuilder(workspace); foreach (var reference in mockAnalyzerService.GetHostAnalyzerReferences()) { var asset = assetBuilder.Build(reference, CancellationToken.None); snapshotService.AddGlobalAsset(reference, asset, CancellationToken.None); } // set option workspace.Options = workspace.Options.WithChangedOption(CSharpCodeStyleOptions.UseImplicitTypeWhereApparent, new CodeStyleOption<bool>(false, NotificationOption.Suggestion)); // run analysis var project = workspace.CurrentSolution.Projects.First(); var executor = new VisualStudioDiagnosticAnalyzerExecutor(mockAnalyzerService, new MyUpdateSource(workspace)); var analyzerDriver = (await project.GetCompilationAsync()).WithAnalyzers(analyzerReference.GetAnalyzers(project.Language).Where(a => a.GetType() == analyzerType).ToImmutableArray()); var result = await executor.AnalyzeAsync(analyzerDriver, project, CancellationToken.None); var analyzerResult = result.AnalysisResult[analyzerDriver.Analyzers[0]]; // check result var diagnostics = analyzerResult.SemanticLocals[analyzerResult.DocumentIds.First()]; Assert.Equal(IDEDiagnosticIds.UseExplicitTypeDiagnosticId, diagnostics[0].Id); } }