public CSharpDiagnosticWorker(OmniSharpWorkspace workspace, DiagnosticEventForwarder forwarder, ILoggerFactory loggerFactory) { _workspace = workspace; _forwarder = forwarder; _logger = loggerFactory.CreateLogger <CSharpDiagnosticWorker>(); var openDocumentsSubject = new Subject <string>(); _openDocuments = openDocumentsSubject; _workspace.WorkspaceChanged += OnWorkspaceChanged; _workspace.DocumentOpened += OnDocumentOpened; _workspace.DocumentClosed += OnDocumentOpened; openDocumentsSubject .GroupByUntil(x => true, group => Observable.Amb( group.Throttle(TimeSpan.FromMilliseconds(200)), group.Distinct().Skip(99)) ) .Select(x => x.ToArray()) .Merge() .SubscribeOn(TaskPoolScheduler.Default) .Select(ProcessQueue) .Merge() .Subscribe(); }
public async Task CodeCheckSpecifiedFileOnly() { var workspace = await TestHelpers.CreateSimpleWorkspace(new Dictionary <string, string> { { "a.cs", "class C { int n = true; }" } }); var fakeLoggerFactory = new FakeLoggerFactory(); var messages = new List <OmniSharp.Models.DiagnosticMessage>(); var emitter = new DiagnosticTestEmitter(messages); var forwarder = new DiagnosticEventForwarder(emitter); forwarder.IsEnabled = true; var service = new CSharpDiagnosticService(workspace, forwarder, fakeLoggerFactory); service.QueueDiagnostics("a.cs"); await emitter.Emitted; Assert.Equal(1, messages.Count); var message = messages.First(); Assert.Equal(1, message.Results.Count()); var result = message.Results.First(); Assert.Equal(1, result.QuickFixes.Count()); Assert.Equal("a.cs", result.FileName); }
public async Task CodeCheckSpecifiedFileOnly(string filename) { var testFile = new TestFile(filename, "class C { int n = true; }"); SharedOmniSharpTestHost.AddFilesToWorkspace(testFile); var messages = new List <DiagnosticMessage>(); var emitter = new DiagnosticTestEmitter(messages); var forwarder = new DiagnosticEventForwarder(emitter) { IsEnabled = true }; var service = new CSharpDiagnosticService(SharedOmniSharpTestHost.Workspace, forwarder, this.LoggerFactory); service.QueueDiagnostics(filename); await emitter.Emitted; Assert.Single(messages); var message = messages.First(); Assert.Single(message.Results); var result = message.Results.First(); Assert.Single(result.QuickFixes); Assert.Equal(filename, result.FileName); }
public async Task CheckAllFiles(string filename1, string filename2) { var testFile1 = new TestFile(filename1, "class C1 { int n = true; }"); var testFile2 = new TestFile(filename2, "class C2 { int n = true; }"); SharedOmniSharpTestHost.AddFilesToWorkspace(testFile1, testFile2); var messages = new List <DiagnosticMessage>(); var emitter = new DiagnosticTestEmitter(messages); var forwarder = new DiagnosticEventForwarder(emitter); var service = new CSharpDiagnosticService(SharedOmniSharpTestHost.Workspace, forwarder, this.LoggerFactory); var controller = new DiagnosticsService(SharedOmniSharpTestHost.Workspace, forwarder, service); var response = await controller.Handle(new DiagnosticsRequest()); await emitter.Emitted; Assert.Single(messages); var message = messages.First(); Assert.Equal(2, message.Results.Count()); var a = message.Results.First(x => x.FileName == filename1); Assert.Single(a.QuickFixes); Assert.Equal(filename1, a.FileName); var b = message.Results.First(x => x.FileName == filename2); Assert.Single(b.QuickFixes); Assert.Equal(filename2, b.FileName); }
public CSharpDiagnosticWorkerWithAnalyzers( OmniSharpWorkspace workspace, [ImportMany] IEnumerable <ICodeActionProvider> providers, ILoggerFactory loggerFactory, DiagnosticEventForwarder forwarder, OmniSharpOptions options) { _logger = loggerFactory.CreateLogger <CSharpDiagnosticWorkerWithAnalyzers>(); _providers = providers.ToImmutableArray(); _workQueue = new AnalyzerWorkQueue(loggerFactory, timeoutForPendingWorkMs: options.RoslynExtensionsOptions.DocumentAnalysisTimeoutMs * 3); _forwarder = forwarder; _options = options; _workspace = workspace; _workspaceAnalyzerOptionsConstructor = Assembly .Load("Microsoft.CodeAnalysis.Features") .GetType("Microsoft.CodeAnalysis.Diagnostics.WorkspaceAnalyzerOptions") .GetConstructor(new Type[] { typeof(AnalyzerOptions), typeof(Solution) }) ?? throw new InvalidOperationException("Could not resolve 'Microsoft.CodeAnalysis.Diagnostics.WorkspaceAnalyzerOptions' for IDE analyzers."); _workspace.WorkspaceChanged += OnWorkspaceChanged; _workspace.OnInitialized += OnWorkspaceInitialized; Task.Factory.StartNew(() => Worker(AnalyzerWorkType.Foreground), TaskCreationOptions.LongRunning); Task.Factory.StartNew(() => Worker(AnalyzerWorkType.Background), TaskCreationOptions.LongRunning); OnWorkspaceInitialized(_workspace.Initialized); }
public async Task CheckAllFiles() { var workspace = await TestHelpers.CreateSimpleWorkspace(new Dictionary <string, string> { { "a.cs", "class C1 { int n = true; }" }, { "b.cs", "class C2 { int n = true; }" }, }); var fakeLoggerFactory = new FakeLoggerFactory(); var messages = new List <OmniSharp.Models.DiagnosticMessage>(); var emitter = new DiagnosticTestEmitter(messages); var forwarder = new DiagnosticEventForwarder(emitter); var service = new CSharpDiagnosticService(workspace, forwarder, fakeLoggerFactory); var controller = new DiagnosticsService(workspace, forwarder, service); var response = await controller.Handle(new OmniSharp.Models.DiagnosticsRequest()); await emitter.Emitted; Assert.Equal(1, messages.Count); var message = messages.First(); Assert.Equal(2, message.Results.Count()); var a = message.Results.First(x => x.FileName == "a.cs"); Assert.Equal(1, a.QuickFixes.Count()); Assert.Equal("a.cs", a.FileName); var b = message.Results.First(x => x.FileName == "b.cs"); Assert.Equal(1, b.QuickFixes.Count()); Assert.Equal("b.cs", b.FileName); }
public CSharpDiagnosticWorker(OmniSharpWorkspace workspace, DiagnosticEventForwarder forwarder, ILoggerFactory loggerFactory, OmniSharpOptions options) { _workspace = workspace; _forwarder = forwarder; _logger = loggerFactory.CreateLogger <CSharpDiagnosticWorker>(); _options = options; var openDocumentsSubject = new Subject <string>(); _openDocuments = openDocumentsSubject; _workspace.WorkspaceChanged += OnWorkspaceChanged; _workspace.DocumentOpened += OnDocumentOpened; _workspace.DocumentClosed += OnDocumentOpened; _disposable = openDocumentsSubject .Buffer(() => Observable.Amb( openDocumentsSubject.Skip(99).Select(z => Unit.Default), Observable.Timer(TimeSpan.FromMilliseconds(100)).Select(z => Unit.Default) )) .SubscribeOn(TaskPoolScheduler.Default) .Select(ProcessQueue) .Merge() .Subscribe(); }
public CSharpDiagnosticService(OmnisharpWorkspace workspace, DiagnosticEventForwarder forwarder, ILoggerFactory loggerFactory) { _workspace = workspace; _forwarder = forwarder; _logger = loggerFactory.CreateLogger <CSharpDiagnosticService>(); _workspace.WorkspaceChanged += OnWorkspaceChanged; }
public CsharpDiagnosticWorkerComposer( OmniSharpWorkspace workspace, [ImportMany] IEnumerable <ICodeActionProvider> providers, ILoggerFactory loggerFactory, DiagnosticEventForwarder forwarder, IOptionsMonitor <OmniSharpOptions> options) { _workspace = workspace; _providers = providers; _loggerFactory = loggerFactory; _forwarder = forwarder; _onChange = options.OnChange(UpdateImplementation); UpdateImplementation(options.CurrentValue); }
public CsharpDiagnosticWorkerComposer( OmniSharpWorkspace workspace, [ImportMany] IEnumerable <ICodeActionProvider> providers, ILoggerFactory loggerFactory, DiagnosticEventForwarder forwarder, OmniSharpOptions options) { if (options.RoslynExtensionsOptions.EnableAnalyzersSupport) { _implementation = new CSharpDiagnosticWorkerWithAnalyzers(workspace, providers, loggerFactory, forwarder, options); } else { _implementation = new CSharpDiagnosticWorker(workspace, forwarder, loggerFactory); } }
public async Task EnablesWhenEndPointIsHit(string filename1, string filename2) { var testFile1 = new TestFile(filename1, "class C1 { int n = true; }"); var testFile2 = new TestFile(filename2, "class C2 { int n = true; }"); SharedOmniSharpTestHost.AddFilesToWorkspace(testFile1, testFile2); var messages = new List <DiagnosticMessage>(); var emitter = new DiagnosticTestEmitter(messages); var forwarder = new DiagnosticEventForwarder(emitter); var service = new CSharpDiagnosticService(SharedOmniSharpTestHost.Workspace, forwarder, this.LoggerFactory); var controller = new DiagnosticsService(SharedOmniSharpTestHost.Workspace, forwarder, service); var response = await controller.Handle(new DiagnosticsRequest()); Assert.True(forwarder.IsEnabled); }
public async Task EnablesWhenEndPointIsHit(string filename1, string filename2) { SharedOmniSharpTestHost.ClearWorkspace(); var testFile1 = new TestFile(filename1, "class C1 { int n = true; }"); var testFile2 = new TestFile(filename2, "class C2 { int n = true; }"); SharedOmniSharpTestHost.AddFilesToWorkspace(testFile1, testFile2); var emitter = new TestEventEmitter <DiagnosticMessage>(); var forwarder = new DiagnosticEventForwarder(emitter); var service = CreateDiagnosticService(forwarder); var controller = new DiagnosticsService(forwarder, service); var response = await controller.Handle(new DiagnosticsRequest()); Assert.True(forwarder.IsEnabled); }
public async Task EnablesWhenEndPointIsHit() { var workspace = await TestHelpers.CreateSimpleWorkspace(new Dictionary <string, string> { { "a.cs", "class C1 { int n = true; }" }, { "b.cs", "class C2 { int n = true; }" }, }); var fakeLoggerFactory = new FakeLoggerFactory(); var messages = new List <OmniSharp.Models.DiagnosticMessage>(); var emitter = new DiagnosticTestEmitter(messages); var forwarder = new DiagnosticEventForwarder(emitter); var service = new CSharpDiagnosticService(workspace, forwarder, fakeLoggerFactory); var controller = new DiagnosticsService(workspace, forwarder, service); var response = await controller.Handle(new OmniSharp.Models.DiagnosticsRequest()); Assert.Equal(true, forwarder.IsEnabled); }
public async Task CheckAllFiles(string filename1, string filename2) { SharedOmniSharpTestHost.ClearWorkspace(); var testFile1 = new TestFile(filename1, "class C1 { int n = true; }"); var testFile2 = new TestFile(filename2, "class C2 { int n = true; }"); SharedOmniSharpTestHost.AddFilesToWorkspace(testFile1, testFile2); var emitter = new TestEventEmitter <DiagnosticMessage>(); var forwarder = new DiagnosticEventForwarder(emitter); var service = CreateDiagnosticService(forwarder); var controller = new DiagnosticsService(forwarder, service); var response = await controller.Handle(new DiagnosticsRequest()); await emitter.ExpectForEmitted(msg => msg.Results .Any(r => r.FileName == filename1 && r.QuickFixes.Count() == 1)); await emitter.ExpectForEmitted(msg => msg.Results .Any(r => r.FileName == filename2 && r.QuickFixes.Count() == 1)); }
public async Task CodeCheckSpecifiedFileOnly(string filename) { SharedOmniSharpTestHost.ClearWorkspace(); var testFile = new TestFile(filename, "class C { int n = true; }"); var emitter = new TestEventEmitter <DiagnosticMessage>(); var forwarder = new DiagnosticEventForwarder(emitter) { IsEnabled = true }; var service = CreateDiagnosticService(forwarder); SharedOmniSharpTestHost.AddFilesToWorkspace(testFile); var controller = new DiagnosticsService(forwarder, service); var response = await controller.Handle(new DiagnosticsRequest { FileName = testFile.FileName }); await emitter.ExpectForEmitted(msg => msg.Results.Any(m => m.FileName == filename)); }
public DiagnosticsService(OmnisharpWorkspace workspace, DiagnosticEventForwarder forwarder, CSharpDiagnosticService diagnostics) { _forwarder = forwarder; _workspace = workspace; _diagnostics = diagnostics; }
private CSharpDiagnosticWorkerWithAnalyzers CreateDiagnosticService(DiagnosticEventForwarder forwarder) { return(new CSharpDiagnosticWorkerWithAnalyzers(SharedOmniSharpTestHost.Workspace, Enumerable.Empty <ICodeActionProvider>(), this.LoggerFactory, forwarder, new OmniSharpOptions())); }
public DiagnosticsService(DiagnosticEventForwarder forwarder, ICsDiagnosticWorker diagWorker) { _forwarder = forwarder; _diagWorker = diagWorker; }