{"action":"created","comment":{"url":"https://api.github.com/repos/dotnet/roslyn-analyzers/pulls/comments/53903707","id":53903707,"diff_hunk":"@@ -106,13 +112,494 @@ public abstract class ImplementIDisposableCorrectlyAnalyzer : DiagnosticAnalyzer\n                                                                              DiagnosticSeverity.Warning,\n                                                                              isEnabledByDefault: false,\n                                                                              description: s_localizableDescription,\n-                                                                             helpLinkUri: null,     // TODO: add MSDN url\n+                                                                             helpLinkUri: HelpLinkUri,\n                                                                              customTags: WellKnownDiagnosticTags.Telemetry);\n \n         public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(IDisposableReimplementationRule, FinalizeOverrideRule, DisposeOverrideRule, DisposeSignatureRule, RenameDisposeRule, DisposeBoolSignatureRule, DisposeImplementationRule, FinalizeImplementationRule, ProvideDisposeBoolRule);\n \n         public override void Initialize(AnalysisContext analysisContext)\n         {\n+            analysisContext.RegisterCompilationStartAction(\n+                context =>\n+                {\n+                    var disposableType = WellKnownTypes.IDisposable(context.Compilation);\n+                    if (disposableType == null)\n+                    {\n+                        return;\n+                    }\n+\n+                    var disposeInterfaceMethod = disposableType.GetMembers(DisposeMethodName).Single() as IMethodSymbol;\n+                    if (disposeInterfaceMethod == null)\n+                    {\n+                        return;\n+                    }\n+\n+                    var garbageCollectorType = context.Compilation.GetTypeByMetadataName(\"System.GC\");\n+                    if (garbageCollectorType == null)\n+                    {\n+                        return;\n+                    }\n+\n+                    var suppressFinalizeMethod = garbageCollectorType.GetMembers(\"SuppressFinalize\").Single() as IMethodSymbol;\n+                    if (suppressFinalizeMethod == null)\n+                    {\n+                        return;\n+                    }\n+\n+                    var analyzer = new Analyzer(context.Compilation, disposableType, disposeInterfaceMethod, suppressFinalizeMethod);\n+                    analyzer.Initialize(context);\n+                });\n+        }\n+\n+        private static bool IsDisposeBoolMethod(IMethodSymbol method)\n+        {\n+            if (method.Name == DisposeMethodName && method.MethodKind == MethodKind.Ordinary &&\n+                method.ReturnsVoid && method.Parameters.Length == 1)\n+            {\n+                var parameter = method.Parameters[0];\n+                if (parameter.Type != null && parameter.Type.SpecialType == SpecialType.System_Boolean && parameter.RefKind == RefKind.None)\n+                {\n+                    return true;\n+                }\n+            }\n+\n+            return false;\n+        }\n+\n+        /// <summary>\n+        /// Analyzes single instance of compilation.\n+        /// </summary>\n+        private class Analyzer\n+        {\n+            private readonly Compilation compilation;\n+            private readonly INamedTypeSymbol disposableType;\n+            private readonly IMethodSymbol disposeInterfaceMethod;\n+            private readonly IMethodSymbol suppressFinalizeMethod;\n+\n+            public Analyzer(Compilation compilation, INamedTypeSymbol disposableType, IMethodSymbol disposeInterfaceMethod, IMethodSymbol suppressFinalizeMethod)\n+            {\n+                this.compilation = compilation;\n+                this.disposableType = disposableType;\n+                this.disposeInterfaceMethod = disposeInterfaceMethod;\n+                this.suppressFinalizeMethod = suppressFinalizeMethod;\n+            }\n+\n+            public void Initialize(CompilationStartAnalysisContext context)\n+            {\n+                context.RegisterSymbolAction(AnalyzeNamedTypeSymbol, SymbolKind.NamedType);\n+                context.RegisterOperationBlockAction(AnalyzeOperationBlock);\n+            }\n+\n+            private void AnalyzeNamedTypeSymbol(SymbolAnalysisContext context)\n+            {\n+                var type = context.Symbol as INamedTypeSymbol;\n+                if (type != null && type.IsType && type.TypeKind == TypeKind.Class)\n+                {\n+                    var implementsDisposableInBaseType = ImplementsDisposableInBaseType(type);\n+\n+                    if (ImplementsDisposableDirectly(type))\n+                    {\n+                        var disposeMethod = FindDisposeMethod(type);\n+                        if (disposeMethod != null)\n+                        {\n+                            // This is difference from FxCop implementation\n+                            // IDisposable Reimplementation Rule is violated only if type re-implements Dispose method, not just interface\n+                            // For example see unit tests:\n+                            // CSharp_CA1063_IDisposableReimplementation_NoDiagnostic_ImplementingInheritedInterfaceWithNoDisposeReimplementation\n+                            // Basic_CA1063_IDisposableReimplementation_Diagnostic_ImplementingInheritedInterfaceWithNoDisposeReimplementation\n+                            CheckIDisposableReimplementationRule(type, context, implementsDisposableInBaseType);\n+\n+                            CheckDisposeSignatureRule(disposeMethod, type, context);\n+                            CheckRenameDisposeRule(disposeMethod, type, context);\n+\n+                            if (!type.IsSealed && type.DeclaredAccessibility != Accessibility.Private)\n+                            {\n+                                var disposeBoolMethod = FindDisposeBoolMethod(type);\n+                                if (disposeBoolMethod != null)\n+                                {\n+                                    CheckDisposeBoolSignatureRule(disposeBoolMethod, type, context);\n+                                }\n+                                else\n+                                {\n+                                    CheckProvideDisposeBoolRule(type, context);\n+                                }\n+                            }\n+                        }\n+                    }\n+\n+                    if (implementsDisposableInBaseType)\n+                    {\n+                        foreach (var method in type.GetMembers().OfType<IMethodSymbol>())\n+                        {\n+                            CheckDisposeOverrideRule(method, type, context);\n+                        }\n+\n+                        CheckFinalizeOverrideRule(type, context);\n+                    }\n+                }\n+            }\n+\n+            private void AnalyzeOperationBlock(OperationBlockAnalysisContext context)\n+            {\n+                var method = context.OwningSymbol as IMethodSymbol;\n+                if (method == null)\n+                {\n+                    return;\n+                }\n+\n+                var isFinalizerMethod = method.IsFinalizer();\n+                var isDisposeMethod = method.Name == DisposeMethodName;\n+                if (isFinalizerMethod || isDisposeMethod)\n+                {\n+                    var type = method.ContainingType;\n+                    if (type != null && type.IsType && type.TypeKind == TypeKind.Class &&\n+                        !type.IsSealed && type.DeclaredAccessibility != Accessibility.Private)\n+                    {\n+                        if (ImplementsDisposableDirectly(type))\n+                        {\n+                            var disposeMethod = FindDisposeMethod(type);\n+                            if (disposeMethod != null)\n+                            {\n+                                if (method == disposeMethod)\n+                                {","path":"src/Microsoft.ApiDesignGuidelines.Analyzers/Core/ImplementIDisposableCorrectly.cs","position":264,"original_position":248,"commit_id":"8137de852492b3b98cb11ad50cd94d365ce29dc7","original_commit_id":"d338777322b7c977b8dffac1e9b49ecc226822dc","user":{"login":"duracellko","id":8131212,"avatar_url":"https://avatars.githubusercontent.com/u/8131212?v=3","gravatar_id":"","url":"https://api.github.com/users/duracellko","html_url":"https://github.com/duracellko","followers_url":"https://api.github.com/users/duracellko/followers","following_url":"https://api.github.com/users/duracellko/following{/other_user}","gists_url":"https://api.github.com/users/duracellko/gists{/gist_id}","starred_url":"https://api.github.com/users/duracellko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/duracellko/subscriptions","organizations_url":"https://api.github.com/users/duracellko/orgs","repos_url":"https://api.github.com/users/duracellko/repos","events_url":"https://api.github.com/users/duracellko/events{/privacy}","received_events_url":"https://api.github.com/users/duracellko/received_events","type":"User","site_admin":false},"body":"I do not look for a particular operation action. I look for any operation action that should not be inside Dispose method. Therefore I have to travers through all blocks and stop traversing on the first wrong one.\r\nHowever, maybe it would be better to analyze blocks from in method `AnalyzeNamedTypeSymbol`, because there is functionality to identify Dispose method so I could tell that I am interested only in blocks inside this method. But I don't know how to do it. `SymbolAnalysisContext` does not have `RegisterOperationAction` and IMethodSymbol does not have reference to method body.","created_at":"2016-02-24T07:45:07Z","updated_at":"2016-02-24T07:45:07Z","html_url":"https://github.com/dotnet/roslyn-analyzers/pull/866#discussion_r53903707","pull_request_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/pulls/866","_links":{"self":{"href":"https://api.github.com/repos/dotnet/roslyn-analyzers/pulls/comments/53903707"},"html":{"href":"https://github.com/dotnet/roslyn-analyzers/pull/866#discussion_r53903707"},"pull_request":{"href":"https://api.github.com/repos/dotnet/roslyn-analyzers/pulls/866"}}},"pull_request":{"url":"https://api.github.com/repos/dotnet/roslyn-analyzers/pulls/866","id":60268218,"html_url":"https://github.com/dotnet/roslyn-analyzers/pull/866","diff_url":"https://github.com/dotnet/roslyn-analyzers/pull/866.diff","patch_url":"https://github.com/dotnet/roslyn-analyzers/pull/866.patch","issue_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/issues/866","number":866,"state":"open","locked":false,"title":"Implement and unit test CA1063: Implement IDisposable Correctly","user":{"login":"duracellko","id":8131212,"avatar_url":"https://avatars.githubusercontent.com/u/8131212?v=3","gravatar_id":"","url":"https://api.github.com/users/duracellko","html_url":"https://github.com/duracellko","followers_url":"https://api.github.com/users/duracellko/followers","following_url":"https://api.github.com/users/duracellko/following{/other_user}","gists_url":"https://api.github.com/users/duracellko/gists{/gist_id}","starred_url":"https://api.github.com/users/duracellko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/duracellko/subscriptions","organizations_url":"https://api.github.com/users/duracellko/orgs","repos_url":"https://api.github.com/users/duracellko/repos","events_url":"https://api.github.com/users/duracellko/events{/privacy}","received_events_url":"https://api.github.com/users/duracellko/received_events","type":"User","site_admin":false},"body":"Following rule messages are implemented:\r\n- Remove IDisposable from the list of interfaces that are implemented by {0} and override the base class Dispose implementation instead.\r\n- Remove the finalizer from type {0}, override Dispose(bool disposing), and put the finalization logic in the code path where 'disposing' is false.\r\n- Remove {0}, override Dispose(bool disposing), and put the dispose logic in the code path where 'disposing' is true.\r\n- Ensure that {0} is declared as public and sealed.\r\n- Rename {0} to 'Dispose' and make sure that it is declared as public and sealed.\r\n- Make sure that {0} is declared as protected, virtual, and unsealed.\r\n- Modify {0} so that it calls Dispose(true), then calls GC.SuppressFinalize on the current object instance ('this' or 'Me' in Visual Basic), and then returns.\r\n\r\nFinalizer (destructor) message is NOT implemented:\r\n- Modify {0} so that it calls Dispose(false) and then returns.\r\n\r\nThe reason is that object OperationBlockAnalysisContext for destructor in C# returns object type BoundSequencePoint and it implements IOperation interface and nothing else. So I don't see any way, how to analyze destructors in C#.\r\n\r\nThis implementation is a bit different from FxCop one. Following example does not violate the rule for class C, but it does in FxCop.\r\n```\r\npublic interface ITest : IDisposable\r\n{\r\n    void int Test { get; set; }\r\n}\r\n\r\npublic class B : IDisposable\r\n{\r\n    public void Dispose()\r\n    {\r\n    }\r\n}\r\n\r\npublic class C : B, ITest\r\n{\r\n    public int Test { get; set; }\r\n}\r\n```","created_at":"2016-02-23T00:43:25Z","updated_at":"2016-02-24T07:45:07Z","closed_at":null,"merged_at":null,"merge_commit_sha":"7bdd2eac854d0829a39bffcc518daa3890597cc4","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/pulls/866/commits","review_comments_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/pulls/866/comments","review_comment_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/issues/866/comments","statuses_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/statuses/8137de852492b3b98cb11ad50cd94d365ce29dc7","head":{"label":"duracellko:ImplementIDisposableCorrectly","ref":"ImplementIDisposableCorrectly","sha":"8137de852492b3b98cb11ad50cd94d365ce29dc7","user":{"login":"duracellko","id":8131212,"avatar_url":"https://avatars.githubusercontent.com/u/8131212?v=3","gravatar_id":"","url":"https://api.github.com/users/duracellko","html_url":"https://github.com/duracellko","followers_url":"https://api.github.com/users/duracellko/followers","following_url":"https://api.github.com/users/duracellko/following{/other_user}","gists_url":"https://api.github.com/users/duracellko/gists{/gist_id}","starred_url":"https://api.github.com/users/duracellko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/duracellko/subscriptions","organizations_url":"https://api.github.com/users/duracellko/orgs","repos_url":"https://api.github.com/users/duracellko/repos","events_url":"https://api.github.com/users/duracellko/events{/privacy}","received_events_url":"https://api.github.com/users/duracellko/received_events","type":"User","site_admin":false},"repo":{"id":51225357,"name":"roslyn-analyzers","full_name":"duracellko/roslyn-analyzers","owner":{"login":"duracellko","id":8131212,"avatar_url":"https://avatars.githubusercontent.com/u/8131212?v=3","gravatar_id":"","url":"https://api.github.com/users/duracellko","html_url":"https://github.com/duracellko","followers_url":"https://api.github.com/users/duracellko/followers","following_url":"https://api.github.com/users/duracellko/following{/other_user}","gists_url":"https://api.github.com/users/duracellko/gists{/gist_id}","starred_url":"https://api.github.com/users/duracellko/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/duracellko/subscriptions","organizations_url":"https://api.github.com/users/duracellko/orgs","repos_url":"https://api.github.com/users/duracellko/repos","events_url":"https://api.github.com/users/duracellko/events{/privacy}","received_events_url":"https://api.github.com/users/duracellko/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/duracellko/roslyn-analyzers","description":"","fork":true,"url":"https://api.github.com/repos/duracellko/roslyn-analyzers","forks_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/forks","keys_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/keys{/key_id}","collaborators_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/teams","hooks_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/hooks","issue_events_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/issues/events{/number}","events_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/events","assignees_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/assignees{/user}","branches_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/branches{/branch}","tags_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/tags","blobs_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/git/refs{/sha}","trees_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/git/trees{/sha}","statuses_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/statuses/{sha}","languages_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/languages","stargazers_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/stargazers","contributors_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/contributors","subscribers_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/subscribers","subscription_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/subscription","commits_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/commits{/sha}","git_commits_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/git/commits{/sha}","comments_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/comments{/number}","issue_comment_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/issues/comments{/number}","contents_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/contents/{+path}","compare_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/compare/{base}...{head}","merges_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/merges","archive_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/downloads","issues_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/issues{/number}","pulls_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/pulls{/number}","milestones_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/milestones{/number}","notifications_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/labels{/name}","releases_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/releases{/id}","deployments_url":"https://api.github.com/repos/duracellko/roslyn-analyzers/deployments","created_at":"2016-02-06T22:32:01Z","updated_at":"2016-02-06T22:32:04Z","pushed_at":"2016-02-23T23:07:08Z","git_url":"git://github.com/duracellko/roslyn-analyzers.git","ssh_url":"git@github.com:duracellko/roslyn-analyzers.git","clone_url":"https://github.com/duracellko/roslyn-analyzers.git","svn_url":"https://github.com/duracellko/roslyn-analyzers","homepage":null,"size":6336,"stargazers_count":0,"watchers_count":0,"language":"C#","has_issues":false,"has_downloads":true,"has_wiki":true,"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":"dotnet:master","ref":"master","sha":"ae41f379138b989b721063e321b21f3d93b2f344","user":{"login":"dotnet","id":9141961,"avatar_url":"https://avatars.githubusercontent.com/u/9141961?v=3","gravatar_id":"","url":"https://api.github.com/users/dotnet","html_url":"https://github.com/dotnet","followers_url":"https://api.github.com/users/dotnet/followers","following_url":"https://api.github.com/users/dotnet/following{/other_user}","gists_url":"https://api.github.com/users/dotnet/gists{/gist_id}","starred_url":"https://api.github.com/users/dotnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotnet/subscriptions","organizations_url":"https://api.github.com/users/dotnet/orgs","repos_url":"https://api.github.com/users/dotnet/repos","events_url":"https://api.github.com/users/dotnet/events{/privacy}","received_events_url":"https://api.github.com/users/dotnet/received_events","type":"Organization","site_admin":false},"repo":{"id":36946704,"name":"roslyn-analyzers","full_name":"dotnet/roslyn-analyzers","owner":{"login":"dotnet","id":9141961,"avatar_url":"https://avatars.githubusercontent.com/u/9141961?v=3","gravatar_id":"","url":"https://api.github.com/users/dotnet","html_url":"https://github.com/dotnet","followers_url":"https://api.github.com/users/dotnet/followers","following_url":"https://api.github.com/users/dotnet/following{/other_user}","gists_url":"https://api.github.com/users/dotnet/gists{/gist_id}","starred_url":"https://api.github.com/users/dotnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotnet/subscriptions","organizations_url":"https://api.github.com/users/dotnet/orgs","repos_url":"https://api.github.com/users/dotnet/repos","events_url":"https://api.github.com/users/dotnet/events{/privacy}","received_events_url":"https://api.github.com/users/dotnet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dotnet/roslyn-analyzers","description":"","fork":false,"url":"https://api.github.com/repos/dotnet/roslyn-analyzers","forks_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/forks","keys_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/teams","hooks_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/hooks","issue_events_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/issues/events{/number}","events_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/events","assignees_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/assignees{/user}","branches_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/branches{/branch}","tags_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/tags","blobs_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/git/refs{/sha}","trees_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/statuses/{sha}","languages_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/languages","stargazers_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/stargazers","contributors_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/contributors","subscribers_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/subscribers","subscription_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/subscription","commits_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/commits{/sha}","git_commits_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/git/commits{/sha}","comments_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/comments{/number}","issue_comment_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/issues/comments{/number}","contents_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/contents/{+path}","compare_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/merges","archive_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/downloads","issues_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/issues{/number}","pulls_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/pulls{/number}","milestones_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/milestones{/number}","notifications_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/labels{/name}","releases_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/releases{/id}","deployments_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/deployments","created_at":"2015-06-05T17:48:07Z","updated_at":"2016-02-19T06:48:24Z","pushed_at":"2016-02-24T00:15:32Z","git_url":"git://github.com/dotnet/roslyn-analyzers.git","ssh_url":"git@github.com:dotnet/roslyn-analyzers.git","clone_url":"https://github.com/dotnet/roslyn-analyzers.git","svn_url":"https://github.com/dotnet/roslyn-analyzers","homepage":null,"size":8059,"stargazers_count":77,"watchers_count":77,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":69,"mirror_url":null,"open_issues_count":184,"forks":69,"open_issues":184,"watchers":77,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dotnet/roslyn-analyzers/pulls/866"},"html":{"href":"https://github.com/dotnet/roslyn-analyzers/pull/866"},"issue":{"href":"https://api.github.com/repos/dotnet/roslyn-analyzers/issues/866"},"comments":{"href":"https://api.github.com/repos/dotnet/roslyn-analyzers/issues/866/comments"},"review_comments":{"href":"https://api.github.com/repos/dotnet/roslyn-analyzers/pulls/866/comments"},"review_comment":{"href":"https://api.github.com/repos/dotnet/roslyn-analyzers/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dotnet/roslyn-analyzers/pulls/866/commits"},"statuses":{"href":"https://api.github.com/repos/dotnet/roslyn-analyzers/statuses/8137de852492b3b98cb11ad50cd94d365ce29dc7"}}}}