{"action":"created","comment":{"url":"https://api.github.com/repos/dotnet/roslyn/pulls/comments/178729845","pull_request_review_id":108833748,"id":178729845,"diff_hunk":"@@ -0,0 +1,476 @@\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.Immutable;\n+using System.Diagnostics;\n+using System.Linq;\n+using Microsoft.CodeAnalysis.EmbeddedLanguages.Common;\n+using Microsoft.CodeAnalysis.EmbeddedLanguages.VirtualChars;\n+using Microsoft.CodeAnalysis.PooledObjects;\n+using Microsoft.CodeAnalysis.Text;\n+using Roslyn.Utilities;\n+\n+namespace Microsoft.CodeAnalysis.EmbeddedLanguages.Json\n+{\n+    using static EmbeddedSyntaxHelpers;\n+    using static JsonHelpers;\n+\n+    using JsonNodeOrToken = EmbeddedSyntaxNodeOrToken<JsonKind, JsonNode>;\n+    using JsonToken = EmbeddedSyntaxToken<JsonKind>;\n+    using JsonTrivia = EmbeddedSyntaxTrivia<JsonKind>;\n+\n+    internal partial struct JsonParser\n+    {\n+        private static readonly string _closeBracketExpected = string.Format(WorkspacesResources._0_expected, ']');\n+        private static readonly string _closeBraceExpected = string.Format(WorkspacesResources._0_expected, '}');\n+        private static readonly string _openParenExpected = string.Format(WorkspacesResources._0_expected, '(');\n+        private static readonly string _closeParenExpected = string.Format(WorkspacesResources._0_expected, ')');\n+\n+        private JsonLexer _lexer;\n+        private JsonToken _currentToken;\n+        private int _recursionDepth;\n+        private bool _inObject;\n+        private bool _inArray;\n+        private bool _inConstructor;\n+\n+        private JsonParser(\n+            ImmutableArray<VirtualChar> text) : this()\n+        {\n+            _lexer = new JsonLexer(text);\n+\n+            // Get the first token.\n+            ConsumeCurrentToken();\n+        }\n+\n+        /// <summary>\n+        /// Returns the latest token the lexer has produced, and then asks the lexer to \n+        /// produce the next token after that.\n+        /// </summary>\n+        private JsonToken ConsumeCurrentToken()\n+        {\n+            var previous = _currentToken;\n+            _currentToken = _lexer.ScanNextToken();\n+            return previous;\n+        }\n+\n+        /// <summary>\n+        /// Given an input text, parses out a fully representative syntax tree  and list of \n+        /// diagnotics.  Parsing should always succeed, except in the case of the stack \n+        /// overflowing.\n+        /// </summary>\n+        public static JsonTree TryParse(ImmutableArray<VirtualChar> text, bool strict)\n+        {\n+            try\n+            {\n+                var tree1 = new JsonParser(text).ParseTree(strict);\n+                return tree1;\n+            }\n+            catch (Exception e) when (StackGuard.IsInsufficientExecutionStackException(e))\n+            {\n+                return null;\n+            }\n+        }\n+\n+        private JsonTree ParseTree(bool strict)\n+        {\n+            var arraySequence = this.ParseSequence();\n+            Debug.Assert(_lexer.Position == _lexer.Text.Length);\n+            Debug.Assert(_currentToken.Kind == JsonKind.EndOfFile);\n+\n+            var root = new JsonCompilationUnit(arraySequence, _currentToken);\n+\n+            var diagnostic = GetDiagnostic(root) ?? CheckTopLevel(_lexer.Text, root);\n+            if (diagnostic == null)\n+            {\n+                diagnostic = strict\n+                    ? new StrictSyntaxChecker().CheckSyntax(root)\n+                    : new JsonNetSyntaxChecker().CheckSyntax(root);\n+            }\n+\n+            var diagnostics = diagnostic == null\n+                ? ImmutableArray<EmbeddedDiagnostic>.Empty\n+                : ImmutableArray.Create(diagnostic.Value);\n+\n+            return new JsonTree(\n+                _lexer.Text, root, diagnostics);\n+        }\n+\n+        private EmbeddedDiagnostic? CheckTopLevel(\n+            ImmutableArray<VirtualChar> text, JsonCompilationUnit compilationUnit)\n+        {\n+            var arraySequence = compilationUnit.Sequence;\n+            if (arraySequence.ChildCount == 0)\n+            {\n+                if (text.Length > 0 &&\n+                    compilationUnit.EndOfFileToken.LeadingTrivia.All(\n+                        t => t.Kind == JsonKind.WhitespaceTrivia || t.Kind == JsonKind.EndOfLineTrivia))\n+                {\n+                    return new EmbeddedDiagnostic(WorkspacesResources.Syntax_error, GetSpan(text));\n+                }\n+            }\n+            else if (arraySequence.ChildCount >= 2)\n+            {\n+                var firstToken = GetFirstToken(arraySequence.ChildAt(1).Node);\n+                return new EmbeddedDiagnostic(\n+                    string.Format(WorkspacesResources._0_unexpected, firstToken.VirtualChars[0].Char),\n+                    firstToken.GetSpan());\n+            }\n+            foreach (var child in compilationUnit.Sequence)\n+            {\n+                if (child.IsNode && child.Node.Kind == JsonKind.EmptyValue)\n+                {\n+                    var emptyValue = (JsonEmptyValueNode)child.Node;\n+                    return new EmbeddedDiagnostic(\n+                        string.Format(WorkspacesResources._0_unexpected, ','),\n+                        emptyValue.CommaToken.GetSpan());\n+                }\n+            }\n+\n+            return null;\n+        }\n+\n+        private static JsonToken GetFirstToken(JsonNode node)\n+        {\n+            foreach (var child in node)\n+            {\n+                return child.IsNode\n+                    ? GetFirstToken(child.Node)\n+                    : child.Token;\n+            }\n+\n+            throw new InvalidOperationException();\n+        }\n+\n+        private static EmbeddedDiagnostic? GetDiagnostic(JsonNode node)\n+        {\n+            foreach (var child in node)\n+            {\n+                var diagnostic = GetDiagnostic(child);\n+                if (diagnostic != null)\n+                {\n+                    return diagnostic;\n+                }\n+            }\n+\n+            return null;\n+        }\n+\n+        private static EmbeddedDiagnostic? GetDiagnostic(JsonNodeOrToken child)\n+        {\n+            return child.IsNode\n+                ? GetDiagnostic(child.Node)\n+                : GetDiagnostic(child.Token);\n+        }\n+\n+        private static EmbeddedDiagnostic? GetDiagnostic(JsonToken token)\n+            => GetDiagnostic(token.LeadingTrivia) ?? token.Diagnostics.FirstOrNullable() ?? GetDiagnostic(token.TrailingTrivia);\n+\n+        private static EmbeddedDiagnostic? GetDiagnostic(ImmutableArray<JsonTrivia> list)\n+        {\n+            foreach (var trivia in list)\n+            {\n+                var diagnostic = trivia.Diagnostics.FirstOrNullable();\n+                if (diagnostic != null)\n+                {\n+                    return diagnostic;\n+                }\n+            }\n+\n+            return null;\n+        }\n+\n+        private JsonSequenceNode ParseSequence()\n+        {\n+            try\n+            {\n+                _recursionDepth++;\n+                StackGuard.EnsureSufficientExecutionStack(_recursionDepth);\n+                return ParseSequenceWorker();\n+            }\n+            finally\n+            {\n+                _recursionDepth--;\n+            }\n+        }\n+\n+        private JsonSequenceNode ParseSequenceWorker()\n+        {\n+            var list = ArrayBuilder<JsonValueNode>.GetInstance();\n+\n+            if (ShouldConsumeSequenceElement())\n+            {\n+                do\n+                {\n+                    list.Add(ParseValue());\n+                }\n+                while (ShouldConsumeSequenceElement());\n+            }\n+\n+            return new JsonSequenceNode(list.ToImmutableAndFree());\n+        }\n+\n+        private bool ShouldConsumeSequenceElement()\n+        {\n+            if (_currentToken.Kind == JsonKind.EndOfFile)\n+            {\n+                return false;\n+            }\n+\n+            if (_currentToken.Kind == JsonKind.CloseBraceToken)\n+            {\n+                return !_inObject;\n+            }\n+\n+            if (_currentToken.Kind == JsonKind.CloseBracketToken)\n+            {\n+                return !_inArray;\n+            }\n+\n+            if (_currentToken.Kind == JsonKind.CloseParenToken)\n+            {\n+                return !_inConstructor;\n+            }\n+\n+            return true;\n+        }\n+\n+        private JsonValueNode ParseValue()\n+        {\n+            switch (_currentToken.Kind)\n+            {\n+                case JsonKind.OpenBraceToken:\n+                    return ParseObject();\n+                case JsonKind.OpenBracketToken:\n+                    return ParseArray();\n+                case JsonKind.CommaToken:\n+                    return ParseEmptyValue();\n+                default:\n+                    return ParseLiteralOrPropertyOrConstructor();\n+            }\n+        }\n+\n+        private static void SplitLiteral(JsonToken literalToken, out JsonToken minusToken, out JsonToken newLiteralToken)\n+        {\n+            minusToken = CreateToken(\n+                JsonKind.MinusToken, literalToken.LeadingTrivia,\n+                ImmutableArray.Create(literalToken.VirtualChars[0]),\n+                ImmutableArray<JsonTrivia>.Empty);\n+            newLiteralToken = CreateToken(\n+                literalToken.Kind,\n+                ImmutableArray<JsonTrivia>.Empty,\n+                literalToken.VirtualChars.Skip(1).ToImmutableArray(),\n+                literalToken.TrailingTrivia,\n+                literalToken.Diagnostics);\n+        }\n+\n+        private JsonPropertyNode ParseProperty(JsonToken stringLiteralOrText)\n+        {\n+            Debug.Assert(_currentToken.Kind == JsonKind.ColonToken);\n+            if (stringLiteralOrText.Kind != JsonKind.StringToken)\n+            {\n+                stringLiteralOrText = stringLiteralOrText.With(kind: JsonKind.TextToken);\n+            }\n+\n+            var colonToken = ConsumeCurrentToken();\n+            // Newtonsoft allows \"{ a: , }\" as a legal property.\n+            if (_currentToken.Kind == JsonKind.CommaToken)\n+            {\n+                return new JsonPropertyNode(\n+                    stringLiteralOrText, colonToken,\n+                    new JsonEmptyValueNode(CreateMissingToken(JsonKind.CommaToken)));\n+            }\n+            else if (_currentToken.Kind == JsonKind.EndOfFile)\n+            {\n+                return new JsonPropertyNode(\n+                    stringLiteralOrText, colonToken,\n+                    new JsonEmptyValueNode(CreateMissingToken(JsonKind.CommaToken).AddDiagnosticIfNone(new EmbeddedDiagnostic(\n+                        WorkspacesResources.Missing_property_value,\n+                        GetTokenStartPositionSpan(_currentToken)))));\n+            }\n+\n+            var value = ParseValue();\n+            if (value.Kind == JsonKind.Property)\n+            {\n+                var nestedProperty = (JsonPropertyNode)value;\n+                value = new JsonPropertyNode(\n+                    nestedProperty.NameToken,\n+                    nestedProperty.ColonToken.AddDiagnosticIfNone(new EmbeddedDiagnostic(\n+                        WorkspacesResources.Nested_properties_not_allowed,\n+                        nestedProperty.ColonToken.GetSpan())),\n+                    nestedProperty.Value);\n+            }\n+\n+            return new JsonPropertyNode(\n+                stringLiteralOrText, colonToken, value);\n+        }\n+\n+        private JsonValueNode ParseLiteralOrPropertyOrConstructor()\n+        {\n+            // var token = ConsumeCurrentToken().With(kind: JsonKind.TextToken);","path":"src/Workspaces/Core/Portable/EmbeddedLanguages/Json/JsonParser.cs","position":301,"original_position":309,"commit_id":"cdd2ab8b0a41dfa8be73401c0c0bd644903a3d22","original_commit_id":"c661444d47dae29932247abb2ad659cfbe103ffa","user":{"login":"CyrusNajmabadi","id":4564579,"avatar_url":"https://avatars3.githubusercontent.com/u/4564579?v=4","gravatar_id":"","url":"https://api.github.com/users/CyrusNajmabadi","html_url":"https://github.com/CyrusNajmabadi","followers_url":"https://api.github.com/users/CyrusNajmabadi/followers","following_url":"https://api.github.com/users/CyrusNajmabadi/following{/other_user}","gists_url":"https://api.github.com/users/CyrusNajmabadi/gists{/gist_id}","starred_url":"https://api.github.com/users/CyrusNajmabadi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CyrusNajmabadi/subscriptions","organizations_url":"https://api.github.com/users/CyrusNajmabadi/orgs","repos_url":"https://api.github.com/users/CyrusNajmabadi/repos","events_url":"https://api.github.com/users/CyrusNajmabadi/events{/privacy}","received_events_url":"https://api.github.com/users/CyrusNajmabadi/received_events","type":"User","site_admin":false},"body":"done.  #resolved.","created_at":"2018-04-03T07:01:04Z","updated_at":"2018-04-03T07:01:04Z","html_url":"https://github.com/dotnet/roslyn/pull/24110#discussion_r178729845","pull_request_url":"https://api.github.com/repos/dotnet/roslyn/pulls/24110","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/comments/178729845"},"html":{"href":"https://github.com/dotnet/roslyn/pull/24110#discussion_r178729845"},"pull_request":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/24110"}},"in_reply_to_id":178725562},"pull_request":{"url":"https://api.github.com/repos/dotnet/roslyn/pulls/24110","id":161736770,"html_url":"https://github.com/dotnet/roslyn/pull/24110","diff_url":"https://github.com/dotnet/roslyn/pull/24110.diff","patch_url":"https://github.com/dotnet/roslyn/pull/24110.patch","issue_url":"https://api.github.com/repos/dotnet/roslyn/issues/24110","number":24110,"state":"open","locked":false,"title":"Add in a json parser so that the IDE can provide services around json editing.","user":{"login":"CyrusNajmabadi","id":4564579,"avatar_url":"https://avatars3.githubusercontent.com/u/4564579?v=4","gravatar_id":"","url":"https://api.github.com/users/CyrusNajmabadi","html_url":"https://github.com/CyrusNajmabadi","followers_url":"https://api.github.com/users/CyrusNajmabadi/followers","following_url":"https://api.github.com/users/CyrusNajmabadi/following{/other_user}","gists_url":"https://api.github.com/users/CyrusNajmabadi/gists{/gist_id}","starred_url":"https://api.github.com/users/CyrusNajmabadi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CyrusNajmabadi/subscriptions","organizations_url":"https://api.github.com/users/CyrusNajmabadi/orgs","repos_url":"https://api.github.com/users/CyrusNajmabadi/repos","events_url":"https://api.github.com/users/CyrusNajmabadi/events{/privacy}","received_events_url":"https://api.github.com/users/CyrusNajmabadi/received_events","type":"User","site_admin":false},"body":"Followup to https://github.com/dotnet/roslyn/pull/23984\r\n\r\nSo JFK has busted pipes.  So i've been in airport limbo :-(     On a good note, it gave me some time to expand on my previous Regex PR.  Now, on top of Regex support in the IDE we also support JSON strings.\r\n\r\nThis also expands the previous interaction model with built in json detection for string tokens.  i.e., if we see:\r\n\r\n![image](https://user-images.githubusercontent.com/4564579/34694351-a0eb7324-f47b-11e7-8bfb-2a8f96b12d97.png)\r\n\r\nThen we'll offer:\r\n\r\n![image](https://user-images.githubusercontent.com/4564579/34697518-5a0dc490-f488-11e7-8bfd-bc76633d6711.png)\r\n\r\nThis then helps users see how they can add a comment that lights-up IDE features for these types of strings.  Note: i don't do this for regexes because of a concern about too many false positives.  Once the comment is added things like up like so:\r\n\r\n![image](https://user-images.githubusercontent.com/4564579/34694398-d37a0684-f47b-11e7-9091-7ad16db391b3.png)\r\n\r\nOf course, squiggles and braces are supported, on top of just colors:\r\n\r\n![image](https://user-images.githubusercontent.com/4564579/34694425-eadd0132-f47b-11e7-8ee0-9ffffa5f69dc.png)\r\n\r\nAlso, if you're using JToken/JObject/JArray, then you don't need to provide the comment (similar to how ```new Regex(pattern)``` is automatically detected: \r\n\r\n![image](https://user-images.githubusercontent.com/4564579/34694784-33f2833c-f47d-11e7-86d0-a6f6a2578d00.png)\r\n\r\nThings to note:\r\n\r\n1. unlike regexes, this was much simpler to provide.  That's because json is *much* simpler and much better documented versus the .net regex model.\r\n2. Two forms of json are supported.  A strict mode that aligns with the IETF rfc for json, as well as Json.net's format.  Json.net is clearly the .net json winner (almost 100m downloads) and is most likely what people will be using.  Json.net allows a superset of standard json strings (including allowing things like comments, as well as other constructs that would normally be errors in es6 json).  \r\n3. This leverages the VirtualChar work from the regex work, demonstrating that this is a suitable subsystem for general DSL plugins.  \r\n\r\n\r\n  \r\n  \r\n  ","created_at":"2018-01-08T22:04:03Z","updated_at":"2018-04-03T07:01:04Z","closed_at":null,"merged_at":null,"merge_commit_sha":"734a31faa5cbedf9acef9f9ed8a48fcd67a916f9","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[{"name":"roslyn-ide","id":1781706,"slug":"roslyn-ide","description":"Roslyn IDE Team","privacy":"closed","url":"https://api.github.com/teams/1781706","members_url":"https://api.github.com/teams/1781706/members{/member}","repositories_url":"https://api.github.com/teams/1781706/repos","permission":"pull"}],"labels":[{"id":166377917,"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/33","html_url":"https://github.com/dotnet/roslyn/milestone/33","labels_url":"https://api.github.com/repos/dotnet/roslyn/milestones/33/labels","id":3020805,"number":33,"title":"15.8","description":null,"creator":{"login":"sharwell","id":1408396,"avatar_url":"https://avatars1.githubusercontent.com/u/1408396?v=4","gravatar_id":"","url":"https://api.github.com/users/sharwell","html_url":"https://github.com/sharwell","followers_url":"https://api.github.com/users/sharwell/followers","following_url":"https://api.github.com/users/sharwell/following{/other_user}","gists_url":"https://api.github.com/users/sharwell/gists{/gist_id}","starred_url":"https://api.github.com/users/sharwell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sharwell/subscriptions","organizations_url":"https://api.github.com/users/sharwell/orgs","repos_url":"https://api.github.com/users/sharwell/repos","events_url":"https://api.github.com/users/sharwell/events{/privacy}","received_events_url":"https://api.github.com/users/sharwell/received_events","type":"User","site_admin":false},"open_issues":176,"closed_issues":35,"state":"open","created_at":"2018-01-08T19:35:57Z","updated_at":"2018-04-03T06:45:03Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/dotnet/roslyn/pulls/24110/commits","review_comments_url":"https://api.github.com/repos/dotnet/roslyn/pulls/24110/comments","review_comment_url":"https://api.github.com/repos/dotnet/roslyn/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dotnet/roslyn/issues/24110/comments","statuses_url":"https://api.github.com/repos/dotnet/roslyn/statuses/cdd2ab8b0a41dfa8be73401c0c0bd644903a3d22","head":{"label":"CyrusNajmabadi:jsonParsing","ref":"jsonParsing","sha":"cdd2ab8b0a41dfa8be73401c0c0bd644903a3d22","user":{"login":"CyrusNajmabadi","id":4564579,"avatar_url":"https://avatars3.githubusercontent.com/u/4564579?v=4","gravatar_id":"","url":"https://api.github.com/users/CyrusNajmabadi","html_url":"https://github.com/CyrusNajmabadi","followers_url":"https://api.github.com/users/CyrusNajmabadi/followers","following_url":"https://api.github.com/users/CyrusNajmabadi/following{/other_user}","gists_url":"https://api.github.com/users/CyrusNajmabadi/gists{/gist_id}","starred_url":"https://api.github.com/users/CyrusNajmabadi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CyrusNajmabadi/subscriptions","organizations_url":"https://api.github.com/users/CyrusNajmabadi/orgs","repos_url":"https://api.github.com/users/CyrusNajmabadi/repos","events_url":"https://api.github.com/users/CyrusNajmabadi/events{/privacy}","received_events_url":"https://api.github.com/users/CyrusNajmabadi/received_events","type":"User","site_admin":false},"repo":{"id":30565155,"name":"roslyn","full_name":"CyrusNajmabadi/roslyn","owner":{"login":"CyrusNajmabadi","id":4564579,"avatar_url":"https://avatars3.githubusercontent.com/u/4564579?v=4","gravatar_id":"","url":"https://api.github.com/users/CyrusNajmabadi","html_url":"https://github.com/CyrusNajmabadi","followers_url":"https://api.github.com/users/CyrusNajmabadi/followers","following_url":"https://api.github.com/users/CyrusNajmabadi/following{/other_user}","gists_url":"https://api.github.com/users/CyrusNajmabadi/gists{/gist_id}","starred_url":"https://api.github.com/users/CyrusNajmabadi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CyrusNajmabadi/subscriptions","organizations_url":"https://api.github.com/users/CyrusNajmabadi/orgs","repos_url":"https://api.github.com/users/CyrusNajmabadi/repos","events_url":"https://api.github.com/users/CyrusNajmabadi/events{/privacy}","received_events_url":"https://api.github.com/users/CyrusNajmabadi/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/CyrusNajmabadi/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/CyrusNajmabadi/roslyn","forks_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/forks","keys_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/keys{/key_id}","collaborators_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/teams","hooks_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/hooks","issue_events_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/issues/events{/number}","events_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/events","assignees_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/assignees{/user}","branches_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/branches{/branch}","tags_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/tags","blobs_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/git/refs{/sha}","trees_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/git/trees{/sha}","statuses_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/statuses/{sha}","languages_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/languages","stargazers_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/stargazers","contributors_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/contributors","subscribers_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/subscribers","subscription_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/subscription","commits_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/commits{/sha}","git_commits_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/git/commits{/sha}","comments_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/comments{/number}","issue_comment_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/issues/comments{/number}","contents_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/contents/{+path}","compare_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/compare/{base}...{head}","merges_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/merges","archive_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/downloads","issues_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/issues{/number}","pulls_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/pulls{/number}","milestones_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/milestones{/number}","notifications_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/labels{/name}","releases_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/releases{/id}","deployments_url":"https://api.github.com/repos/CyrusNajmabadi/roslyn/deployments","created_at":"2015-02-09T23:45:22Z","updated_at":"2018-03-31T05:13:56Z","pushed_at":"2018-04-03T07:01:04Z","git_url":"git://github.com/CyrusNajmabadi/roslyn.git","ssh_url":"git@github.com:CyrusNajmabadi/roslyn.git","clone_url":"https://github.com/CyrusNajmabadi/roslyn.git","svn_url":"https://github.com/CyrusNajmabadi/roslyn","homepage":"","size":316080,"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":0,"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"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"dotnet:master","ref":"master","sha":"85ce1a7fbaaa98ae74820d169265f7411f632644","user":{"login":"dotnet","id":9141961,"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,"name":"roslyn","full_name":"dotnet/roslyn","owner":{"login":"dotnet","id":9141961,"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-04-03T06:53:37Z","pushed_at":"2018-04-03T07:00:36Z","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":330486,"stargazers_count":9082,"watchers_count":9082,"language":"C#","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2183,"mirror_url":null,"archived":false,"open_issues_count":4608,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":2183,"open_issues":4608,"watchers":9082,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/24110"},"html":{"href":"https://github.com/dotnet/roslyn/pull/24110"},"issue":{"href":"https://api.github.com/repos/dotnet/roslyn/issues/24110"},"comments":{"href":"https://api.github.com/repos/dotnet/roslyn/issues/24110/comments"},"review_comments":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/24110/comments"},"review_comment":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dotnet/roslyn/pulls/24110/commits"},"statuses":{"href":"https://api.github.com/repos/dotnet/roslyn/statuses/cdd2ab8b0a41dfa8be73401c0c0bd644903a3d22"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"CyrusNajmabadi"}}