{"action":"created","comment":{"url":"https://api.github.com/repos/dotnet/roslyn/pulls/comments/56254452","id":56254452,"diff_hunk":"@@ -0,0 +1,350 @@\n+﻿// Copyright (c) Microsoft.  All Rights Reserved.  Licensed under the Apache License, Version 2.0.  See License.txt in the project root for license information.\n+\n+using System;\n+using System.Collections.Generic;\n+using System.Collections.Immutable;\n+using System.Linq;\n+using System.Threading;\n+using System.Threading.Tasks;\n+using Microsoft.CodeAnalysis;\n+using Microsoft.CodeAnalysis.CodeGen;\n+using Microsoft.CodeAnalysis.CSharp.Symbols;\n+\n+namespace Microsoft.CodeAnalysis.CSharp\n+{\n+    internal sealed class Instrumentation\n+    {\n+        private static MethodSymbol _createPayload = null;\n+        private static MethodSymbol _flushPayload = null;\n+\n+        internal static BoundBlock InjectInstrumentation(MethodSymbol method, BoundBlock methodBody, int methodOrdinal, TypeCompilationState compilationState, CSharpCompilation compilation, DiagnosticBag diagnostics, DebugDocumentProvider debugDocumentProvider, out ImmutableArray<SourceSpan> dynamicAnalysisSpans)\n+        {\n+            if (methodBody != null && (object)method != GetCreatePayload(compilation) && (object)method != GetFlushPayload(compilation))\n+            {\n+                MethodSymbol createPayload = GetCreatePayload(compilation);\n+                MethodSymbol flushPayload = GetFlushPayload(compilation);\n+                if (createPayload != null && flushPayload != null)\n+                {\n+                    // Create the symbol for the instrumentation payload.\n+                    SyntheticBoundNodeFactory factory = new SyntheticBoundNodeFactory(method, methodBody.Syntax, compilationState, diagnostics);\n+                    TypeSymbol boolType = compilation.GetSpecialType(SpecialType.System_Boolean);\n+                    TypeSymbol payloadElementType = boolType;\n+                    ArrayTypeSymbol payloadType = ArrayTypeSymbol.CreateCSharpArray(compilation.Assembly, payloadElementType);\n+                    FieldSymbol payloadField = GetPayloadField(method, methodOrdinal, payloadType, factory, compilation);\n+\n+                    // Synthesize the instrumentation and collect the spans of interest.\n+\n+                    ArrayBuilder<SourceSpan> spansBuilder = ArrayBuilder<SourceSpan>.GetInstance();\n+                    BoundTreeRewriter collector = new InstrumentationInjectionWalker(method, spansBuilder, payloadField, compilationState, diagnostics, debugDocumentProvider);\n+                    BoundBlock newMethodBody = (BoundBlock)collector.Visit(methodBody);\n+                    dynamicAnalysisSpans = spansBuilder.ToImmutableAndFree();\n+\n+                    // Synthesize the initialization of the instrumentation payload array. It should be done either statically or with concurrency-safe code:\n+                    //\n+                    // if (payloadField == null)\n+                    //     Instrumentation.CreatePayload(mvid, method, ref payloadField, payloadLength);\n+\n+                    // ToDo: The containing module's mvid should be computed statically and stored in a static field rather than being\n+                    // recomputed in each method prologue.\n+                    BoundExpression mvid = factory.Property(factory.Property(factory.TypeofBeforeRewriting(method.ContainingType), \"Module\"), \"ModuleVersionId\");\n+                    BoundExpression methodToken = factory.MethodToken(method);\n+                    BoundStatement createPayloadCall = factory.ExpressionStatement(factory.Call(null, createPayload, mvid, methodToken, factory.Field(null, payloadField), factory.Literal(dynamicAnalysisSpans.Length)));\n+\n+                    BoundExpression payloadNullTest = factory.Binary(BinaryOperatorKind.ObjectEqual, boolType, factory.Field(null, payloadField), factory.Null(payloadType));\n+                    BoundStatement payloadIf = factory.If(payloadNullTest, createPayloadCall);\n+\n+                    ImmutableArray<BoundStatement> newStatements = newMethodBody.Statements.Insert(0, payloadIf);\n+                    newMethodBody = newMethodBody.Update(newMethodBody.Locals, newMethodBody.LocalFunctions, newStatements);\n+\n+                    if (IsTestMethod(method))\n+                    {\n+                        // If the method is a test method, wrap the body in:\n+                        //\n+                        // Instrumentation.FlushPayload();\n+                        // try\n+                        // {\n+                        //     ... body ...\n+                        // }\n+                        // finally\n+                        // {\n+                        //     Instrumentation.FlushPayload();\n+                        // }\n+\n+                        BoundStatement firstFlush = factory.ExpressionStatement(factory.Call(null, flushPayload));\n+                        BoundStatement secondFlush = factory.ExpressionStatement(factory.Call(null, flushPayload));\n+                        BoundStatement tryFinally = factory.Try(newMethodBody, ImmutableArray<BoundCatchBlock>.Empty, factory.Block(ImmutableArray.Create(secondFlush)));\n+                        newMethodBody = factory.Block(ImmutableArray.Create(firstFlush, tryFinally));\n+                    }\n+\n+                    return newMethodBody;\n+                }\n+            }\n+\n+            dynamicAnalysisSpans = ImmutableArray<SourceSpan>.Empty;\n+            return methodBody;\n+        }\n+\n+        private static FieldSymbol GetPayloadField(MethodSymbol method, int methodOrdinal, TypeSymbol payloadType, SyntheticBoundNodeFactory factory, CSharpCompilation compilation)\n+        {\n+            // ToDo: If the type containing the method is generic, synthesize a helper type and put the payload field there.\n+            // If the payload field is part of a generic type, there will be a new instance of the field per instantiation of the generic,\n+            // and so the payload field must be a member of another type.\n+            NamedTypeSymbol containingType = method.ContainingType;\n+\n+            SynthesizedFieldSymbol payloadField = new SynthesizedFieldSymbol(containingType, payloadType, method.Name + \"*instrumentation*\" + methodOrdinal.ToString(), isStatic: true);\n+            factory.AddField(containingType, payloadField);\n+            return payloadField;\n+        }\n+        \n+        private static MethodSymbol GetCreatePayload(CSharpCompilation compilation)\n+        {\n+            if (_createPayload == null)\n+            {\n+                NamedTypeSymbol instrumentationType = compilation.GetTypeByMetadataName(\"Microsoft.CodeAnalysis.Runtime.Instrumentation\");\n+                if (instrumentationType != null)\n+                {\n+                    ImmutableArray<Symbol> createPayloads = instrumentationType.GetMembers(\"CreatePayload\");\n+                    if (createPayloads.Length == 1)\n+                    {\n+                        MethodSymbol createPayload = createPayloads[0] as MethodSymbol;\n+                        // ToDo: Add checks for parameter types.\n+                        if (createPayload != null && createPayload.IsStatic && createPayload.ParameterCount == 4 && createPayload.Parameters[0].Name == \"mvid\" && createPayload.Parameters[1].Name == \"methodToken\" && createPayload.Parameters[2].Name == \"payload\" && createPayload.Parameters[3].Name == \"payloadLength\")\n+                        {\n+                            _createPayload = createPayload;\n+                        }\n+                    }\n+                }\n+            }\n+\n+            return _createPayload;\n+        }\n+\n+        private static MethodSymbol GetFlushPayload(CSharpCompilation compilation)\n+        {\n+            if (_flushPayload == null)\n+            {\n+                NamedTypeSymbol instrumentationType = compilation.GetTypeByMetadataName(\"Microsoft.CodeAnalysis.Runtime.Instrumentation\");\n+                if (instrumentationType != null)\n+                {\n+                    ImmutableArray<Symbol> flushPayloads = instrumentationType.GetMembers(\"FlushPayload\");\n+                    if (flushPayloads.Length == 1)\n+                    {\n+                        MethodSymbol flushPayload = flushPayloads[0] as MethodSymbol;\n+                        if (flushPayload != null && flushPayload.IsStatic && flushPayload.ParameterCount == 0)\n+                        {\n+                            _flushPayload = flushPayload;\n+                        }\n+                    }\n+                }\n+            }\n+\n+            return _flushPayload;\n+        }\n+\n+        private static bool IsTestMethod(MethodSymbol method)\n+        {\n+            // ToDo: Make this real.\n+            return method.Name.StartsWith(\"Test\");\n+        }\n+    }\n+\n+    internal sealed class InstrumentationInjectionWalker : BoundTreeRewriterWithStackGuard\n+    {\n+        private readonly MethodSymbol _method;\n+        private readonly ArrayBuilder<SourceSpan> _spansBuilder;\n+        private readonly FieldSymbol _payload;\n+        private readonly TypeCompilationState _compilationState;\n+        private readonly DiagnosticBag _diagnostics;\n+        private readonly DebugDocumentProvider _debugDocumentProvider;\n+\n+        public InstrumentationInjectionWalker(MethodSymbol method, ArrayBuilder<SourceSpan> spansBuilder, FieldSymbol payload, TypeCompilationState compilationState, DiagnosticBag diagnostics, DebugDocumentProvider debugDocumentProvider)","path":"src/Compilers/CSharp/Portable/Compiler/Instrumentation.cs","position":160,"original_position":160,"commit_id":"0fa04d57b27628c78575f7bcadda8b095a5b1ad6","original_commit_id":"0fa04d57b27628c78575f7bcadda8b095a5b1ad6","user":{"login":"JohnHamby","id":10982715,"avatar_url":"https://avatars.githubusercontent.com/u/10982715?v=3","gravatar_id":"","url":"https://api.github.com/users/JohnHamby","html_url":"https://github.com/JohnHamby","followers_url":"https://api.github.com/users/JohnHamby/followers","following_url":"https://api.github.com/users/JohnHamby/following{/other_user}","gists_url":"https://api.github.com/users/JohnHamby/gists{/gist_id}","starred_url":"https://api.github.com/users/JohnHamby/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JohnHamby/subscriptions","organizations_url":"https://api.github.com/users/JohnHamby/orgs","repos_url":"https://api.github.com/users/JohnHamby/repos","events_url":"https://api.github.com/users/JohnHamby/events{/privacy}","received_events_url":"https://api.github.com/users/JohnHamby/received_events","type":"User","site_admin":false},"body":"OK.","created_at":"2016-03-15T22:47:19Z","updated_at":"2016-03-15T22:47:19Z","html_url":"https://github.com/dotnet/roslyn/pull/9749#discussion_r56254452","pull_request_url":"https://api.github.com/repos/dotnet/roslyn/pulls/9749","_links":{"self":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/comments/56254452"},"html":{"href":"https://github.com/dotnet/roslyn/pull/9749#discussion_r56254452"},"pull_request":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/9749"}}},"pull_request":{"url":"https://api.github.com/repos/dotnet/roslyn/pulls/9749","id":62862259,"html_url":"https://github.com/dotnet/roslyn/pull/9749","diff_url":"https://github.com/dotnet/roslyn/pull/9749.diff","patch_url":"https://github.com/dotnet/roslyn/pull/9749.patch","issue_url":"https://api.github.com/repos/dotnet/roslyn/issues/9749","number":9749,"state":"open","locked":false,"title":"Binary instrumentation for dynamic analysis","user":{"login":"JohnHamby","id":10982715,"avatar_url":"https://avatars.githubusercontent.com/u/10982715?v=3","gravatar_id":"","url":"https://api.github.com/users/JohnHamby","html_url":"https://github.com/JohnHamby","followers_url":"https://api.github.com/users/JohnHamby/followers","following_url":"https://api.github.com/users/JohnHamby/following{/other_user}","gists_url":"https://api.github.com/users/JohnHamby/gists{/gist_id}","starred_url":"https://api.github.com/users/JohnHamby/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JohnHamby/subscriptions","organizations_url":"https://api.github.com/users/JohnHamby/orgs","repos_url":"https://api.github.com/users/JohnHamby/repos","events_url":"https://api.github.com/users/JohnHamby/events{/privacy}","received_events_url":"https://api.github.com/users/JohnHamby/received_events","type":"User","site_admin":false},"body":"This change set introduces rudimentary instrumentation of C# binaries for dynamic analysis, under control of an EmitOption. Some of the compiler edits are surely wrongheaded--please offer up more appropriate solutions.\r\n\r\n@amcasey @KevinH-MS @tannergooding @genlu @tmat @ManishJayaswal @jcouv @VSadov @AlekseyTs @jaredpar @cston and any other interested parties are invited.\r\n\r\nThe instrumentation strategy (modulo some refinements in method prologues and to the helper class API) is explained in:\r\n\r\nhttps://microsoft.sharepoint.com/teams/managedlanguages/_layouts/OneNote.aspx?id=%2Fteams%2Fmanagedlanguages%2Ffiles%2FTeam%20Notebook%2FRoslyn%20Team%20Notebook&wd=target%28Interactive%20Execution%2FTest%20Impact.one%7CAE81BE1C-65C3-4BB5-BA69-83425EE8D8EE%2FInstrumented%20Binaries%7CA959106B-92E9-458B-828C-82643841A659%2F%29\r\n\r\n","created_at":"2016-03-15T06:51:45Z","updated_at":"2016-03-15T22:47:19Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4d7495740bea71b21773e1983ce5a0b167cf0104","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/dotnet/roslyn/pulls/9749/commits","review_comments_url":"https://api.github.com/repos/dotnet/roslyn/pulls/9749/comments","review_comment_url":"https://api.github.com/repos/dotnet/roslyn/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dotnet/roslyn/issues/9749/comments","statuses_url":"https://api.github.com/repos/dotnet/roslyn/statuses/0fa04d57b27628c78575f7bcadda8b095a5b1ad6","head":{"label":"JohnHamby:features/test-impact","ref":"features/test-impact","sha":"0fa04d57b27628c78575f7bcadda8b095a5b1ad6","user":{"login":"JohnHamby","id":10982715,"avatar_url":"https://avatars.githubusercontent.com/u/10982715?v=3","gravatar_id":"","url":"https://api.github.com/users/JohnHamby","html_url":"https://github.com/JohnHamby","followers_url":"https://api.github.com/users/JohnHamby/followers","following_url":"https://api.github.com/users/JohnHamby/following{/other_user}","gists_url":"https://api.github.com/users/JohnHamby/gists{/gist_id}","starred_url":"https://api.github.com/users/JohnHamby/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JohnHamby/subscriptions","organizations_url":"https://api.github.com/users/JohnHamby/orgs","repos_url":"https://api.github.com/users/JohnHamby/repos","events_url":"https://api.github.com/users/JohnHamby/events{/privacy}","received_events_url":"https://api.github.com/users/JohnHamby/received_events","type":"User","site_admin":false},"repo":{"id":30732063,"name":"roslyn","full_name":"JohnHamby/roslyn","owner":{"login":"JohnHamby","id":10982715,"avatar_url":"https://avatars.githubusercontent.com/u/10982715?v=3","gravatar_id":"","url":"https://api.github.com/users/JohnHamby","html_url":"https://github.com/JohnHamby","followers_url":"https://api.github.com/users/JohnHamby/followers","following_url":"https://api.github.com/users/JohnHamby/following{/other_user}","gists_url":"https://api.github.com/users/JohnHamby/gists{/gist_id}","starred_url":"https://api.github.com/users/JohnHamby/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JohnHamby/subscriptions","organizations_url":"https://api.github.com/users/JohnHamby/orgs","repos_url":"https://api.github.com/users/JohnHamby/repos","events_url":"https://api.github.com/users/JohnHamby/events{/privacy}","received_events_url":"https://api.github.com/users/JohnHamby/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/JohnHamby/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/JohnHamby/roslyn","forks_url":"https://api.github.com/repos/JohnHamby/roslyn/forks","keys_url":"https://api.github.com/repos/JohnHamby/roslyn/keys{/key_id}","collaborators_url":"https://api.github.com/repos/JohnHamby/roslyn/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/JohnHamby/roslyn/teams","hooks_url":"https://api.github.com/repos/JohnHamby/roslyn/hooks","issue_events_url":"https://api.github.com/repos/JohnHamby/roslyn/issues/events{/number}","events_url":"https://api.github.com/repos/JohnHamby/roslyn/events","assignees_url":"https://api.github.com/repos/JohnHamby/roslyn/assignees{/user}","branches_url":"https://api.github.com/repos/JohnHamby/roslyn/branches{/branch}","tags_url":"https://api.github.com/repos/JohnHamby/roslyn/tags","blobs_url":"https://api.github.com/repos/JohnHamby/roslyn/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/JohnHamby/roslyn/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/JohnHamby/roslyn/git/refs{/sha}","trees_url":"https://api.github.com/repos/JohnHamby/roslyn/git/trees{/sha}","statuses_url":"https://api.github.com/repos/JohnHamby/roslyn/statuses/{sha}","languages_url":"https://api.github.com/repos/JohnHamby/roslyn/languages","stargazers_url":"https://api.github.com/repos/JohnHamby/roslyn/stargazers","contributors_url":"https://api.github.com/repos/JohnHamby/roslyn/contributors","subscribers_url":"https://api.github.com/repos/JohnHamby/roslyn/subscribers","subscription_url":"https://api.github.com/repos/JohnHamby/roslyn/subscription","commits_url":"https://api.github.com/repos/JohnHamby/roslyn/commits{/sha}","git_commits_url":"https://api.github.com/repos/JohnHamby/roslyn/git/commits{/sha}","comments_url":"https://api.github.com/repos/JohnHamby/roslyn/comments{/number}","issue_comment_url":"https://api.github.com/repos/JohnHamby/roslyn/issues/comments{/number}","contents_url":"https://api.github.com/repos/JohnHamby/roslyn/contents/{+path}","compare_url":"https://api.github.com/repos/JohnHamby/roslyn/compare/{base}...{head}","merges_url":"https://api.github.com/repos/JohnHamby/roslyn/merges","archive_url":"https://api.github.com/repos/JohnHamby/roslyn/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/JohnHamby/roslyn/downloads","issues_url":"https://api.github.com/repos/JohnHamby/roslyn/issues{/number}","pulls_url":"https://api.github.com/repos/JohnHamby/roslyn/pulls{/number}","milestones_url":"https://api.github.com/repos/JohnHamby/roslyn/milestones{/number}","notifications_url":"https://api.github.com/repos/JohnHamby/roslyn/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/JohnHamby/roslyn/labels{/name}","releases_url":"https://api.github.com/repos/JohnHamby/roslyn/releases{/id}","deployments_url":"https://api.github.com/repos/JohnHamby/roslyn/deployments","created_at":"2015-02-13T00:07:31Z","updated_at":"2015-02-13T00:07:58Z","pushed_at":"2016-03-15T06:39:40Z","git_url":"git://github.com/JohnHamby/roslyn.git","ssh_url":"git@github.com:JohnHamby/roslyn.git","clone_url":"https://github.com/JohnHamby/roslyn.git","svn_url":"https://github.com/JohnHamby/roslyn","homepage":"","size":139943,"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:features/test-impact","ref":"features/test-impact","sha":"278d3fc6100f12776f9832ac739e6cafbf9200cb","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":29078997,"name":"roslyn","full_name":"dotnet/roslyn","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","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":"2016-03-15T22:46:14Z","pushed_at":"2016-03-15T22:45:34Z","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":168936,"stargazers_count":4643,"watchers_count":4643,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1165,"mirror_url":null,"open_issues_count":2399,"forks":1165,"open_issues":2399,"watchers":4643,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/9749"},"html":{"href":"https://github.com/dotnet/roslyn/pull/9749"},"issue":{"href":"https://api.github.com/repos/dotnet/roslyn/issues/9749"},"comments":{"href":"https://api.github.com/repos/dotnet/roslyn/issues/9749/comments"},"review_comments":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/9749/comments"},"review_comment":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/9749/commits"},"statuses":{"href":"https://api.github.com/repos/dotnet/roslyn/statuses/0fa04d57b27628c78575f7bcadda8b095a5b1ad6"}}}}