{"action":"created","comment":{"url":"https://api.github.com/repos/dotnet/roslyn/pulls/comments/28821905","id":28821905,"diff_hunk":"@@ -137,87 +230,446 @@ public override Task<ImmutableArray<DiagnosticData>> GetSpecificCachedDiagnostic\n \n         public override async Task<IEnumerable<DiagnosticData>> GetDiagnosticsForSpanAsync(Document document, TextSpan range, CancellationToken cancellationToken)\n         {\n-            var diagnostics = await GetDiagnosticsAsync(document.Project.Solution, document.Project.Id, document.Id, cancellationToken).ConfigureAwait(false);\n+            ImmutableArray<DiagnosticData> diagnostics = await GetDiagnosticsAsync(document.Project.Solution, document.Project.Id, document.Id, cancellationToken).ConfigureAwait(false);\n             return diagnostics.Where(d => range.IntersectsWith(d.TextSpan));\n         }\n \n-        private async Task<ImmutableArray<DiagnosticData>> GetProjectDiagnosticsAsync(Project project, CancellationToken cancellationToken)\n+        public override Task SynchronizeWithBuildAsync(Project project, ImmutableArray<DiagnosticData> diagnostics)\n+        {\n+            // Always prefer live diagnostics to diagnostics produced by a build.\n+            return SpecializedTasks.EmptyTask;\n+        }\n+\n+        public override Task SynchronizeWithBuildAsync(Document document, ImmutableArray<DiagnosticData> diagnostics)\n+        {\n+            // Always prefer live diagnostics to diagnostics produced by a build.\n+            return SpecializedTasks.EmptyTask;\n+        }\n+\n+        private IEnumerable<DiagnosticData> GetDiagnosticData(Project project, ImmutableArray<Diagnostic> diagnostics)\n         {\n-            if (project == null)\n+            foreach (Diagnostic diagnostic in diagnostics)\n             {\n-                return ImmutableArray<DiagnosticData>.Empty;\n+                if (diagnostic.Location == Location.None)\n+                {\n+                    yield return DiagnosticData.Create(project, diagnostic);\n+                }\n+                else\n+                {\n+                    Document document = project.GetDocument(diagnostic.Location.SourceTree);\n+                    if (document != null)\n+                    {\n+                        yield return DiagnosticData.Create(document, diagnostic);\n+                    }\n+                }\n             }\n+        }\n+        \n+        private void RaiseEvents(Project project, Document document, ImmutableArray<Diagnostic> rawDiagnostics)\n+        {\n+            Solution solution = project.Solution;\n+            Workspace workspace = solution.Workspace;\n \n-            var compilation = await project.GetCompilationAsync(cancellationToken).ConfigureAwait(false);\n+            if (rawDiagnostics.Length > 0)\n+            {\n+                IEnumerable<DiagnosticData> diagnostics = GetDiagnosticData(project, rawDiagnostics);\n+                var groups = diagnostics.GroupBy(d => d.DocumentId);\n \n-            var analyzers = HostAnalyzerManager.CreateDiagnosticAnalyzers(project);\n+                foreach (var kv in groups)\n+                {\n+                    if (kv.Key == null)\n+                    {\n+                        Owner.RaiseDiagnosticsUpdated(\n+                            this, new DiagnosticsUpdatedArgs(\n+                                new AnalyzerData<ProjectId>(this, project.Id), workspace, solution, project.Id, null, kv.ToImmutableArrayOrEmpty()));\n+                    }\n+                    else\n+                    {\n+                        Owner.RaiseDiagnosticsUpdated(\n+                            this, new DiagnosticsUpdatedArgs(\n+                                new AnalyzerData<DocumentId>(this, kv.Key), workspace, solution, project.Id, kv.Key, kv.ToImmutableArrayOrEmpty()));\n+                    }\n+                }\n+            }\n+            else\n+            {\n+                // There are no diagnostics. Update the document or project with that information.\n+                if (document != null)\n+                {\n+                    Owner.RaiseDiagnosticsUpdated(\n+                           this, new DiagnosticsUpdatedArgs(\n+                               new AnalyzerData<DocumentId>(this, document.Id), workspace, solution, project.Id, document.Id, ImmutableArray<DiagnosticData>.Empty));\n+                }\n+                else\n+                {\n+                    Owner.RaiseDiagnosticsUpdated(\n+                            this, new DiagnosticsUpdatedArgs(\n+                                new AnalyzerData<ProjectId>(this, project.Id), workspace, solution, project.Id, null, ImmutableArray<DiagnosticData>.Empty));\n+                }\n+            }\n+        }\n \n-            var compilationWithAnalyzer = compilation.WithAnalyzers(analyzers, project.AnalyzerOptions, cancellationToken);\n+        // CompilationResults represents the compilations and associated diagnostics for up to two versions\n+        // (one complete and one current) of a project.\n+        // ToDo: It will probably be necessary to place a cap on the number of active CompilationResult objects that have not completed analysis.\n+        // Otherwise, running out of memory when analyzing large solutions seems likely.\n+        private class CompilationResults\n+        {\n+            // CompletedCompilation represents the most recent compilation of a project for which analysis came to full completion.\n+            // It includes all diagnostics but does not hold on to the Compilation object used to create them.\n+            public CompilationResult CompletedCompilation = new CompilationResult(null, VersionStamp.Default, null);\n \n-            // REVIEW: this API is a bit strange. \n-            //         if getting diagnostic is cancelled, it has to create new compilation and do everything from scretch again?\n-            var dxs = GetDiagnosticData(project, await compilationWithAnalyzer.GetAnalyzerDiagnosticsAsync().ConfigureAwait(false)).ToImmutableArrayOrEmpty();\n+            // CurrentCompilation represents the most recent compilation of a project, with analysis possibly ongoing.\n+            // It includes a snapshot of current diagnostics and the Compilation being used to create more.\n+            public CompilationResult CurrentCompilation = new CompilationResult(null, VersionStamp.Default, null);\n+        }\n \n-            return dxs;\n+        private enum CompilationVintage\n+        {\n+            Completed,\n+            Current\n         }\n \n-        private IEnumerable<DiagnosticData> GetDiagnosticData(Project project, ImmutableArray<Diagnostic> diagnostics)\n+        private CompilationResult GetCompilationResult(Project project, VersionStamp projectVersion, CompilationVintage vintage)\n         {\n-            foreach (var diagnostic in diagnostics)\n+            lock (_compilationResults)\n             {\n-                if (diagnostic.Location == Location.None)\n+                CompilationResults results;\n+                if (_compilationResults.TryGetValue(project.Id, out results))\n                 {\n-                    yield return DiagnosticData.Create(project, diagnostic);\n-                    continue;\n+                    if (vintage == CompilationVintage.Completed)\n+                    {\n+                        return results.CompletedCompilation;\n+                    }\n+\n+                    if (results.CurrentCompilation.ProjectVersion == projectVersion)\n+                    {\n+                        return results.CurrentCompilation;\n+                    }\n+                }\n+            }\n+\n+            return null;\n+        }\n+\n+        private CompilationResult GetCompilationResult(Compilation compilation, Project project, VersionStamp projectVersion, CancellationToken cancellationToken)\n+        {\n+            lock (_compilationResults)\n+            {\n+                CompilationResults results;\n+                if (!_compilationResults.TryGetValue(project.Id, out results))\n+                {\n+                    results = new CompilationResults();\n+                    _compilationResults[project.Id] = results;\n                 }\n \n-                var document = project.GetDocument(diagnostic.Location.SourceTree);\n-                if (document == null)\n+                CompilationResult completedCompilation = results.CompletedCompilation;\n+                if (completedCompilation.ProjectVersion == projectVersion)\n                 {\n-                    continue;\n+                    return completedCompilation;\n                 }\n \n-                yield return DiagnosticData.Create(document, diagnostic);\n+                // ToDo: The set of analyzers might also be considered in determining whether or not create a new CompilationWithAnalyzers.\n+\n+                CompilationResult currentCompilation = results.CurrentCompilation;\n+                if (currentCompilation.ProjectVersion != projectVersion)\n+                {\n+                    // The requested project version is not the same as that of the current compilation.\n+                    // Assume that the requested version is newer.\n+\n+                    ImmutableArray<DiagnosticAnalyzer> analyzers = Flatten(HostAnalyzerManager.CreateDiagnosticAnalyzersPerReference(project).Values);\n+                    CompilationWithAnalyzers newCompilationWithAnalyzers = !analyzers.IsEmpty ? compilation.WithAnalyzers(analyzers, project.AnalyzerOptions, cancellationToken) : null;\n+                    results.CurrentCompilation = new CompilationResult(project, projectVersion, newCompilationWithAnalyzers);\n+                }\n+\n+                return results.CurrentCompilation;\n             }\n         }\n \n-        public override Task SynchronizeWithBuildAsync(Project project, ImmutableArray<DiagnosticData> diagnostics)\n+        private void Complete(Project project, CompilationResult compilationResult)\n         {\n-            // V2 engine doesn't do anything. \n-            // it means live error always win over build errors. build errors that can't be reported by live analyzer\n-            // are already taken cared by engine\n-            return SpecializedTasks.EmptyTask;\n+            if (compilationResult.CompletedSuccessfully)\n+            {\n+                lock (_compilationResults)\n+                {\n+                    _compilationResults[project.Id].CompletedCompilation = compilationResult;\n+                }\n+            }\n         }\n \n-        public override Task SynchronizeWithBuildAsync(Document document, ImmutableArray<DiagnosticData> diagnostics)\n+        private static ImmutableArray<T> Flatten<T>(IEnumerable<ImmutableArray<T>> arrays)\n         {\n-            // V2 engine doesn't do anything. \n-            // it means live error always win over build errors. build errors that can't be reported by live analyzer\n-            // are already taken cared by engine\n-            return SpecializedTasks.EmptyTask;\n+            ImmutableArray<T>.Builder builder = ImmutableArray.CreateBuilder<T>();\n+            foreach (ImmutableArray<T> array in arrays)\n+            {\n+                builder.AddRange(array);\n+            }\n+\n+            return builder.ToImmutable();\n         }\n \n-        private void RaiseEvents(Project project, ImmutableArray<DiagnosticData> diagnostics)\n+        // A CompilationResult first computes and then stores diagnostics for a compilation.\n+        // It does not keep a compilation or project alive after analysis completes.\n+        private class CompilationResult\n         {\n-            var groups = diagnostics.GroupBy(d => d.DocumentId);\n+            public VersionStamp ProjectVersion { get; private set; }\n+\n+            private readonly ConcurrentDictionary<DocumentId, ImmutableArray<Diagnostic>> _diagnosticsPerDocuments = new ConcurrentDictionary<DocumentId, ImmutableArray<Diagnostic>>();\n+            private readonly ConcurrentDictionary<DocumentId, Task> _analyzedDocuments = new ConcurrentDictionary<DocumentId, Task>();\n+            private readonly object _updateDiagnosticsLock = new object();\n+            private readonly DocumentId _noDocument;\n+            private CompilationWithAnalyzers _compilationWithAnalyzers;\n+            private Project _project;\n \n-            var solution = project.Solution;\n-            var workspace = solution.Workspace;\n+            private Task _completionTask;\n+            private bool _completionCanceled;\n \n-            foreach (var kv in groups)\n+            public CompilationResult(Project project, VersionStamp projectVersion, CompilationWithAnalyzers compilation)\n             {\n-                if (kv.Key == null)\n+                _compilationWithAnalyzers = compilation;\n+                _project = project;\n+                this.ProjectVersion = projectVersion;\n+\n+                if (project != null)\n                 {\n-                    Owner.RaiseDiagnosticsUpdated(\n-                        this, new DiagnosticsUpdatedArgs(\n-                            ValueTuple.Create(this, project.Id), workspace, solution, project.Id, null, kv.ToImmutableArrayOrEmpty()));\n-                    continue;\n+                    _noDocument = new DocumentId(project.Id, Guid.Empty, \"No document\");\n+                }\n+            }\n+\n+            public bool CompletionStarted\n+            {\n+                get { return _completionTask != null; }\n+            }\n+\n+            public bool DocumentAnalyzed(DocumentId documentId)\n+            {\n+                return _analyzedDocuments.ContainsKey(documentId);\n+            }\n+\n+            public async Task<ImmutableArray<Diagnostic>> AnalyzeProjectAsync(CancellationToken cancellationToken)\n+            {\n+                ImmutableArray<Diagnostic> diagnostics = ImmutableArray<Diagnostic>.Empty;\n+                if (_compilationWithAnalyzers != null)\n+                {\n+                    lock (_updateDiagnosticsLock)\n+                    {\n+                        if (!this.CompletionStarted)\n+                        {\n+                            _completionTask = Task.Run(async () =>\n+                            {\n+                                // If any documents have been separately analyzed, complete analysis of the project\n+                                // by analyzing each document individually. Otherwise, analyze the project as a whole.\n+                                if (_analyzedDocuments.Count > 0)\n+                                {","path":"src/Features/Core/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer.cs","position":536,"original_position":536,"commit_id":"d65d44e169592352798f0cbef0ce4431d0a51642","original_commit_id":"d65d44e169592352798f0cbef0ce4431d0a51642","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":"Ah, thanks. Then its not magic, its your sharp eye that detected this :) It would be good to let compiler team know not to regress this behavior, probably add a comment in compiler code triggering the compilation end event?","created_at":"2015-04-21T21:02:38Z","updated_at":"2015-04-21T21:02:38Z","html_url":"https://github.com/dotnet/roslyn/pull/2138#discussion_r28821905","pull_request_url":"https://api.github.com/repos/dotnet/roslyn/pulls/2138","_links":{"self":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/comments/28821905"},"html":{"href":"https://github.com/dotnet/roslyn/pull/2138#discussion_r28821905"},"pull_request":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/2138"}}},"pull_request":{"url":"https://api.github.com/repos/dotnet/roslyn/pulls/2138","id":33723727,"html_url":"https://github.com/dotnet/roslyn/pull/2138","diff_url":"https://github.com/dotnet/roslyn/pull/2138.diff","patch_url":"https://github.com/dotnet/roslyn/pull/2138.patch","issue_url":"https://api.github.com/repos/dotnet/roslyn/issues/2138","number":2138,"state":"open","locked":false,"title":"V2 Diagnostics incremental analyzer -- uses compiler's analyzer driver","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":"A V2 analyzer action invocation mechanism, based on the compiler's analyzer driver, is far enough along for start experimenting with it. It is not ready for actual deployment, as it presently lacks a means of throttling the number of active compilations and is, based on rudimentary observation, not as fast as the current IDE mechanism.\r\n\r\nThis change set does not turn on the V2 mechanism, but does include some prerequisite changes to the analyzer driver (e.g. not starting analysis until requested), and these changes do need careful review.\r\n\r\nOf course, the V2 mechanism itself is fair game for rigorous review, though it remains disabled.\r\n\r\n@gafter @mavasani @heejaechang @srivatsn are likely to be particularly interested.","created_at":"2015-04-21T02:16:35Z","updated_at":"2015-04-21T21:02:38Z","closed_at":null,"merged_at":null,"merge_commit_sha":"6852b7468afe1a0b135f85f9a3e1386df405f975","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/dotnet/roslyn/pulls/2138/commits","review_comments_url":"https://api.github.com/repos/dotnet/roslyn/pulls/2138/comments","review_comment_url":"https://api.github.com/repos/dotnet/roslyn/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dotnet/roslyn/issues/2138/comments","statuses_url":"https://api.github.com/repos/dotnet/roslyn/statuses/d65d44e169592352798f0cbef0ce4431d0a51642","head":{"label":"JohnHamby:IncrementalAnalyzer","ref":"IncrementalAnalyzer","sha":"d65d44e169592352798f0cbef0ce4431d0a51642","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}","created_at":"2015-02-13T00:07:31Z","updated_at":"2015-02-13T00:07:58Z","pushed_at":"2015-04-21T02:07:38Z","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":67958,"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":"0a54d67590a742f99f25ddb1815aff9e77b13c81","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}","created_at":"2015-01-11T02:39:03Z","updated_at":"2015-04-21T20:56:53Z","pushed_at":"2015-04-21T20:56:53Z","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":112560,"stargazers_count":1841,"watchers_count":1841,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":410,"mirror_url":null,"open_issues_count":742,"forks":410,"open_issues":742,"watchers":1841,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/2138"},"html":{"href":"https://github.com/dotnet/roslyn/pull/2138"},"issue":{"href":"https://api.github.com/repos/dotnet/roslyn/issues/2138"},"comments":{"href":"https://api.github.com/repos/dotnet/roslyn/issues/2138/comments"},"review_comments":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/2138/comments"},"review_comment":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/2138/commits"},"statuses":{"href":"https://api.github.com/repos/dotnet/roslyn/statuses/d65d44e169592352798f0cbef0ce4431d0a51642"}}}}