{"action":"created","comment":{"url":"https://api.github.com/repos/dotnet/roslyn-analyzers/pulls/comments/63224523","id":63224523,"diff_hunk":"@@ -518,5 +538,365 @@ public class C\n                 // <%TEMP_PATH%>\\PublicAPI.Shipped.txt(7,1): warning RS0017: Symbol 'C.Method() -> void' is part of the declared API, but is either not public or could not be found\n                 GetAdditionalFileResultAt(7, 1, shippedFilePath, DeclarePublicAPIAnalyzer.RemoveDeletedApiRule, \"C.Method() -> void\"));\n         }\n+\n+        #region Fix tests\n+\n+        [Fact]\n+        public void TestSimpleMissingMember_Fix()\n+        {\n+            var source = @\"\n+public class C\n+{\n+    public int Field;\n+    public int Property { get; set; }\n+    public void Method() { } \n+    public int ArrowExpressionProperty => 0;\n+\n+    public int NewField; // Newly added field, not in current public API.\n+}\n+\";\n+\n+            var shippedText = @\"\";\n+            var unshippedText = @\"C\n+C.ArrowExpressionProperty.get -> int\n+C.C() -> void\n+C.Field -> int\n+C.Method() -> void\n+C.Property.get -> int\n+C.Property.set -> void\";\n+            var fixedUnshippedText = @\"C\n+C.ArrowExpressionProperty.get -> int\n+C.C() -> void\n+C.Field -> int\n+C.Method() -> void\n+C.NewField -> int\n+C.Property.get -> int\n+C.Property.set -> void\";\n+\n+            VerifyCSharpAdditionalFileFix(source, shippedText, unshippedText, fixedUnshippedText);\n+        }\n+\n+        [Fact]\n+        public void TestAddAndRemoveMembers_CSharp_Fix()\n+        {\n+            // Unshipped file has a state 'ObsoleteField' entry and a missing 'NewField' entry.\n+            var source = @\"\n+public class C\n+{\n+    public int Field;\n+    public int Property { get; set; }\n+    public void Method() { } \n+    public int ArrowExpressionProperty => 0;\n+\n+    public int NewField;\n+}\n+\";\n+            var shippedText = @\"\";\n+            var unshippedText = @\"C\n+C.ArrowExpressionProperty.get -> int\n+C.C() -> void\n+C.Field -> int\n+C.Method() -> void\n+C.ObsoleteField -> int\n+C.Property.get -> int\n+C.Property.set -> void\";\n+            var fixedUnshippedText = @\"C\n+C.ArrowExpressionProperty.get -> int\n+C.C() -> void\n+C.Field -> int\n+C.Method() -> void\n+C.NewField -> int\n+C.Property.get -> int\n+C.Property.set -> void\";\n+\n+            VerifyCSharpAdditionalFileFix(source, shippedText, unshippedText, fixedUnshippedText);\n+        }\n+\n+        [Fact]\n+        public void TestSimpleMissingType_Fix()\n+        {\n+            var source = @\"\n+public class C\n+{\n+    private C() { }\n+}\n+\";\n+\n+            var shippedText = @\"\";\n+            var unshippedText = @\"\";\n+            var fixedUnshippedText = @\"C\";\n+\n+            VerifyCSharpAdditionalFileFix(source, shippedText, unshippedText, fixedUnshippedText);\n+        }\n+\n+        [Fact]\n+        public void TestMultipleMissingTypeAndMember_Fix()\n+        {\n+            var source = @\"\n+public class C\n+{\n+    private C() { }\n+    public int Field;\n+}\n+\n+public class C2 { }\n+\";\n+\n+            var shippedText = @\"\";\n+            var unshippedText = @\"\";\n+            var fixedUnshippedText = @\"C\n+C.Field -> int\n+C2\n+C2.C2() -> void\";\n+\n+            VerifyCSharpAdditionalFileFix(source, shippedText, unshippedText, fixedUnshippedText);\n+        }\n+\n+        [Fact]\n+        public void TestChangingMethodSignatureForAnUnshippedMethod_Fix()\n+        {\n+            var source = @\"\n+public class C\n+{\n+    private C() { }\n+    public void Method(int p1){ }\n+}\n+\";\n+\n+            var shippedText = @\"C\";\n+            // previously method had no params, so the fix should remove the previous overload.\n+            var unshippedText = @\"C.Method() -> void\";\n+            var fixedUnshippedText = @\"C.Method(int p1) -> void\";\n+\n+            VerifyCSharpAdditionalFileFix(source, shippedText, unshippedText, fixedUnshippedText);\n+        }\n+\n+        [Fact]\n+        public void TestChangingMethodSignatureForAnUnshippedMethodWithShippedOverloads_Fix()\n+        {\n+            var source = @\"\n+public class C\n+{\n+    private C() { }\n+    public void Method(int p1){ }\n+    public void Method(int p1, int p2){ }\n+    public void Method(char p1){ }\n+}\n+\";\n+\n+            var shippedText = @\"C\n+C.Method(int p1) -> void\n+C.Method(int p1, int p2) -> void\";\n+            // previously method had no params, so the fix should remove the previous overload.\n+            var unshippedText = @\"C.Method() -> void\";\n+            var fixedUnshippedText = @\"C.Method(char p1) -> void\";\n+\n+            VerifyCSharpAdditionalFileFix(source, shippedText, unshippedText, fixedUnshippedText);\n+        }\n+\n+        [Fact]\n+        public void TestAddingNewPublicOverload_Fix()\n+        {\n+            var source = @\"\n+public class C\n+{\n+    private C() { }\n+    public void Method(){ }\n+    internal void Method(int p1){ }\n+    internal void Method(int p1, int p2){ }\n+    public void Method(char p1){ }\n+}\n+\";\n+\n+            var shippedText = @\"\";\n+            var unshippedText = @\"C\n+C.Method(char p1) -> void\";\n+            var fixedUnshippedText = @\"C\n+C.Method() -> void\n+C.Method(char p1) -> void\";\n+\n+            VerifyCSharpAdditionalFileFix(source, shippedText, unshippedText, fixedUnshippedText);\n+        }\n+\n+        [Fact]\n+        public void TestMissingTypeAndMemberAndNestedMembers_Fix()\n+        {\n+            var source = @\"\n+public class C\n+{\n+    private C() { }\n+    public int Field;\n+\n+    public class CC\n+    {\n+        public int Field;\n+    }\n+}\n+\n+public class C2 { }\n+\";\n+\n+            var shippedText = @\"C.CC\n+C.CC.CC() -> void\";\n+            var unshippedText = @\"\";\n+            var fixedUnshippedText = @\"C\n+C.CC.Field -> int\n+C.Field -> int\n+C2\n+C2.C2() -> void\";\n+\n+            VerifyCSharpAdditionalFileFix(source, shippedText, unshippedText, fixedUnshippedText);\n+        }\n+\n+        [Fact]\n+        public void TestMissingNestedGenericMembersAndStaleMembers_Fix()\n+        {\n+            var source = @\"\n+public class C\n+{\n+    private C() { }\n+    public CC<int> Field;\n+    private C3.C4 Field2;\n+    private C3.C4 Method(C3.C4 p1) { }\n+\n+    public class CC<T>\n+    {\n+        public int Field;\n+        public CC<int> Field2;\n+    }\n+    \n+    public class C3\n+    {\n+        public class C4 { }\n+    }\n+}\n+\n+public class C2 { }\n+\";\n+\n+            var shippedText = @\"\";\n+            var unshippedText = @\"C.C3\n+C.C3.C3() -> void\n+C.C3.C4\n+C.C3.C4.C4() -> void\n+C.CC<T>\n+C.CC<T>.CC() -> void\n+C.Field2 -> C.C3.C4\n+C.Method(C.C3.C4 p1) -> C.C3.C4\n+\";\n+            var fixedUnshippedText = @\"C\n+C.C3\n+C.C3.C3() -> void\n+C.C3.C4\n+C.C3.C4.C4() -> void\n+C.CC<T>\n+C.CC<T>.CC() -> void\n+C.CC<T>.Field -> int\n+C.CC<T>.Field2 -> C.CC<int>\n+C.Field -> C.CC<int>\n+C2\n+C2.C2() -> void\";\n+\n+            VerifyCSharpAdditionalFileFix(source, shippedText, unshippedText, fixedUnshippedText);\n+        }\n+\n+        [Fact]\n+        public void TestWithExistingUnshippedNestedMembers_Fix()\n+        {\n+            var source = @\"\n+public class C\n+{\n+    private C() { }\n+    public int Field;\n+\n+    public class CC\n+    {\n+        public int Field;\n+    }\n+}\n+\n+public class C2 { }\n+\";\n+\n+            var shippedText = @\"\";\n+            var unshippedText = @\"C.CC\n+C.CC.CC() -> void\n+C.CC.Field -> int\";\n+            var fixedUnshippedText = @\"C\n+C.CC\n+C.CC.CC() -> void\n+C.CC.Field -> int\n+C.Field -> int\n+C2\n+C2.C2() -> void\";\n+\n+            VerifyCSharpAdditionalFileFix(source, shippedText, unshippedText, fixedUnshippedText);\n+        }\n+\n+        [Fact]\n+        public void TestWithExistingShippedNestedMembers_Fix()\n+        {\n+            var source = @\"\n+public class C\n+{\n+    private C() { }\n+    public int Field;\n+\n+    public class CC\n+    {\n+        public int Field;\n+    }\n+}\n+\n+public class C2 { }\n+\";\n+\n+            var shippedText = @\"C.CC\n+C.CC.CC() -> void\n+C.CC.Field -> int\";\n+            var unshippedText = @\"\";\n+            var fixedUnshippedText = @\"C\n+C.Field -> int\n+C2\n+C2.C2() -> void\";\n+\n+            VerifyCSharpAdditionalFileFix(source, shippedText, unshippedText, fixedUnshippedText);\n+        }\n+\n+        [Fact]\n+        public void TestOnlyRemoveStaleSiblingEntries_Fix()\n+        {\n+            var source = @\"\n+public class C\n+{\n+    private C() { }\n+    public int Field;\n+\n+    public class CC\n+    {\n+        private int Field; // This has a stale public API entry, but this shouldn't be removed unless we attempt to add a public API entry for a sibling.","path":"src/Roslyn.Diagnostics.Analyzers/UnitTests/DeclarePublicAPIAnalyzerTests.cs","position":487,"original_position":481,"commit_id":"1e728fe4779712bf3202511ed0c2792262d7b7b5","original_commit_id":"521adb3659d5170d40659093f3811dcec79a55f0","user":{"login":"mavasani","id":10605811,"avatar_url":"https://avatars.githubusercontent.com/u/10605811?v=3","gravatar_id":"","url":"https://api.github.com/users/mavasani","html_url":"https://github.com/mavasani","followers_url":"https://api.github.com/users/mavasani/followers","following_url":"https://api.github.com/users/mavasani/following{/other_user}","gists_url":"https://api.github.com/users/mavasani/gists{/gist_id}","starred_url":"https://api.github.com/users/mavasani/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mavasani/subscriptions","organizations_url":"https://api.github.com/users/mavasani/orgs","repos_url":"https://api.github.com/users/mavasani/repos","events_url":"https://api.github.com/users/mavasani/events{/privacy}","received_events_url":"https://api.github.com/users/mavasani/received_events","type":"User","site_admin":false},"body":"So the term stale entry is probably a misnomer. We want to remove the stale entries for siblings when doing a signature change for unshipped public API. However, we still want the user to be explicit about removing stale entries from other unrelated types in the compilation - user might have accidentally deleted/changed another unshipped public API, and it would be weird if its public API entry gets cleared when trying to add an entry for a new symbol in completely unrelated type.","created_at":"2016-05-13T17:54:57Z","updated_at":"2016-05-13T17:54:57Z","html_url":"https://github.com/dotnet/roslyn-analyzers/pull/994#discussion_r63224523","pull_request_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/pulls/994","_links":{"self":{"href":"https://api.github.com/repos/dotnet/roslyn-analyzers/pulls/comments/63224523"},"html":{"href":"https://github.com/dotnet/roslyn-analyzers/pull/994#discussion_r63224523"},"pull_request":{"href":"https://api.github.com/repos/dotnet/roslyn-analyzers/pulls/994"}}},"pull_request":{"url":"https://api.github.com/repos/dotnet/roslyn-analyzers/pulls/994","id":69927964,"html_url":"https://github.com/dotnet/roslyn-analyzers/pull/994","diff_url":"https://github.com/dotnet/roslyn-analyzers/pull/994.diff","patch_url":"https://github.com/dotnet/roslyn-analyzers/pull/994.patch","issue_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/issues/994","number":994,"state":"open","locked":false,"title":"Add support to DeclarePublicAPI fixer to remove stale entries for sibling symbols when adding a new entry for a symbol","user":{"login":"mavasani","id":10605811,"avatar_url":"https://avatars.githubusercontent.com/u/10605811?v=3","gravatar_id":"","url":"https://api.github.com/users/mavasani","html_url":"https://github.com/mavasani","followers_url":"https://api.github.com/users/mavasani/followers","following_url":"https://api.github.com/users/mavasani/following{/other_user}","gists_url":"https://api.github.com/users/mavasani/gists{/gist_id}","starred_url":"https://api.github.com/users/mavasani/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mavasani/subscriptions","organizations_url":"https://api.github.com/users/mavasani/orgs","repos_url":"https://api.github.com/users/mavasani/repos","events_url":"https://api.github.com/users/mavasani/events{/privacy}","received_events_url":"https://api.github.com/users/mavasani/received_events","type":"User","site_admin":false},"body":"One of the biggest complaints for the current Public API code fix is that changing the signature of an existing unshipped public API causes the code fix to add a new public API entry, but the old entry in the unshipped API file is not removed. This change fixes that by walking through all entries in the unshipped public API file to find entries for siblings of new member being added, and removing the ones that are no longer valid entries, i.e. either removed or are now non-public.\r\n\r\nThere were no fixer tests for public API analyzer - so I had to add them and also add test framework support for passing around additional files.\r\n\r\nFixes #756\r\n","created_at":"2016-05-13T00:34:11Z","updated_at":"2016-05-13T17:54:57Z","closed_at":null,"merged_at":null,"merge_commit_sha":"94a55534646621f0aa85a0c32face8f8024c2c5f","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/pulls/994/commits","review_comments_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/pulls/994/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/994/comments","statuses_url":"https://api.github.com/repos/dotnet/roslyn-analyzers/statuses/1e728fe4779712bf3202511ed0c2792262d7b7b5","head":{"label":"mavasani:DeclarePublicApiAnalyzerFixes_More","ref":"DeclarePublicApiAnalyzerFixes_More","sha":"1e728fe4779712bf3202511ed0c2792262d7b7b5","user":{"login":"mavasani","id":10605811,"avatar_url":"https://avatars.githubusercontent.com/u/10605811?v=3","gravatar_id":"","url":"https://api.github.com/users/mavasani","html_url":"https://github.com/mavasani","followers_url":"https://api.github.com/users/mavasani/followers","following_url":"https://api.github.com/users/mavasani/following{/other_user}","gists_url":"https://api.github.com/users/mavasani/gists{/gist_id}","starred_url":"https://api.github.com/users/mavasani/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mavasani/subscriptions","organizations_url":"https://api.github.com/users/mavasani/orgs","repos_url":"https://api.github.com/users/mavasani/repos","events_url":"https://api.github.com/users/mavasani/events{/privacy}","received_events_url":"https://api.github.com/users/mavasani/received_events","type":"User","site_admin":false},"repo":{"id":45504515,"name":"roslyn-analyzers","full_name":"mavasani/roslyn-analyzers","owner":{"login":"mavasani","id":10605811,"avatar_url":"https://avatars.githubusercontent.com/u/10605811?v=3","gravatar_id":"","url":"https://api.github.com/users/mavasani","html_url":"https://github.com/mavasani","followers_url":"https://api.github.com/users/mavasani/followers","following_url":"https://api.github.com/users/mavasani/following{/other_user}","gists_url":"https://api.github.com/users/mavasani/gists{/gist_id}","starred_url":"https://api.github.com/users/mavasani/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mavasani/subscriptions","organizations_url":"https://api.github.com/users/mavasani/orgs","repos_url":"https://api.github.com/users/mavasani/repos","events_url":"https://api.github.com/users/mavasani/events{/privacy}","received_events_url":"https://api.github.com/users/mavasani/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/mavasani/roslyn-analyzers","description":"","fork":true,"url":"https://api.github.com/repos/mavasani/roslyn-analyzers","forks_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/forks","keys_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/teams","hooks_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/hooks","issue_events_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/issues/events{/number}","events_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/events","assignees_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/assignees{/user}","branches_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/branches{/branch}","tags_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/tags","blobs_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/git/refs{/sha}","trees_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/statuses/{sha}","languages_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/languages","stargazers_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/stargazers","contributors_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/contributors","subscribers_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/subscribers","subscription_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/subscription","commits_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/commits{/sha}","git_commits_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/git/commits{/sha}","comments_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/comments{/number}","issue_comment_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/issues/comments{/number}","contents_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/contents/{+path}","compare_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/merges","archive_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/downloads","issues_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/issues{/number}","pulls_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/pulls{/number}","milestones_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/milestones{/number}","notifications_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/labels{/name}","releases_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/releases{/id}","deployments_url":"https://api.github.com/repos/mavasani/roslyn-analyzers/deployments","created_at":"2015-11-04T00:20:33Z","updated_at":"2016-02-23T11:20:01Z","pushed_at":"2016-05-13T17:51:30Z","git_url":"git://github.com/mavasani/roslyn-analyzers.git","ssh_url":"git@github.com:mavasani/roslyn-analyzers.git","clone_url":"https://github.com/mavasani/roslyn-analyzers.git","svn_url":"https://github.com/mavasani/roslyn-analyzers","homepage":null,"size":7699,"stargazers_count":1,"watchers_count":1,"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":1,"default_branch":"master"}},"base":{"label":"dotnet:master","ref":"master","sha":"b71afca7dba9dd8640c640553d4a505a139d7621","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-05-13T09:25:22Z","pushed_at":"2016-05-13T17:51:30Z","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":9373,"stargazers_count":109,"watchers_count":109,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":75,"mirror_url":null,"open_issues_count":177,"forks":75,"open_issues":177,"watchers":109,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dotnet/roslyn-analyzers/pulls/994"},"html":{"href":"https://github.com/dotnet/roslyn-analyzers/pull/994"},"issue":{"href":"https://api.github.com/repos/dotnet/roslyn-analyzers/issues/994"},"comments":{"href":"https://api.github.com/repos/dotnet/roslyn-analyzers/issues/994/comments"},"review_comments":{"href":"https://api.github.com/repos/dotnet/roslyn-analyzers/pulls/994/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/994/commits"},"statuses":{"href":"https://api.github.com/repos/dotnet/roslyn-analyzers/statuses/1e728fe4779712bf3202511ed0c2792262d7b7b5"}}}}