{"action":"created","comment":{"url":"https://api.github.com/repos/dotnet/roslyn/pulls/comments/211721033","pull_request_review_id":148202796,"id":211721033,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxMTcyMTAzMw==","diff_hunk":"@@ -93,5 +114,166 @@ private static QueryClauseSyntax CreateQueryClause(ExtendedSyntaxNode node)\n                     expression: forEachStatement.Expression)\n                         .WithCommentsFrom(extraLeadingTrivia, extraTrailingTrivia, forEachStatement.CloseParenToken);\n \n+        /// <summary>\n+        /// Creates a linq invocation expression.\n+        /// </summary>\n+        /// <param name=\"selectExpression\">expression to be used in the last 'Select' invocation</param>\n+        /// <param name=\"leadingTokensForSelect\">extra leading tokens to be added to the select clause</param>\n+        /// <param name=\"trailingTokensForSelect\">extra trailing tokens to be added to the select clause</param>\n+        /// <returns></returns>\n+        private InvocationExpressionSyntax CreateLinqInvocation(\n+            ExpressionSyntax selectExpression,\n+            IEnumerable<SyntaxToken> leadingTokensForSelect,\n+            IEnumerable<SyntaxToken> trailingTokensForSelect)\n+        {\n+            var foreachStatement = ForEachInfo.ForEachStatement;\n+            selectExpression = selectExpression.WithCommentsFrom(leadingTokensForSelect, ForEachInfo.TrailingTokens.Concat(trailingTokensForSelect));\n+            var currentExtendedNodeIndex = 0;\n+\n+            return CreateLinqInvocation(\n+                foreachStatement,\n+                receiverForInvocation: foreachStatement.Expression,\n+                selectExpression: selectExpression,\n+                leadingCommentsTrivia: ForEachInfo.LeadingTokens.GetTrivia(),\n+                trailingCommentsTrivia: Enumerable.Empty<SyntaxTrivia>(),\n+                currentExtendedNodeIndex: ref currentExtendedNodeIndex)\n+                .WithAdditionalAnnotations(Formatter.Annotation);\n+        }\n+\n+        private InvocationExpressionSyntax CreateLinqInvocation(\n+            ForEachStatementSyntax forEachStatement,\n+            ExpressionSyntax receiverForInvocation,\n+            IEnumerable<SyntaxTrivia> leadingCommentsTrivia,\n+            IEnumerable<SyntaxTrivia> trailingCommentsTrivia,\n+            ExpressionSyntax selectExpression,\n+            ref int currentExtendedNodeIndex)\n+        {\n+            leadingCommentsTrivia = forEachStatement.ForEachKeyword.GetAllTrivia().Concat(leadingCommentsTrivia);\n+\n+            // Recursively create linq invocations, possibly updating the receiver (Where invocations), to get the inner expression for\n+            // the lambda body for the linq invocation to be created for this foreach statement. For example:\n+            //\n+            // INPUT:\n+            //   foreach (var n1 in c1)\n+            //      foreach (var n2 in c2)\n+            //          if (n1 > n2)\n+            //              yield return n1 + n2;\n+            //\n+            // OUTPUT:\n+            //   c1.SelectMany(n1 => c2.Where(n2 => n1 > n2).Select(n2 => n1 + n2))\n+            //\n+            var hasForEachChild = false;\n+            var lambdaBody = CreateLinqInvocationForExtendedNode(selectExpression, ref currentExtendedNodeIndex, ref receiverForInvocation, ref hasForEachChild);\n+            var lambda = SyntaxFactory.SimpleLambdaExpression(\n+                SyntaxFactory.Parameter(\n+                    forEachStatement.Identifier.WithPrependedLeadingTrivia(\n+                    SyntaxNodeOrTokenExtensions.GetTrivia(forEachStatement.Type.GetFirstToken())\n+                        .FilterComments(addElasticMarker: false))),\n+                lambdaBody)\n+                .WithCommentsFrom(leadingCommentsTrivia, trailingCommentsTrivia,\n+                    forEachStatement.OpenParenToken, forEachStatement.InKeyword, forEachStatement.CloseParenToken);\n+\n+            // Create Select or SelectMany linq invocation for this foreach statement. For example:\n+            //\n+            // INPUT:\n+            //   foreach (var n1 in c1)\n+            //      ...\n+            //\n+            // OUTPUT:\n+            //   c1.Select(n1 => ...\n+            //      OR\n+            //   c1.SelectMany(n1 => ...\n+            //\n+            var invokedMethodName = !hasForEachChild ? nameof(Enumerable.Select) : nameof(Enumerable.SelectMany);\n+            return SyntaxFactory.InvocationExpression(\n+                SyntaxFactory.MemberAccessExpression(\n+                    SyntaxKind.SimpleMemberAccessExpression,\n+                    receiverForInvocation.Parenthesize(),\n+                    SyntaxFactory.IdentifierName(invokedMethodName)),\n+                SyntaxFactory.ArgumentList(SyntaxFactory.SingletonSeparatedList(\n+                    SyntaxFactory.Argument(lambda))));\n+        }\n+\n+        /// <summary>\n+        /// Creates a linq invocation expression for the <see cref=\"ForEachInfo{ForEachStatementSyntax, StatementSyntax}.ConvertingExtendedNodes\"/> node at the given index <paramref name=\"extendedNodeIndex\"/>\n+        /// or returns the <paramref name=\"selectExpression\"/> if all extended nodes have been processed.\n+        /// </summary>\n+        /// <param name=\"selectExpression\">Innermost select expression</param>\n+        /// <param name=\"extendedNodeIndex\">Index into <see cref=\"ForEachInfo{ForEachStatementSyntax, StatementSyntax}.ConvertingExtendedNodes\"/> to be processed and updated.</param>\n+        /// <param name=\"receiver\">Receiver for the generated linq invocation. Updated when processing an if statement.</param>\n+        /// <param name=\"hasForEachChild\">Flag indicating if any of the processed <see cref=\"ForEachInfo{ForEachStatementSyntax, StatementSyntax}.ConvertingExtendedNodes\"/> is a <see cref=\"ForEachStatementSyntax\"/>.</param>\n+        private ExpressionSyntax CreateLinqInvocationForExtendedNode(\n+            ExpressionSyntax selectExpression,\n+            ref int extendedNodeIndex,\n+            ref ExpressionSyntax receiver,\n+            ref bool hasForEachChild)\n+        {\n+            // Check if we have converted all the descendant foreach/if statements.\n+            // If so, we return the select expression.\n+            if (extendedNodeIndex == ForEachInfo.ConvertingExtendedNodes.Length)\n+            {\n+                return selectExpression;\n+            }\n+\n+            // Otherwise, convert the next foreach/if statement into a linq invocation.\n+            var node = ForEachInfo.ConvertingExtendedNodes[extendedNodeIndex];\n+            switch (node.Node.Kind())\n+            {\n+                // Nested ForEach statement is converted into a nested Select or SelectMany linq invocation. For example:\n+                //\n+                // INPUT:\n+                //   foreach (var n1 in c1)\n+                //      foreach (var n2 in c2)\n+                //          ...\n+                //\n+                // OUTPUT:\n+                //   c1.SelectMany(n1 => c2.Select(n2 => ...\n+                //\n+                case SyntaxKind.ForEachStatement:\n+                    hasForEachChild = true;\n+                    var foreachStatement = (ForEachStatementSyntax)node.Node;\n+                    ++extendedNodeIndex;\n+                    return CreateLinqInvocation(\n+                        foreachStatement,\n+                        receiverForInvocation: foreachStatement.Expression,\n+                        selectExpression: selectExpression,\n+                        leadingCommentsTrivia: node.ExtraLeadingComments,\n+                        trailingCommentsTrivia: node.ExtraTrailingComments,\n+                        currentExtendedNodeIndex: ref extendedNodeIndex);\n+\n+                // Nested If statement is converted into a Where method invocation on the current receiver. For example:\n+                //\n+                // INPUT:\n+                //   foreach (var n1 in c1)\n+                //      if (n1 > 0)\n+                //          ...\n+                //\n+                // OUTPUT:\n+                //   c1.Where(n1 => n1 > 0).Select(n1 => ...\n+                //\n+                case SyntaxKind.IfStatement:\n+                    var ifStatement = (IfStatementSyntax)node.Node;\n+                    var parentForEachStatement = ifStatement.GetAncestor<ForEachStatementSyntax>();\n+                    var lambdaParameter = SyntaxFactory.Parameter(SyntaxFactory.Identifier(parentForEachStatement.Identifier.ValueText));\n+                    var lambda = SyntaxFactory.SimpleLambdaExpression(\n+                        SyntaxFactory.Parameter(\n+                            SyntaxFactory.Identifier(parentForEachStatement.Identifier.ValueText)),\n+                        ifStatement.Condition.WithCommentsFrom(ifStatement.OpenParenToken, ifStatement.CloseParenToken))\n+                        .WithCommentsFrom(ifStatement.IfKeyword.GetAllTrivia().Concat(node.ExtraLeadingComments), node.ExtraTrailingComments);\n+\n+                    receiver = SyntaxFactory.InvocationExpression(\n+                        SyntaxFactory.MemberAccessExpression(\n+                            SyntaxKind.SimpleMemberAccessExpression,\n+                            receiver.Parenthesize(),\n+                            SyntaxFactory.IdentifierName(nameof(Enumerable.Where))),\n+                        SyntaxFactory.ArgumentList(SyntaxFactory.SingletonSeparatedList(\n+                            SyntaxFactory.Argument(lambda))));\n+\n+                    ++extendedNodeIndex;\n+                    return CreateLinqInvocationForExtendedNode(selectExpression, ref extendedNodeIndex, ref receiver, ref hasForEachChild);\n+            }\n+\n+            throw ExceptionUtilities.Unreachable;","path":"src/Features/CSharp/Portable/ConvertLinq/ConvertForEachToLinqQuery/AbstractConverter.cs","position":219,"original_position":219,"commit_id":"6da85294a8c31ee502b6abab546e89ec3a2762f2","original_commit_id":"6da85294a8c31ee502b6abab546e89ec3a2762f2","user":{"login":"mavasani","id":10605811,"node_id":"MDQ6VXNlcjEwNjA1ODEx","avatar_url":"https://avatars2.githubusercontent.com/u/10605811?v=4","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":"Sure. This is guaranteed by the existing code that builds up this converter. Ivan's existing query form refactoring guarantees it [here](http://source.roslyn.io/#Microsoft.CodeAnalysis.CSharp.Features/ConvertLinq/ConvertForEachToLinqQuery/AbstractConverter.cs,47), and the newly added refactoring bails out in presence of local declarations, so the only possible cases are nested foreach and if statements. I will add more comments to clarify.","created_at":"2018-08-21T18:57:09Z","updated_at":"2018-08-21T18:57:09Z","html_url":"https://github.com/dotnet/roslyn/pull/29402#discussion_r211721033","pull_request_url":"https://api.github.com/repos/dotnet/roslyn/pulls/29402","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/comments/211721033"},"html":{"href":"https://github.com/dotnet/roslyn/pull/29402#discussion_r211721033"},"pull_request":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/29402"}},"in_reply_to_id":211719920},"pull_request":{"url":"https://api.github.com/repos/dotnet/roslyn/pulls/29402","id":209629363,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA5NjI5MzYz","html_url":"https://github.com/dotnet/roslyn/pull/29402","diff_url":"https://github.com/dotnet/roslyn/pull/29402.diff","patch_url":"https://github.com/dotnet/roslyn/pull/29402.patch","issue_url":"https://api.github.com/repos/dotnet/roslyn/issues/29402","number":29402,"state":"open","locked":false,"title":"Add refactoring to convert foreach loop into linq invocations (Select…","user":{"login":"mavasani","id":10605811,"node_id":"MDQ6VXNlcjEwNjA1ODEx","avatar_url":"https://avatars2.githubusercontent.com/u/10605811?v=4","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":"…, SelectMany and Where invocations)\r\n\r\nAdds one of the refactorings mentioned in #8953\r\n\r\n```\r\n//\r\n// INPUT:\r\n//   foreach (var n1 in c1)\r\n//      foreach (var n2 in c2)\r\n//          if (n1 > n2)\r\n//              yield return n1 + n2;\r\n//\r\n// OUTPUT:\r\n//   c1.SelectMany(n1 => c2.Where(n2 => n1 > n2).Select(n2 => n1 + n2))\r\n//\r\n```","created_at":"2018-08-20T20:09:19Z","updated_at":"2018-08-21T18:57:09Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4d9b12bba675d9dae6b75b24aaa923ed617cd41e","assignee":null,"assignees":[],"requested_reviewers":[{"login":"heejaechang","id":1333179,"node_id":"MDQ6VXNlcjEzMzMxNzk=","avatar_url":"https://avatars3.githubusercontent.com/u/1333179?v=4","gravatar_id":"","url":"https://api.github.com/users/heejaechang","html_url":"https://github.com/heejaechang","followers_url":"https://api.github.com/users/heejaechang/followers","following_url":"https://api.github.com/users/heejaechang/following{/other_user}","gists_url":"https://api.github.com/users/heejaechang/gists{/gist_id}","starred_url":"https://api.github.com/users/heejaechang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/heejaechang/subscriptions","organizations_url":"https://api.github.com/users/heejaechang/orgs","repos_url":"https://api.github.com/users/heejaechang/repos","events_url":"https://api.github.com/users/heejaechang/events{/privacy}","received_events_url":"https://api.github.com/users/heejaechang/received_events","type":"User","site_admin":false},{"login":"jinujoseph","id":12449387,"node_id":"MDQ6VXNlcjEyNDQ5Mzg3","avatar_url":"https://avatars3.githubusercontent.com/u/12449387?v=4","gravatar_id":"","url":"https://api.github.com/users/jinujoseph","html_url":"https://github.com/jinujoseph","followers_url":"https://api.github.com/users/jinujoseph/followers","following_url":"https://api.github.com/users/jinujoseph/following{/other_user}","gists_url":"https://api.github.com/users/jinujoseph/gists{/gist_id}","starred_url":"https://api.github.com/users/jinujoseph/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jinujoseph/subscriptions","organizations_url":"https://api.github.com/users/jinujoseph/orgs","repos_url":"https://api.github.com/users/jinujoseph/repos","events_url":"https://api.github.com/users/jinujoseph/events{/privacy}","received_events_url":"https://api.github.com/users/jinujoseph/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":166377917,"node_id":"MDU6TGFiZWwxNjYzNzc5MTc=","url":"https://api.github.com/repos/dotnet/roslyn/labels/Area-IDE","name":"Area-IDE","color":"5319e7","default":false}],"milestone":{"url":"https://api.github.com/repos/dotnet/roslyn/milestones/35","html_url":"https://github.com/dotnet/roslyn/milestone/35","labels_url":"https://api.github.com/repos/dotnet/roslyn/milestones/35/labels","id":3585736,"node_id":"MDk6TWlsZXN0b25lMzU4NTczNg==","number":35,"title":"16.0.1","description":"16.0. Preview 1 release targeted","creator":{"login":"jinujoseph","id":12449387,"node_id":"MDQ6VXNlcjEyNDQ5Mzg3","avatar_url":"https://avatars3.githubusercontent.com/u/12449387?v=4","gravatar_id":"","url":"https://api.github.com/users/jinujoseph","html_url":"https://github.com/jinujoseph","followers_url":"https://api.github.com/users/jinujoseph/followers","following_url":"https://api.github.com/users/jinujoseph/following{/other_user}","gists_url":"https://api.github.com/users/jinujoseph/gists{/gist_id}","starred_url":"https://api.github.com/users/jinujoseph/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jinujoseph/subscriptions","organizations_url":"https://api.github.com/users/jinujoseph/orgs","repos_url":"https://api.github.com/users/jinujoseph/repos","events_url":"https://api.github.com/users/jinujoseph/events{/privacy}","received_events_url":"https://api.github.com/users/jinujoseph/received_events","type":"User","site_admin":false},"open_issues":2,"closed_issues":0,"state":"open","created_at":"2018-08-21T00:12:14Z","updated_at":"2018-08-21T18:12:19Z","due_on":"2018-11-05T08:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/dotnet/roslyn/pulls/29402/commits","review_comments_url":"https://api.github.com/repos/dotnet/roslyn/pulls/29402/comments","review_comment_url":"https://api.github.com/repos/dotnet/roslyn/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dotnet/roslyn/issues/29402/comments","statuses_url":"https://api.github.com/repos/dotnet/roslyn/statuses/6da85294a8c31ee502b6abab546e89ec3a2762f2","head":{"label":"mavasani:ForEachToLinqMethod","ref":"ForEachToLinqMethod","sha":"6da85294a8c31ee502b6abab546e89ec3a2762f2","user":{"login":"mavasani","id":10605811,"node_id":"MDQ6VXNlcjEwNjA1ODEx","avatar_url":"https://avatars2.githubusercontent.com/u/10605811?v=4","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":30584055,"node_id":"MDEwOlJlcG9zaXRvcnkzMDU4NDA1NQ==","name":"roslyn","full_name":"mavasani/roslyn","owner":{"login":"mavasani","id":10605811,"node_id":"MDQ6VXNlcjEwNjA1ODEx","avatar_url":"https://avatars2.githubusercontent.com/u/10605811?v=4","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","description":"The .NET Compiler Platform (\"Roslyn\") provides open-source C# and Visual Basic compilers with rich code analysis APIs.","fork":true,"url":"https://api.github.com/repos/mavasani/roslyn","forks_url":"https://api.github.com/repos/mavasani/roslyn/forks","keys_url":"https://api.github.com/repos/mavasani/roslyn/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mavasani/roslyn/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mavasani/roslyn/teams","hooks_url":"https://api.github.com/repos/mavasani/roslyn/hooks","issue_events_url":"https://api.github.com/repos/mavasani/roslyn/issues/events{/number}","events_url":"https://api.github.com/repos/mavasani/roslyn/events","assignees_url":"https://api.github.com/repos/mavasani/roslyn/assignees{/user}","branches_url":"https://api.github.com/repos/mavasani/roslyn/branches{/branch}","tags_url":"https://api.github.com/repos/mavasani/roslyn/tags","blobs_url":"https://api.github.com/repos/mavasani/roslyn/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mavasani/roslyn/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mavasani/roslyn/git/refs{/sha}","trees_url":"https://api.github.com/repos/mavasani/roslyn/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mavasani/roslyn/statuses/{sha}","languages_url":"https://api.github.com/repos/mavasani/roslyn/languages","stargazers_url":"https://api.github.com/repos/mavasani/roslyn/stargazers","contributors_url":"https://api.github.com/repos/mavasani/roslyn/contributors","subscribers_url":"https://api.github.com/repos/mavasani/roslyn/subscribers","subscription_url":"https://api.github.com/repos/mavasani/roslyn/subscription","commits_url":"https://api.github.com/repos/mavasani/roslyn/commits{/sha}","git_commits_url":"https://api.github.com/repos/mavasani/roslyn/git/commits{/sha}","comments_url":"https://api.github.com/repos/mavasani/roslyn/comments{/number}","issue_comment_url":"https://api.github.com/repos/mavasani/roslyn/issues/comments{/number}","contents_url":"https://api.github.com/repos/mavasani/roslyn/contents/{+path}","compare_url":"https://api.github.com/repos/mavasani/roslyn/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mavasani/roslyn/merges","archive_url":"https://api.github.com/repos/mavasani/roslyn/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mavasani/roslyn/downloads","issues_url":"https://api.github.com/repos/mavasani/roslyn/issues{/number}","pulls_url":"https://api.github.com/repos/mavasani/roslyn/pulls{/number}","milestones_url":"https://api.github.com/repos/mavasani/roslyn/milestones{/number}","notifications_url":"https://api.github.com/repos/mavasani/roslyn/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mavasani/roslyn/labels{/name}","releases_url":"https://api.github.com/repos/mavasani/roslyn/releases{/id}","deployments_url":"https://api.github.com/repos/mavasani/roslyn/deployments","created_at":"2015-02-10T09:12:41Z","updated_at":"2018-08-21T14:57:52Z","pushed_at":"2018-08-21T18:42:29Z","git_url":"git://github.com/mavasani/roslyn.git","ssh_url":"git@github.com:mavasani/roslyn.git","clone_url":"https://github.com/mavasani/roslyn.git","svn_url":"https://github.com/mavasani/roslyn","homepage":"","size":356356,"stargazers_count":0,"watchers_count":0,"language":"C#","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":1,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"dotnet:master","ref":"master","sha":"dc77cab7b311323ee014cac687089b1a76fc6ea1","user":{"login":"dotnet","id":9141961,"node_id":"MDEyOk9yZ2FuaXphdGlvbjkxNDE5NjE=","avatar_url":"https://avatars0.githubusercontent.com/u/9141961?v=4","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":29078997,"node_id":"MDEwOlJlcG9zaXRvcnkyOTA3ODk5Nw==","name":"roslyn","full_name":"dotnet/roslyn","owner":{"login":"dotnet","id":9141961,"node_id":"MDEyOk9yZ2FuaXphdGlvbjkxNDE5NjE=","avatar_url":"https://avatars0.githubusercontent.com/u/9141961?v=4","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","description":"The .NET Compiler Platform (\"Roslyn\") provides open-source C# and Visual Basic compilers with rich code analysis APIs.","fork":false,"url":"https://api.github.com/repos/dotnet/roslyn","forks_url":"https://api.github.com/repos/dotnet/roslyn/forks","keys_url":"https://api.github.com/repos/dotnet/roslyn/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dotnet/roslyn/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dotnet/roslyn/teams","hooks_url":"https://api.github.com/repos/dotnet/roslyn/hooks","issue_events_url":"https://api.github.com/repos/dotnet/roslyn/issues/events{/number}","events_url":"https://api.github.com/repos/dotnet/roslyn/events","assignees_url":"https://api.github.com/repos/dotnet/roslyn/assignees{/user}","branches_url":"https://api.github.com/repos/dotnet/roslyn/branches{/branch}","tags_url":"https://api.github.com/repos/dotnet/roslyn/tags","blobs_url":"https://api.github.com/repos/dotnet/roslyn/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dotnet/roslyn/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dotnet/roslyn/git/refs{/sha}","trees_url":"https://api.github.com/repos/dotnet/roslyn/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dotnet/roslyn/statuses/{sha}","languages_url":"https://api.github.com/repos/dotnet/roslyn/languages","stargazers_url":"https://api.github.com/repos/dotnet/roslyn/stargazers","contributors_url":"https://api.github.com/repos/dotnet/roslyn/contributors","subscribers_url":"https://api.github.com/repos/dotnet/roslyn/subscribers","subscription_url":"https://api.github.com/repos/dotnet/roslyn/subscription","commits_url":"https://api.github.com/repos/dotnet/roslyn/commits{/sha}","git_commits_url":"https://api.github.com/repos/dotnet/roslyn/git/commits{/sha}","comments_url":"https://api.github.com/repos/dotnet/roslyn/comments{/number}","issue_comment_url":"https://api.github.com/repos/dotnet/roslyn/issues/comments{/number}","contents_url":"https://api.github.com/repos/dotnet/roslyn/contents/{+path}","compare_url":"https://api.github.com/repos/dotnet/roslyn/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dotnet/roslyn/merges","archive_url":"https://api.github.com/repos/dotnet/roslyn/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dotnet/roslyn/downloads","issues_url":"https://api.github.com/repos/dotnet/roslyn/issues{/number}","pulls_url":"https://api.github.com/repos/dotnet/roslyn/pulls{/number}","milestones_url":"https://api.github.com/repos/dotnet/roslyn/milestones{/number}","notifications_url":"https://api.github.com/repos/dotnet/roslyn/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dotnet/roslyn/labels{/name}","releases_url":"https://api.github.com/repos/dotnet/roslyn/releases{/id}","deployments_url":"https://api.github.com/repos/dotnet/roslyn/deployments","created_at":"2015-01-11T02:39:03Z","updated_at":"2018-08-21T15:54:39Z","pushed_at":"2018-08-21T18:42:32Z","git_url":"git://github.com/dotnet/roslyn.git","ssh_url":"git@github.com:dotnet/roslyn.git","clone_url":"https://github.com/dotnet/roslyn.git","svn_url":"https://github.com/dotnet/roslyn","homepage":"","size":434840,"stargazers_count":9734,"watchers_count":9734,"language":"C#","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2315,"mirror_url":null,"archived":false,"open_issues_count":5086,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":2315,"open_issues":5086,"watchers":9734,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/29402"},"html":{"href":"https://github.com/dotnet/roslyn/pull/29402"},"issue":{"href":"https://api.github.com/repos/dotnet/roslyn/issues/29402"},"comments":{"href":"https://api.github.com/repos/dotnet/roslyn/issues/29402/comments"},"review_comments":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/29402/comments"},"review_comment":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/29402/commits"},"statuses":{"href":"https://api.github.com/repos/dotnet/roslyn/statuses/6da85294a8c31ee502b6abab546e89ec3a2762f2"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"mavasani"}}