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();
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 6
0
        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);
     }
 }
Esempio n. 11
0
        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);
        }
Esempio n. 13
0
        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;
 }