{"action":"created","comment":{"url":"https://api.github.com/repos/Microsoft/TypeScript/pulls/comments/23120450","id":23120450,"diff_hunk":"@@ -356,6 +356,368 @@ module ts {\n         forEachChild(sourceFile, walk);\r\n     }\r\n \r\n+    export function getSyntacticDiagnostics(sourceFile: SourceFile) {\r\n+        if (!sourceFile.syntacticDiagnostics) {\r\n+            // Don't bother doing any grammar checks if there are already parser errors.  \r\n+            // Otherwise we may end up with too many cascading errors.\r\n+            sourceFile.syntacticDiagnostics = sourceFile.referenceDiagnostics.concat(sourceFile.parseDiagnostics);\r\n+        }\r\n+        return sourceFile.syntacticDiagnostics;\r\n+    }\r\n+\r\n+    function moveElementEntirelyPastChangeRange(element: IncrementalElement, delta: number) {\r\n+        if (element.length) {\r\n+            visitArray(<IncrementalNodeArray>element);\r\n+        }\r\n+        else {\r\n+            visitNode(<IncrementalNode>element);\r\n+        }\r\n+\r\n+        function visitNode(node: IncrementalNode) {\r\n+            // Ditch any existing LS children we may have created.  This way we can avoid \r\n+            // moving them forward.\r\n+            node._children = undefined;\r\n+            node.pos += delta;\r\n+            node.end += delta;\r\n+\r\n+            forEachChild(node, visitNode, visitArray);\r\n+        }\r\n+\r\n+        function visitArray(array: IncrementalNodeArray) {\r\n+            array.pos += delta;\r\n+            array.end += delta;\r\n+\r\n+            for (var i = 0, n = array.length; i < n; i++) {\r\n+                visitNode(array[i]);\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    function adjustIntersectingElement(element: IncrementalElement, changeStart: number, changeRangeOldEnd: number, changeRangeNewEnd: number, delta: number) {\r\n+        Debug.assert(element.end >= changeStart, \"Adjusting an element that was entirely before the change range\");\r\n+        Debug.assert(element.pos <= changeRangeOldEnd, \"Adjusting an element that was entirely after the change range\");\r\n+\r\n+        // We have an element that intersects the change range in some way.  It may have its\r\n+        // start, or its end (or both) in the changed range.  We want to adjust any part\r\n+        // that intersects such that the final tree is in a consistent state.  i.e. all\r\n+        // chlidren have spans within the span of their parent, and all siblings are ordered\r\n+        // properly.\r\n+\r\n+        // We may need to update both the 'pos' and the 'end' of the element.\r\n+\r\n+        // If the 'pos' is before the start of the change, then we don't need to touch it.  \r\n+        // If it isn't, then the 'pos' must be inside the change.  How we update it will \r\n+        // depend if delta is  positive or negative.  If delta is positive then we have \r\n+        // something like:\r\n+        //\r\n+        //  -------------------AAA-----------------\r\n+        //  -------------------BBBCCCCCCC-----------------\r\n+        //\r\n+        // In this case, we consider any node that started in the change range to still be\r\n+        // starting at the same position.\r\n+        //\r\n+        // however, if the delta is negative, then we instead have something like this:\r\n+        //\r\n+        //  -------------------XXXYYYYYYY-----------------\r\n+        //  -------------------ZZZ-----------------\r\n+        //\r\n+        // In this case, any element that started in the 'X' range will keep its position.  \r\n+        // However any element htat started after that will have their pos adjusted to be\r\n+        // at the end of the new range.  i.e. any node that started in the 'Y' range will\r\n+        // be adjusted to have their start at the end of the 'Z' range.\r\n+        //\r\n+        // The element will keep its position if possible.  Or Move backward to the new-end\r\n+        // if it's in the 'Y' range.\r\n+        element.pos = Math.min(element.pos, changeRangeNewEnd);\r\n+\r\n+        // If the 'end' is after the change range, then we always adjust it by the delta\r\n+        // amount.  However, if the end is in the change range, then how we adjust it \r\n+        // will depend on if delta is  positive or negative.  If delta is positive then we\r\n+        // have something like:\r\n+        //\r\n+        //  -------------------AAA-----------------\r\n+        //  -------------------BBBCCCCCCC-----------------\r\n+        //\r\n+        // In this case, we consider any node that ended inside the change range to keep its\r\n+        // end position.\r\n+        //\r\n+        // however, if the delta is negative, then we instead have something like this:\r\n+        //\r\n+        //  -------------------XXXYYYYYYY-----------------\r\n+        //  -------------------ZZZ-----------------\r\n+        //\r\n+        // In this case, any element that ended in the 'X' range will keep its position.  \r\n+        // However any element htat ended after that will have their pos adjusted to be\r\n+        // at the end of the new range.  i.e. any node that ended in the 'Y' range will\r\n+        // be adjusted to have their end at the end of the 'Z' range.\r\n+        if (element.end >= changeRangeOldEnd) {\r\n+            // Element ends after the change range.  Always adjust the end pos.\r\n+            element.end += delta;\r\n+        }\r\n+        else {\r\n+            // Element ends in the change range.  The element will keep its position if \r\n+            // possible. Or Move backward to the new-end if it's in the 'Y' range.\r\n+            element.end = Math.min(element.end, changeRangeNewEnd);\r\n+        }\r\n+\r\n+        Debug.assert(element.pos <= element.end);\r\n+        if (element.parent) {\r\n+            Debug.assert(element.pos >= element.parent.pos);\r\n+            Debug.assert(element.end <= element.parent.end);\r\n+        }\r\n+    }\r\n+\r\n+    function updateTokenPositionsAndMarkElements(node: IncrementalNode, changeStart: number, changeRangeOldEnd: number, changeRangeNewEnd: number, delta: number): void {\r\n+        visitNode(node);\r\n+\r\n+        function visitNode(child: IncrementalNode) {\r\n+            if (child.pos > changeRangeOldEnd) {\r\n+                // Node is entirely past the change range.  We need to move both its pos and \r\n+                // end, forward or backward appropriately.\r\n+                moveElementEntirelyPastChangeRange(child, delta);\r\n+                return;\r\n+            }\r\n+\r\n+            // Check if the element intersects the change range.  If it does, then it is not\r\n+            // reusable.  Also, we'll need to recurse to see what constituent portions we may\r\n+            // be able to use.\r\n+            var fullEnd = child.end;\r\n+            if (fullEnd >= changeStart) {\r\n+                child.intersectsChange = true;\r\n+\r\n+                // Adjust the pos or end (or both) of the intersecting element accordingly.\r\n+                adjustIntersectingElement(child, changeStart, changeRangeOldEnd, changeRangeNewEnd, delta);\r\n+                forEachChild(child, visitNode, visitArray);\r\n+                return;\r\n+            }\r\n+\r\n+            // Otherwise, the node is entirely before the change range.  No need to do anything with it.\r\n+        }\r\n+\r\n+        function visitArray(array: IncrementalNodeArray) {\r\n+            if (array.pos > changeRangeOldEnd) {\r\n+                // Array is entirely after the change range.  We need to move it, and move any of\r\n+                // its children.\r\n+                moveElementEntirelyPastChangeRange(array, delta);\r\n+            }\r\n+            else {\r\n+                // Check if the element intersects the change range.  If it does, then it is not\r\n+                // reusable.  Also, we'll need to recurse to see what constituent portions we may\r\n+                // be able to use.\r\n+                var fullEnd = array.end;\r\n+                if (fullEnd >= changeStart) {\r\n+                    array.intersectsChange = true;\r\n+\r\n+                    // Adjust the pos or end (or both) of the intersecting array accordingly.\r\n+                    adjustIntersectingElement(array, changeStart, changeRangeOldEnd, changeRangeNewEnd, delta);\r\n+                    for (var i = 0, n = array.length; i < n; i++) {\r\n+                        visitNode(array[i]);\r\n+                    }\r\n+                }\r\n+                // else {\r\n+                // Otherwise, the array is entirely before the change range.  No need to do anything with it.\r\n+                // }\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+\r\n+    function extendToAffectedRange(sourceFile: SourceFile, changeRange: TextChangeRange): TextChangeRange {\r\n+        // Consider the following code:\r\n+        //      void foo() { /; }\r\n+        //\r\n+        // If the text changes with an insertion of / just before the semicolon then we end up with:\r\n+        //      void foo() { //; }\r\n+        //\r\n+        // If we were to just use the changeRange a is, then we would not rescan the { token \r\n+        // (as it does not intersect the actual original change range).  Because an edit may\r\n+        // change the token touching it, we actually need to look back *at least* one token so\r\n+        // that the prior token sees that change.  \r\n+        var maxLookahead = 1;\r\n+\r\n+        var start = changeRange.span.start;\r\n+\r\n+        // the first iteration aligns us with the change start. subsequent iteration move us to\r\n+        // the left by maxLookahead tokens.  We only need to do this as long as we're not at the\r\n+        // start of the tree.\r\n+        for (var i = 0; start > 0 && i <= maxLookahead; i++) {\r\n+            var nearestNode = findNearestNodeStartingBeforeOrAtPosition(sourceFile, start);\r\n+            var position = nearestNode.pos;\r\n+\r\n+            start = Math.max(0, position - 1);\r\n+        }\r\n+\r\n+        var finalSpan = createTextSpanFromBounds(start, textSpanEnd(changeRange.span));\r\n+        var finalLength = changeRange.newLength + (changeRange.span.start - start);\r\n+\r\n+        return createTextChangeRange(finalSpan, finalLength);\r\n+    }\r\n+\r\n+    function findNearestNodeStartingBeforeOrAtPosition(sourceFile: SourceFile, position: number): Node {\r\n+        var bestResult: Node = sourceFile;\r\n+        var lastNodeEntirelyBeforePosition: Node;\r\n+\r\n+        forEachChild(sourceFile, visit);\r\n+\r\n+        if (lastNodeEntirelyBeforePosition) {\r\n+            var lastChildOfLastEntireNodeBeforePosition = getLastChild(lastNodeEntirelyBeforePosition);\r\n+            if (lastChildOfLastEntireNodeBeforePosition.pos > bestResult.pos) {\r\n+                bestResult = lastChildOfLastEntireNodeBeforePosition;\r\n+            }\r\n+        }\r\n+\r\n+        return bestResult;\r\n+\r\n+        function getLastChild(node: Node): Node {\r\n+            while (true) {\r\n+                var lastChild = getLastChildWorker(node);\r\n+                if (lastChild) {\r\n+                    node = lastChild;\r\n+                }\r\n+                else {\r\n+                    return node;\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        function getLastChildWorker(node: Node): Node {\r\n+            var last: Node = undefined;\r\n+            forEachChild(node, child => {\r\n+                if (nodeIsPresent(child)) {\r\n+                    last = child;\r\n+                }\r\n+            });\r\n+            return last;\r\n+        }\r\n+\r\n+        function visit(child: Node) {\r\n+            if (nodeIsMissing(child)) {\r\n+                // Missing nodes are effectively invisible to us.  We never even consider them\r\n+                // When trying to find the nearest node before us.\r\n+                return;\r\n+            }\r\n+\r\n+            // If the child intersects this position, then this node is currently the nearest \r\n+            // node that starts before the position.\r\n+            if (child.pos <= position) {\r\n+                if (child.pos >= bestResult.pos) {\r\n+                    // This node starts before the position, and is closer to the position than\r\n+                    // the previous best node we found.  It is now the new best node.\r\n+                    bestResult = child;\r\n+                }\r\n+\r\n+                // Now, the node may overlap the position, or it may end entirely before the\r\n+                // position.  If it overlaps with the position, then either it, or one of its\r\n+                // children must be the nearest node before the position.  So we can just \r\n+                // recurse into this child to see if we can find something better.\r\n+                if (position < child.end) {\r\n+                    // The nearest node is either this child, or one of the children inside\r\n+                    // of it.  We've already marked this child as the best so far.  Recurse\r\n+                    // in case one of the children is better.\r\n+                    forEachChild(child, visit);\r\n+\r\n+                    // Once we look at the children of this node, then there's no need to\r\n+                    // continue any further.\r\n+                    return true;\r\n+                }\r\n+                else {\r\n+                    Debug.assert(child.end <= position);\r\n+                    // The child ends entirely before this position.  Say you have the following\r\n+                    // (where $ is the position)\r\n+                    // \r\n+                    //      <complex expr 1> ? <complex expr 2> $ : <...> <...> \r\n+                    //\r\n+                    // We would want to find the nearest preceding node in \"complex expr 2\". \r\n+                    // To support that, we keep track of this node, and once we're done searching\r\n+                    // for a best node, we recurse down this node to see if we can find a good\r\n+                    // result in it.\r\n+                    //\r\n+                    // This approach allows us to quickly skip over nodes that are entirely \r\n+                    // before the position, while still allowing us to find any nodes in the\r\n+                    // last one that might be what we want.\r\n+                    lastNodeEntirelyBeforePosition = child;\r\n+                }\r\n+            }\r\n+            else {\r\n+                Debug.assert(child.pos > position);\r\n+                // We're now at a node that is entirely past the position we're searching for.\r\n+                // This node (and all following nodes) could never contribute to the result,\r\n+                // so just skip them by returning 'true' here.\r\n+                return true;\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+\r\n+    // Produces a new SourceFile for the 'newText' provided. The 'textChangeRange' parameter \r\n+    // indicates what changed between the 'text' that this SourceFile has and the 'newText'.\r\n+    // The SourceFile will be created with the compiler attempting to reuse as many nodes from \r\n+    // this file as possible.\r\n+    //\r\n+    // Note: this function mutates nodes from this SourceFile. That means any existing nodes\r\n+    // from this SourceFile that are being held onto may change as a result (including \r\n+    // becoming detached from any SourceFile).  It is recommended that this SourceFile not\r\n+    // be used once 'update' is called on it.\r\n+    export function update(sourceFile: SourceFile, newText: string, textChangeRange: TextChangeRange): SourceFile {\r","path":"src/compiler/parser.ts","position":306,"original_position":306,"commit_id":"cf8c21893a07774c48b6051e48f399905e8421e6","original_commit_id":"cf8c21893a07774c48b6051e48f399905e8421e6","user":{"login":"ahejlsberg","id":4226954,"avatar_url":"https://avatars.githubusercontent.com/u/4226954?v=3","gravatar_id":"","url":"https://api.github.com/users/ahejlsberg","html_url":"https://github.com/ahejlsberg","followers_url":"https://api.github.com/users/ahejlsberg/followers","following_url":"https://api.github.com/users/ahejlsberg/following{/other_user}","gists_url":"https://api.github.com/users/ahejlsberg/gists{/gist_id}","starred_url":"https://api.github.com/users/ahejlsberg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ahejlsberg/subscriptions","organizations_url":"https://api.github.com/users/ahejlsberg/orgs","repos_url":"https://api.github.com/users/ahejlsberg/repos","events_url":"https://api.github.com/users/ahejlsberg/events{/privacy}","received_events_url":"https://api.github.com/users/ahejlsberg/received_events","type":"User","site_admin":false},"body":"Maybe `updateSourceFile`?","created_at":"2015-01-17T01:13:01Z","updated_at":"2015-01-17T01:13:01Z","html_url":"https://github.com/Microsoft/TypeScript/pull/1700#discussion_r23120450","pull_request_url":"https://api.github.com/repos/Microsoft/TypeScript/pulls/1700","_links":{"self":{"href":"https://api.github.com/repos/Microsoft/TypeScript/pulls/comments/23120450"},"html":{"href":"https://github.com/Microsoft/TypeScript/pull/1700#discussion_r23120450"},"pull_request":{"href":"https://api.github.com/repos/Microsoft/TypeScript/pulls/1700"}}},"pull_request":{"url":"https://api.github.com/repos/Microsoft/TypeScript/pulls/1700","id":27547401,"html_url":"https://github.com/Microsoft/TypeScript/pull/1700","diff_url":"https://github.com/Microsoft/TypeScript/pull/1700.diff","patch_url":"https://github.com/Microsoft/TypeScript/pull/1700.patch","issue_url":"https://api.github.com/repos/Microsoft/TypeScript/issues/1700","number":1700,"state":"open","locked":false,"title":"Move function typed properties from the SourceFile to a dedicated functions","user":{"login":"vladima","id":8052307,"avatar_url":"https://avatars.githubusercontent.com/u/8052307?v=3","gravatar_id":"","url":"https://api.github.com/users/vladima","html_url":"https://github.com/vladima","followers_url":"https://api.github.com/users/vladima/followers","following_url":"https://api.github.com/users/vladima/following{/other_user}","gists_url":"https://api.github.com/users/vladima/gists{/gist_id}","starred_url":"https://api.github.com/users/vladima/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vladima/subscriptions","organizations_url":"https://api.github.com/users/vladima/orgs","repos_url":"https://api.github.com/users/vladima/repos","events_url":"https://api.github.com/users/vladima/events{/privacy}","received_events_url":"https://api.github.com/users/vladima/received_events","type":"User","site_admin":false},"body":"Function typed properties on SourceFile are made with closures, for all source files it will keep the parser instance alive. This PR makes SourceFile pure data object -> no closures are required","created_at":"2015-01-17T00:26:24Z","updated_at":"2015-01-17T01:13:01Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3a711b1bec560a6ab8f0edab6887c9243367872d","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/Microsoft/TypeScript/pulls/1700/commits","review_comments_url":"https://api.github.com/repos/Microsoft/TypeScript/pulls/1700/comments","review_comment_url":"https://api.github.com/repos/Microsoft/TypeScript/pulls/comments/{number}","comments_url":"https://api.github.com/repos/Microsoft/TypeScript/issues/1700/comments","statuses_url":"https://api.github.com/repos/Microsoft/TypeScript/statuses/cf8c21893a07774c48b6051e48f399905e8421e6","head":{"label":"Microsoft:noMethodsOnSourceFile","ref":"noMethodsOnSourceFile","sha":"cf8c21893a07774c48b6051e48f399905e8421e6","user":{"login":"Microsoft","id":6154722,"avatar_url":"https://avatars.githubusercontent.com/u/6154722?v=3","gravatar_id":"","url":"https://api.github.com/users/Microsoft","html_url":"https://github.com/Microsoft","followers_url":"https://api.github.com/users/Microsoft/followers","following_url":"https://api.github.com/users/Microsoft/following{/other_user}","gists_url":"https://api.github.com/users/Microsoft/gists{/gist_id}","starred_url":"https://api.github.com/users/Microsoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Microsoft/subscriptions","organizations_url":"https://api.github.com/users/Microsoft/orgs","repos_url":"https://api.github.com/users/Microsoft/repos","events_url":"https://api.github.com/users/Microsoft/events{/privacy}","received_events_url":"https://api.github.com/users/Microsoft/received_events","type":"Organization","site_admin":false},"repo":{"id":20929025,"name":"TypeScript","full_name":"Microsoft/TypeScript","owner":{"login":"Microsoft","id":6154722,"avatar_url":"https://avatars.githubusercontent.com/u/6154722?v=3","gravatar_id":"","url":"https://api.github.com/users/Microsoft","html_url":"https://github.com/Microsoft","followers_url":"https://api.github.com/users/Microsoft/followers","following_url":"https://api.github.com/users/Microsoft/following{/other_user}","gists_url":"https://api.github.com/users/Microsoft/gists{/gist_id}","starred_url":"https://api.github.com/users/Microsoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Microsoft/subscriptions","organizations_url":"https://api.github.com/users/Microsoft/orgs","repos_url":"https://api.github.com/users/Microsoft/repos","events_url":"https://api.github.com/users/Microsoft/events{/privacy}","received_events_url":"https://api.github.com/users/Microsoft/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Microsoft/TypeScript","description":"TypeScript is a superset of JavaScript that compiles to clean JavaScript output.","fork":false,"url":"https://api.github.com/repos/Microsoft/TypeScript","forks_url":"https://api.github.com/repos/Microsoft/TypeScript/forks","keys_url":"https://api.github.com/repos/Microsoft/TypeScript/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Microsoft/TypeScript/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Microsoft/TypeScript/teams","hooks_url":"https://api.github.com/repos/Microsoft/TypeScript/hooks","issue_events_url":"https://api.github.com/repos/Microsoft/TypeScript/issues/events{/number}","events_url":"https://api.github.com/repos/Microsoft/TypeScript/events","assignees_url":"https://api.github.com/repos/Microsoft/TypeScript/assignees{/user}","branches_url":"https://api.github.com/repos/Microsoft/TypeScript/branches{/branch}","tags_url":"https://api.github.com/repos/Microsoft/TypeScript/tags","blobs_url":"https://api.github.com/repos/Microsoft/TypeScript/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Microsoft/TypeScript/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Microsoft/TypeScript/git/refs{/sha}","trees_url":"https://api.github.com/repos/Microsoft/TypeScript/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Microsoft/TypeScript/statuses/{sha}","languages_url":"https://api.github.com/repos/Microsoft/TypeScript/languages","stargazers_url":"https://api.github.com/repos/Microsoft/TypeScript/stargazers","contributors_url":"https://api.github.com/repos/Microsoft/TypeScript/contributors","subscribers_url":"https://api.github.com/repos/Microsoft/TypeScript/subscribers","subscription_url":"https://api.github.com/repos/Microsoft/TypeScript/subscription","commits_url":"https://api.github.com/repos/Microsoft/TypeScript/commits{/sha}","git_commits_url":"https://api.github.com/repos/Microsoft/TypeScript/git/commits{/sha}","comments_url":"https://api.github.com/repos/Microsoft/TypeScript/comments{/number}","issue_comment_url":"https://api.github.com/repos/Microsoft/TypeScript/issues/comments/{number}","contents_url":"https://api.github.com/repos/Microsoft/TypeScript/contents/{+path}","compare_url":"https://api.github.com/repos/Microsoft/TypeScript/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Microsoft/TypeScript/merges","archive_url":"https://api.github.com/repos/Microsoft/TypeScript/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Microsoft/TypeScript/downloads","issues_url":"https://api.github.com/repos/Microsoft/TypeScript/issues{/number}","pulls_url":"https://api.github.com/repos/Microsoft/TypeScript/pulls{/number}","milestones_url":"https://api.github.com/repos/Microsoft/TypeScript/milestones{/number}","notifications_url":"https://api.github.com/repos/Microsoft/TypeScript/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Microsoft/TypeScript/labels{/name}","releases_url":"https://api.github.com/repos/Microsoft/TypeScript/releases{/id}","created_at":"2014-06-17T15:28:39Z","updated_at":"2015-01-17T00:02:43Z","pushed_at":"2015-01-17T00:22:37Z","git_url":"git://github.com/Microsoft/TypeScript.git","ssh_url":"git@github.com:Microsoft/TypeScript.git","clone_url":"https://github.com/Microsoft/TypeScript.git","svn_url":"https://github.com/Microsoft/TypeScript","homepage":"http://www.typescriptlang.org","size":454814,"stargazers_count":3247,"watchers_count":3247,"language":"TypeScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":282,"mirror_url":null,"open_issues_count":409,"forks":282,"open_issues":409,"watchers":3247,"default_branch":"master"}},"base":{"label":"Microsoft:master","ref":"master","sha":"1e8e65c8396c29403023ad52bf3501f13b08f3f4","user":{"login":"Microsoft","id":6154722,"avatar_url":"https://avatars.githubusercontent.com/u/6154722?v=3","gravatar_id":"","url":"https://api.github.com/users/Microsoft","html_url":"https://github.com/Microsoft","followers_url":"https://api.github.com/users/Microsoft/followers","following_url":"https://api.github.com/users/Microsoft/following{/other_user}","gists_url":"https://api.github.com/users/Microsoft/gists{/gist_id}","starred_url":"https://api.github.com/users/Microsoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Microsoft/subscriptions","organizations_url":"https://api.github.com/users/Microsoft/orgs","repos_url":"https://api.github.com/users/Microsoft/repos","events_url":"https://api.github.com/users/Microsoft/events{/privacy}","received_events_url":"https://api.github.com/users/Microsoft/received_events","type":"Organization","site_admin":false},"repo":{"id":20929025,"name":"TypeScript","full_name":"Microsoft/TypeScript","owner":{"login":"Microsoft","id":6154722,"avatar_url":"https://avatars.githubusercontent.com/u/6154722?v=3","gravatar_id":"","url":"https://api.github.com/users/Microsoft","html_url":"https://github.com/Microsoft","followers_url":"https://api.github.com/users/Microsoft/followers","following_url":"https://api.github.com/users/Microsoft/following{/other_user}","gists_url":"https://api.github.com/users/Microsoft/gists{/gist_id}","starred_url":"https://api.github.com/users/Microsoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Microsoft/subscriptions","organizations_url":"https://api.github.com/users/Microsoft/orgs","repos_url":"https://api.github.com/users/Microsoft/repos","events_url":"https://api.github.com/users/Microsoft/events{/privacy}","received_events_url":"https://api.github.com/users/Microsoft/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Microsoft/TypeScript","description":"TypeScript is a superset of JavaScript that compiles to clean JavaScript output.","fork":false,"url":"https://api.github.com/repos/Microsoft/TypeScript","forks_url":"https://api.github.com/repos/Microsoft/TypeScript/forks","keys_url":"https://api.github.com/repos/Microsoft/TypeScript/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Microsoft/TypeScript/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Microsoft/TypeScript/teams","hooks_url":"https://api.github.com/repos/Microsoft/TypeScript/hooks","issue_events_url":"https://api.github.com/repos/Microsoft/TypeScript/issues/events{/number}","events_url":"https://api.github.com/repos/Microsoft/TypeScript/events","assignees_url":"https://api.github.com/repos/Microsoft/TypeScript/assignees{/user}","branches_url":"https://api.github.com/repos/Microsoft/TypeScript/branches{/branch}","tags_url":"https://api.github.com/repos/Microsoft/TypeScript/tags","blobs_url":"https://api.github.com/repos/Microsoft/TypeScript/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Microsoft/TypeScript/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Microsoft/TypeScript/git/refs{/sha}","trees_url":"https://api.github.com/repos/Microsoft/TypeScript/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Microsoft/TypeScript/statuses/{sha}","languages_url":"https://api.github.com/repos/Microsoft/TypeScript/languages","stargazers_url":"https://api.github.com/repos/Microsoft/TypeScript/stargazers","contributors_url":"https://api.github.com/repos/Microsoft/TypeScript/contributors","subscribers_url":"https://api.github.com/repos/Microsoft/TypeScript/subscribers","subscription_url":"https://api.github.com/repos/Microsoft/TypeScript/subscription","commits_url":"https://api.github.com/repos/Microsoft/TypeScript/commits{/sha}","git_commits_url":"https://api.github.com/repos/Microsoft/TypeScript/git/commits{/sha}","comments_url":"https://api.github.com/repos/Microsoft/TypeScript/comments{/number}","issue_comment_url":"https://api.github.com/repos/Microsoft/TypeScript/issues/comments/{number}","contents_url":"https://api.github.com/repos/Microsoft/TypeScript/contents/{+path}","compare_url":"https://api.github.com/repos/Microsoft/TypeScript/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Microsoft/TypeScript/merges","archive_url":"https://api.github.com/repos/Microsoft/TypeScript/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Microsoft/TypeScript/downloads","issues_url":"https://api.github.com/repos/Microsoft/TypeScript/issues{/number}","pulls_url":"https://api.github.com/repos/Microsoft/TypeScript/pulls{/number}","milestones_url":"https://api.github.com/repos/Microsoft/TypeScript/milestones{/number}","notifications_url":"https://api.github.com/repos/Microsoft/TypeScript/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Microsoft/TypeScript/labels{/name}","releases_url":"https://api.github.com/repos/Microsoft/TypeScript/releases{/id}","created_at":"2014-06-17T15:28:39Z","updated_at":"2015-01-17T00:02:43Z","pushed_at":"2015-01-17T00:22:37Z","git_url":"git://github.com/Microsoft/TypeScript.git","ssh_url":"git@github.com:Microsoft/TypeScript.git","clone_url":"https://github.com/Microsoft/TypeScript.git","svn_url":"https://github.com/Microsoft/TypeScript","homepage":"http://www.typescriptlang.org","size":454814,"stargazers_count":3247,"watchers_count":3247,"language":"TypeScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":282,"mirror_url":null,"open_issues_count":409,"forks":282,"open_issues":409,"watchers":3247,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Microsoft/TypeScript/pulls/1700"},"html":{"href":"https://github.com/Microsoft/TypeScript/pull/1700"},"issue":{"href":"https://api.github.com/repos/Microsoft/TypeScript/issues/1700"},"comments":{"href":"https://api.github.com/repos/Microsoft/TypeScript/issues/1700/comments"},"review_comments":{"href":"https://api.github.com/repos/Microsoft/TypeScript/pulls/1700/comments"},"review_comment":{"href":"https://api.github.com/repos/Microsoft/TypeScript/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/Microsoft/TypeScript/pulls/1700/commits"},"statuses":{"href":"https://api.github.com/repos/Microsoft/TypeScript/statuses/cf8c21893a07774c48b6051e48f399905e8421e6"}}}}