{"action":"created","comment":{"url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/pulls/comments/48457755","id":48457755,"diff_hunk":"@@ -0,0 +1,307 @@\n+﻿// Copyright (c) Tunnel Vision Laboratories, LLC. All Rights Reserved.\n+// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.\n+\n+namespace StyleCop.Analyzers.Helpers\n+{\n+    using System;\n+    using System.Collections.Concurrent;\n+    using System.Collections.Generic;\n+    using System.Collections.Immutable;\n+    using System.Linq;\n+    using System.Reflection;\n+    using System.Threading;\n+    using System.Threading.Tasks;\n+    using Microsoft.CodeAnalysis;\n+    using Microsoft.CodeAnalysis.CodeFixes;\n+    using Microsoft.CodeAnalysis.Diagnostics;\n+    using Microsoft.CodeAnalysis.Text;\n+\n+    internal static class FixAllContextHelper\n+    {\n+        private static readonly ImmutableDictionary<string, ImmutableArray<Type>> DiagnosticAnalyzers = GetAllAnalyzers();\n+\n+        private static readonly Func<CompilationWithAnalyzers, SyntaxTree, CancellationToken, Task<ImmutableArray<Diagnostic>>> GetAnalyzerSyntaxDiagnosticsAsync;\n+        private static readonly Func<CompilationWithAnalyzers, SemanticModel, TextSpan?, CancellationToken, Task<ImmutableArray<Diagnostic>>> GetAnalyzerSemanticDiagnosticsAsync;\n+        private static readonly Func<CompilationWithAnalyzers, ImmutableArray<DiagnosticAnalyzer>, CancellationToken, Task<ImmutableArray<Diagnostic>>> GetAnalyzerCompilationDiagnosticsAsync;\n+\n+        static FixAllContextHelper()\n+        {\n+            Version roslynVersion = typeof(AdditionalText).GetTypeInfo().Assembly.GetName().Version;\n+            bool avoidGetAnalyzerDiagnosticsAsync = roslynVersion >= new Version(1, 1, 0, 0) && roslynVersion < new Version(1, 2, 0, 0);\n+            if (avoidGetAnalyzerDiagnosticsAsync)\n+            {\n+                var methodInfo = typeof(CompilationWithAnalyzers).GetRuntimeMethod(nameof(GetAnalyzerSyntaxDiagnosticsAsync), new[] { typeof(SyntaxTree), typeof(CancellationToken) });\n+                GetAnalyzerSyntaxDiagnosticsAsync = (Func<CompilationWithAnalyzers, SyntaxTree, CancellationToken, Task<ImmutableArray<Diagnostic>>>)methodInfo?.CreateDelegate(typeof(Func<CompilationWithAnalyzers, SyntaxTree, CancellationToken, Task<ImmutableArray<Diagnostic>>>));\n+\n+                methodInfo = typeof(CompilationWithAnalyzers).GetRuntimeMethod(nameof(GetAnalyzerSemanticDiagnosticsAsync), new[] { typeof(SemanticModel), typeof(TextSpan?), typeof(CancellationToken) });\n+                GetAnalyzerSemanticDiagnosticsAsync = (Func<CompilationWithAnalyzers, SemanticModel, TextSpan?, CancellationToken, Task<ImmutableArray<Diagnostic>>>)methodInfo?.CreateDelegate(typeof(Func<CompilationWithAnalyzers, SemanticModel, TextSpan?, CancellationToken, Task<ImmutableArray<Diagnostic>>>));\n+\n+                methodInfo = typeof(CompilationWithAnalyzers).GetRuntimeMethod(nameof(GetAnalyzerCompilationDiagnosticsAsync), new[] { typeof(ImmutableArray<DiagnosticAnalyzer>), typeof(CancellationToken) });\n+                GetAnalyzerCompilationDiagnosticsAsync = (Func<CompilationWithAnalyzers, ImmutableArray<DiagnosticAnalyzer>, CancellationToken, Task<ImmutableArray<Diagnostic>>>)methodInfo?.CreateDelegate(typeof(Func<CompilationWithAnalyzers, ImmutableArray<DiagnosticAnalyzer>, CancellationToken, Task<ImmutableArray<Diagnostic>>>));\n+            }\n+        }\n+\n+        public static async Task<ImmutableDictionary<Document, ImmutableArray<Diagnostic>>> GetDocumentDiagnosticsToFixAsync(FixAllContext fixAllContext)\n+        {\n+            var allDiagnostics = ImmutableArray<Diagnostic>.Empty;\n+            var projectsToFix = ImmutableArray<Project>.Empty;\n+\n+            var document = fixAllContext.Document;\n+            var project = fixAllContext.Project;\n+\n+            switch (fixAllContext.Scope)\n+            {\n+            case FixAllScope.Document:\n+                if (document != null)\n+                {\n+                    var documentDiagnostics = await fixAllContext.GetDocumentDiagnosticsAsync(document).ConfigureAwait(false);\n+                    return ImmutableDictionary<Document, ImmutableArray<Diagnostic>>.Empty.SetItem(document, documentDiagnostics);\n+                }\n+\n+                break;\n+\n+            case FixAllScope.Project:\n+                projectsToFix = ImmutableArray.Create(project);\n+                allDiagnostics = await GetAllDiagnosticsAsync(fixAllContext, project).ConfigureAwait(false);\n+                break;\n+\n+            case FixAllScope.Solution:\n+                projectsToFix = project.Solution.Projects\n+                    .Where(p => p.Language == project.Language)\n+                    .ToImmutableArray();\n+\n+                var diagnostics = new ConcurrentDictionary<ProjectId, ImmutableArray<Diagnostic>>();\n+                var tasks = new Task[projectsToFix.Length];\n+                for (int i = 0; i < projectsToFix.Length; i++)\n+                {\n+                    fixAllContext.CancellationToken.ThrowIfCancellationRequested();\n+                    var projectToFix = projectsToFix[i];\n+                    tasks[i] = Task.Run(\n+                        async () =>\n+                        {\n+                            var projectDiagnostics = await GetAllDiagnosticsAsync(fixAllContext, projectToFix).ConfigureAwait(false);\n+                            diagnostics.TryAdd(projectToFix.Id, projectDiagnostics);\n+                        }, fixAllContext.CancellationToken);\n+                }\n+\n+                await Task.WhenAll(tasks).ConfigureAwait(false);\n+                allDiagnostics = allDiagnostics.AddRange(diagnostics.SelectMany(i => i.Value.Where(x => fixAllContext.DiagnosticIds.Contains(x.Id))));\n+                break;\n+            }\n+\n+            if (allDiagnostics.IsEmpty)\n+            {\n+                return ImmutableDictionary<Document, ImmutableArray<Diagnostic>>.Empty;\n+            }\n+\n+            return await GetDocumentDiagnosticsToFixAsync(allDiagnostics, projectsToFix, fixAllContext.CancellationToken).ConfigureAwait(false);\n+        }\n+\n+        public static async Task<ImmutableDictionary<Project, ImmutableArray<Diagnostic>>> GetProjectDiagnosticsToFixAsync(FixAllContext fixAllContext)\n+        {\n+            var project = fixAllContext.Project;\n+            if (project != null)\n+            {\n+                switch (fixAllContext.Scope)\n+                {\n+                case FixAllScope.Project:\n+                    var diagnostics = await fixAllContext.GetProjectDiagnosticsAsync(project).ConfigureAwait(false);\n+                    return ImmutableDictionary<Project, ImmutableArray<Diagnostic>>.Empty.SetItem(project, diagnostics);\n+\n+                case FixAllScope.Solution:\n+                    var projectsAndDiagnostics = new ConcurrentDictionary<Project, ImmutableArray<Diagnostic>>();\n+                    var options = new ParallelOptions() { CancellationToken = fixAllContext.CancellationToken };\n+                    Parallel.ForEach(project.Solution.Projects, options, proj =>\n+                    {\n+                        fixAllContext.CancellationToken.ThrowIfCancellationRequested();\n+                        var projectDiagnosticsTask = fixAllContext.GetProjectDiagnosticsAsync(proj);\n+                        projectDiagnosticsTask.Wait(fixAllContext.CancellationToken);\n+                        var projectDiagnostics = projectDiagnosticsTask.Result;\n+                        if (projectDiagnostics.Any())\n+                        {\n+                            projectsAndDiagnostics.TryAdd(proj, projectDiagnostics);\n+                        }\n+                    });\n+\n+                    return projectsAndDiagnostics.ToImmutableDictionary();\n+                }\n+            }\n+\n+            return ImmutableDictionary<Project, ImmutableArray<Diagnostic>>.Empty;\n+        }\n+\n+        public static async Task<ImmutableArray<Diagnostic>> GetAllDiagnosticsAsync(Compilation compilation, CompilationWithAnalyzers compilationWithAnalyzers, ImmutableArray<DiagnosticAnalyzer> analyzers, IEnumerable<Document> documents, bool includeCompilerDiagnostics, CancellationToken cancellationToken)\n+        {\n+            if (GetAnalyzerSyntaxDiagnosticsAsync == null || GetAnalyzerSemanticDiagnosticsAsync == null)\n+            {\n+                // In everything except Roslyn 1.1, we use GetAllDiagnosticsAsync and return the result.\n+                var allDiagnostics = await compilationWithAnalyzers.GetAllDiagnosticsAsync().ConfigureAwait(false);\n+                return allDiagnostics;\n+            }\n+\n+            compilationWithAnalyzers.Compilation.GetDeclarationDiagnostics(cancellationToken);\n+\n+            // Note that the following loop to obtain syntax and semantic diagnostics for each document cannot operate\n+            // on parallel due to our use of a single CompilationWithAnalyzers instance.\n+            var diagnostics = ImmutableArray<Diagnostic>.Empty;","path":"StyleCop.Analyzers/StyleCop.Analyzers.CodeFixes/Helpers/FixAllContextHelper.cs","position":146,"original_position":146,"commit_id":"051dd5009df68797054b6d2329630b413694d3a8","original_commit_id":"051dd5009df68797054b6d2329630b413694d3a8","user":{"login":"vweijsters","id":10659991,"avatar_url":"https://avatars.githubusercontent.com/u/10659991?v=3","gravatar_id":"","url":"https://api.github.com/users/vweijsters","html_url":"https://github.com/vweijsters","followers_url":"https://api.github.com/users/vweijsters/followers","following_url":"https://api.github.com/users/vweijsters/following{/other_user}","gists_url":"https://api.github.com/users/vweijsters/gists{/gist_id}","starred_url":"https://api.github.com/users/vweijsters/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vweijsters/subscriptions","organizations_url":"https://api.github.com/users/vweijsters/orgs","repos_url":"https://api.github.com/users/vweijsters/repos","events_url":"https://api.github.com/users/vweijsters/events{/privacy}","received_events_url":"https://api.github.com/users/vweijsters/received_events","type":"User","site_admin":false},"body":":thought_balloon: using an `ImmutableArray<Diagnostic>.Builder` or a `List<Diagnostic>` would improve the performance when adding diagnostics. There is no need to have the diagnostics in the `ImmutableArray<Diagnostic>` type yet, as they are never passed to another method.","created_at":"2015-12-27T19:47:36Z","updated_at":"2015-12-27T19:47:36Z","html_url":"https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/1983#discussion_r48457755","pull_request_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/pulls/1983","_links":{"self":{"href":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/pulls/comments/48457755"},"html":{"href":"https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/1983#discussion_r48457755"},"pull_request":{"href":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/pulls/1983"}}},"pull_request":{"url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/pulls/1983","id":54382396,"html_url":"https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/1983","diff_url":"https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/1983.diff","patch_url":"https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/1983.patch","issue_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/issues/1983","number":1983,"state":"open","locked":false,"title":"Improve DocumentBasedFixAllProvider performance for multiple documents","user":{"login":"sharwell","id":1408396,"avatar_url":"https://avatars.githubusercontent.com/u/1408396?v=3","gravatar_id":"","url":"https://api.github.com/users/sharwell","html_url":"https://github.com/sharwell","followers_url":"https://api.github.com/users/sharwell/followers","following_url":"https://api.github.com/users/sharwell/following{/other_user}","gists_url":"https://api.github.com/users/sharwell/gists{/gist_id}","starred_url":"https://api.github.com/users/sharwell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sharwell/subscriptions","organizations_url":"https://api.github.com/users/sharwell/orgs","repos_url":"https://api.github.com/users/sharwell/repos","events_url":"https://api.github.com/users/sharwell/events{/privacy}","received_events_url":"https://api.github.com/users/sharwell/received_events","type":"User","site_admin":false},"body":"Previously, custom fix all providers called `FixAllContext.GetDocumentDiagnosticsAsync` for every document in the fix all scope. This change first replaces those calls with a single call to `FixAllContextHelpers.GetDocumentDiagnosticsToFixAsync`, which was extracted from `CustomBatchFixAllProvider`. It goes on to instead operate on a `CompilationWithAnalyzers` following the commentary in #1979. The result is improved performance when fixing violations in large projects, especially when only a few documents in the project contained violations.\r\n\r\nFixes #1974.","created_at":"2015-12-22T15:38:59Z","updated_at":"2015-12-27T19:47:36Z","closed_at":null,"merged_at":null,"merge_commit_sha":"02180e900dae3309212be77c9fd7ec2069038a92","assignee":{"login":"sharwell","id":1408396,"avatar_url":"https://avatars.githubusercontent.com/u/1408396?v=3","gravatar_id":"","url":"https://api.github.com/users/sharwell","html_url":"https://github.com/sharwell","followers_url":"https://api.github.com/users/sharwell/followers","following_url":"https://api.github.com/users/sharwell/following{/other_user}","gists_url":"https://api.github.com/users/sharwell/gists{/gist_id}","starred_url":"https://api.github.com/users/sharwell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sharwell/subscriptions","organizations_url":"https://api.github.com/users/sharwell/orgs","repos_url":"https://api.github.com/users/sharwell/repos","events_url":"https://api.github.com/users/sharwell/events{/privacy}","received_events_url":"https://api.github.com/users/sharwell/received_events","type":"User","site_admin":false},"milestone":{"url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/milestones/35","html_url":"https://github.com/DotNetAnalyzers/StyleCopAnalyzers/milestones/1.0.0%20RC%203","labels_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/milestones/35/labels","id":1470189,"number":35,"title":"1.0.0 RC 3","description":"","creator":{"login":"sharwell","id":1408396,"avatar_url":"https://avatars.githubusercontent.com/u/1408396?v=3","gravatar_id":"","url":"https://api.github.com/users/sharwell","html_url":"https://github.com/sharwell","followers_url":"https://api.github.com/users/sharwell/followers","following_url":"https://api.github.com/users/sharwell/following{/other_user}","gists_url":"https://api.github.com/users/sharwell/gists{/gist_id}","starred_url":"https://api.github.com/users/sharwell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sharwell/subscriptions","organizations_url":"https://api.github.com/users/sharwell/orgs","repos_url":"https://api.github.com/users/sharwell/repos","events_url":"https://api.github.com/users/sharwell/events{/privacy}","received_events_url":"https://api.github.com/users/sharwell/received_events","type":"User","site_admin":false},"open_issues":8,"closed_issues":15,"state":"open","created_at":"2015-12-21T20:32:45Z","updated_at":"2015-12-27T18:57:21Z","due_on":"2015-12-27T06:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/pulls/1983/commits","review_comments_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/pulls/1983/comments","review_comment_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/pulls/comments{/number}","comments_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/issues/1983/comments","statuses_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/statuses/051dd5009df68797054b6d2329630b413694d3a8","head":{"label":"sharwell:fixall-performance","ref":"fixall-performance","sha":"051dd5009df68797054b6d2329630b413694d3a8","user":{"login":"sharwell","id":1408396,"avatar_url":"https://avatars.githubusercontent.com/u/1408396?v=3","gravatar_id":"","url":"https://api.github.com/users/sharwell","html_url":"https://github.com/sharwell","followers_url":"https://api.github.com/users/sharwell/followers","following_url":"https://api.github.com/users/sharwell/following{/other_user}","gists_url":"https://api.github.com/users/sharwell/gists{/gist_id}","starred_url":"https://api.github.com/users/sharwell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sharwell/subscriptions","organizations_url":"https://api.github.com/users/sharwell/orgs","repos_url":"https://api.github.com/users/sharwell/repos","events_url":"https://api.github.com/users/sharwell/events{/privacy}","received_events_url":"https://api.github.com/users/sharwell/received_events","type":"User","site_admin":false},"repo":{"id":26768336,"name":"StyleCopAnalyzers","full_name":"sharwell/StyleCopAnalyzers","owner":{"login":"sharwell","id":1408396,"avatar_url":"https://avatars.githubusercontent.com/u/1408396?v=3","gravatar_id":"","url":"https://api.github.com/users/sharwell","html_url":"https://github.com/sharwell","followers_url":"https://api.github.com/users/sharwell/followers","following_url":"https://api.github.com/users/sharwell/following{/other_user}","gists_url":"https://api.github.com/users/sharwell/gists{/gist_id}","starred_url":"https://api.github.com/users/sharwell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sharwell/subscriptions","organizations_url":"https://api.github.com/users/sharwell/orgs","repos_url":"https://api.github.com/users/sharwell/repos","events_url":"https://api.github.com/users/sharwell/events{/privacy}","received_events_url":"https://api.github.com/users/sharwell/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/sharwell/StyleCopAnalyzers","description":"An implementation of StyleCop rules using the .NET Compiler Platform","fork":true,"url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers","forks_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/forks","keys_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/teams","hooks_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/hooks","issue_events_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/issues/events{/number}","events_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/events","assignees_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/assignees{/user}","branches_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/branches{/branch}","tags_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/tags","blobs_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/git/refs{/sha}","trees_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/statuses/{sha}","languages_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/languages","stargazers_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/stargazers","contributors_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/contributors","subscribers_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/subscribers","subscription_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/subscription","commits_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/commits{/sha}","git_commits_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/git/commits{/sha}","comments_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/comments{/number}","issue_comment_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/issues/comments{/number}","contents_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/contents/{+path}","compare_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/merges","archive_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/downloads","issues_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/issues{/number}","pulls_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/pulls{/number}","milestones_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/milestones{/number}","notifications_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/labels{/name}","releases_url":"https://api.github.com/repos/sharwell/StyleCopAnalyzers/releases{/id}","created_at":"2014-11-17T17:31:15Z","updated_at":"2015-07-28T03:38:00Z","pushed_at":"2015-12-27T18:57:25Z","git_url":"git://github.com/sharwell/StyleCopAnalyzers.git","ssh_url":"git@github.com:sharwell/StyleCopAnalyzers.git","clone_url":"https://github.com/sharwell/StyleCopAnalyzers.git","svn_url":"https://github.com/sharwell/StyleCopAnalyzers","homepage":null,"size":8447,"stargazers_count":0,"watchers_count":0,"language":"C#","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"DotNetAnalyzers:stabilization","ref":"stabilization","sha":"7a4fcf8ed04868369ee6133fcdf4e450f187ed6a","user":{"login":"DotNetAnalyzers","id":9735576,"avatar_url":"https://avatars.githubusercontent.com/u/9735576?v=3","gravatar_id":"","url":"https://api.github.com/users/DotNetAnalyzers","html_url":"https://github.com/DotNetAnalyzers","followers_url":"https://api.github.com/users/DotNetAnalyzers/followers","following_url":"https://api.github.com/users/DotNetAnalyzers/following{/other_user}","gists_url":"https://api.github.com/users/DotNetAnalyzers/gists{/gist_id}","starred_url":"https://api.github.com/users/DotNetAnalyzers/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DotNetAnalyzers/subscriptions","organizations_url":"https://api.github.com/users/DotNetAnalyzers/orgs","repos_url":"https://api.github.com/users/DotNetAnalyzers/repos","events_url":"https://api.github.com/users/DotNetAnalyzers/events{/privacy}","received_events_url":"https://api.github.com/users/DotNetAnalyzers/received_events","type":"Organization","site_admin":false},"repo":{"id":26768275,"name":"StyleCopAnalyzers","full_name":"DotNetAnalyzers/StyleCopAnalyzers","owner":{"login":"DotNetAnalyzers","id":9735576,"avatar_url":"https://avatars.githubusercontent.com/u/9735576?v=3","gravatar_id":"","url":"https://api.github.com/users/DotNetAnalyzers","html_url":"https://github.com/DotNetAnalyzers","followers_url":"https://api.github.com/users/DotNetAnalyzers/followers","following_url":"https://api.github.com/users/DotNetAnalyzers/following{/other_user}","gists_url":"https://api.github.com/users/DotNetAnalyzers/gists{/gist_id}","starred_url":"https://api.github.com/users/DotNetAnalyzers/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DotNetAnalyzers/subscriptions","organizations_url":"https://api.github.com/users/DotNetAnalyzers/orgs","repos_url":"https://api.github.com/users/DotNetAnalyzers/repos","events_url":"https://api.github.com/users/DotNetAnalyzers/events{/privacy}","received_events_url":"https://api.github.com/users/DotNetAnalyzers/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/DotNetAnalyzers/StyleCopAnalyzers","description":"An implementation of StyleCop rules using the .NET Compiler Platform","fork":false,"url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers","forks_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/forks","keys_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/keys{/key_id}","collaborators_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/teams","hooks_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/hooks","issue_events_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/issues/events{/number}","events_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/events","assignees_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/assignees{/user}","branches_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/branches{/branch}","tags_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/tags","blobs_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/git/refs{/sha}","trees_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/git/trees{/sha}","statuses_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/statuses/{sha}","languages_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/languages","stargazers_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/stargazers","contributors_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/contributors","subscribers_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/subscribers","subscription_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/subscription","commits_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/commits{/sha}","git_commits_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/git/commits{/sha}","comments_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/comments{/number}","issue_comment_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/issues/comments{/number}","contents_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/contents/{+path}","compare_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/compare/{base}...{head}","merges_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/merges","archive_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/downloads","issues_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/issues{/number}","pulls_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/pulls{/number}","milestones_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/milestones{/number}","notifications_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/labels{/name}","releases_url":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/releases{/id}","created_at":"2014-11-17T17:29:54Z","updated_at":"2015-12-25T18:38:50Z","pushed_at":"2015-12-27T19:15:42Z","git_url":"git://github.com/DotNetAnalyzers/StyleCopAnalyzers.git","ssh_url":"git@github.com:DotNetAnalyzers/StyleCopAnalyzers.git","clone_url":"https://github.com/DotNetAnalyzers/StyleCopAnalyzers.git","svn_url":"https://github.com/DotNetAnalyzers/StyleCopAnalyzers","homepage":null,"size":11374,"stargazers_count":302,"watchers_count":302,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":71,"mirror_url":null,"open_issues_count":195,"forks":71,"open_issues":195,"watchers":302,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/pulls/1983"},"html":{"href":"https://github.com/DotNetAnalyzers/StyleCopAnalyzers/pull/1983"},"issue":{"href":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/issues/1983"},"comments":{"href":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/issues/1983/comments"},"review_comments":{"href":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/pulls/1983/comments"},"review_comment":{"href":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/pulls/1983/commits"},"statuses":{"href":"https://api.github.com/repos/DotNetAnalyzers/StyleCopAnalyzers/statuses/051dd5009df68797054b6d2329630b413694d3a8"}}}}