{"action":"created","comment":{"url":"https://api.github.com/repos/intellij-rust/intellij-rust/pulls/comments/72656871","id":72656871,"diff_hunk":"@@ -0,0 +1,159 @@\n+package org.rust.lang.core.psi.util\n+\n+import com.intellij.psi.PsiComment\n+import com.intellij.psi.PsiElement\n+import com.intellij.psi.PsiFile\n+import com.intellij.psi.PsiWhiteSpace\n+import com.intellij.psi.util.PsiTreeUtil\n+import com.intellij.psi.util.PsiUtilCore\n+import org.rust.lang.core.psi.RustBlockElement\n+import org.rust.lang.core.psi.RustExprElement\n+import org.rust.lang.core.psi.RustStmtElement\n+\n+inline fun <reified T : PsiElement> PsiElement.parentOfType(strict: Boolean = true, minStartOffset: Int = -1): T? =\n+    PsiTreeUtil.getParentOfType(this, T::class.java, strict, minStartOffset)\n+\n+inline fun <reified T : PsiElement> PsiElement.childOfType(strict: Boolean = true): T? =\n+    PsiTreeUtil.findChildOfType(this, T::class.java, strict)\n+\n+inline fun <reified T : PsiElement> PsiElement.descendentsOfType(): Collection<T> =\n+    PsiTreeUtil.findChildrenOfType(this, T::class.java)\n+\n+\n+/**\n+ * Finds first sibling that is neither comment, nor whitespace before given element.\n+ */\n+fun PsiElement?.getPrevNonCommentSibling(): PsiElement? =\n+    PsiTreeUtil.skipSiblingsBackward(this, PsiWhiteSpace::class.java, PsiComment::class.java)\n+\n+/**\n+ * Finds first sibling that is neither comment, nor whitespace after given element.\n+ */\n+fun PsiElement?.getNextNonCommentSibling(): PsiElement? =\n+    PsiTreeUtil.skipSiblingsForward(this, PsiWhiteSpace::class.java, PsiComment::class.java)\n+\n+\n+/**\n+ * Finds top-most [RustExprElement] within selected range.\n+ * Supports such cases: `ident&lt;if&gt;ier` (or keyword if applicable),\n+ * `&lt;&nbsp;&nbsp;&nbsp;expression&nbsp;&nbsp;&nbsp;&gt;`.\n+ */\n+fun findExpressionInRange(file: PsiFile, startOffset: Int, endOffset: Int): RustExprElement? {\n+    val (element1, element2) = file.getElementRange(startOffset, endOffset) ?: return null\n+\n+    // Get common expression parent.\n+    var parent = PsiTreeUtil.findCommonParent(element1, element2) ?: return null\n+    if (parent !is RustExprElement) {\n+        parent = parent.parentOfType<RustExprElement>() ?: return null\n+    }\n+\n+    // If our parent's deepest first child is element1 and deepest last - element 2,\n+    // then is is completely within selection, so this is our sought expression.\n+    if (element1 == PsiTreeUtil.getDeepestFirst(parent) && element2 == PsiTreeUtil.getDeepestLast(element2)) {\n+        return parent\n+    }\n+\n+    return null\n+}\n+\n+// FIXME: Maybe items are ok?\n+// FIXME: What about macros?\n+/**\n+ * Finds statements (mostly [RustStmtElement]s, [PsiComment]s and [RustExprElement]\n+ * as return expression, doesn't allow attrs and items) within selected range.\n+ */\n+fun findStatementsInRange(file: PsiFile, startOffset: Int, endOffset: Int): Array<out PsiElement> {\n+    var (element1, element2) = file.getElementRange(startOffset, endOffset) ?: return emptyArray()\n+\n+    // Find parent of selected statement list (syntactically only RustBlockElement is possible)\n+    val parent = PsiTreeUtil.findCommonParent(element1, element2)\n+        ?.parentOfType<RustBlockElement>(strict = false)\n+        ?: return emptyArray()\n+\n+    // Find edge direct children of parent within selection.\n+    // element1 has to be first leaf of left child, and element2 - last leaf of right child\n+    val realStartOffset = element1.textRange.startOffset\n+    val realEndOffset = element2.textRange.endOffset\n+\n+    element1 = element1.getTopmostParentInside(parent)\n+    if (realStartOffset != element1.textRange.startOffset) return emptyArray()\n+\n+    element2 = element2.getTopmostParentInside(parent)\n+    if (realEndOffset != element2.textRange.endOffset) return emptyArray()\n+\n+    // Now collect non-whitespace children of parent between (inclusive) element1 and element2\n+    val elements = collectElements(element1, element2.nextSibling) { it !is PsiWhiteSpace }\n+\n+    // Finally check if found elements meet requirements, and return result\n+    elements.forEachIndexed { idx, element ->\n+        if (!(element is RustStmtElement\n+            || (idx == elements.size - 1 && element is RustExprElement)\n+            || element is PsiComment\n+            )) return emptyArray()\n+    }\n+\n+    return elements\n+}\n+\n+\n+/**\n+ * Finds two edge leaf PSI elements within given range.\n+ */\n+private fun PsiFile.getElementRange(startOffset: Int, endOffset: Int): Pair<PsiElement, PsiElement>? {\n+    val element1 = findElementAtIgnoreWhitespaceBefore(startOffset) ?: return null\n+    val element2 = findElementAtIgnoreWhitespaceAfter(endOffset - 1) ?: return null\n+\n+    // Elements have crossed (for instance when selection was inside single whitespace block)\n+    if (element1.textRange.startOffset >= element2.textRange.endOffset) return null\n+\n+    return element1 to element2\n+}\n+\n+/**\n+ * Finds a leaf PSI element at the specified offset from the start of the text range of this node.\n+ * If found element is whitespace, returns its next non-whitespace sibling.\n+ */\n+private fun PsiFile.findElementAtIgnoreWhitespaceBefore(offset: Int): PsiElement? {\n+    val element = findElementAt(offset)\n+    if (element is PsiWhiteSpace) {\n+        return findElementAt(element.getTextRange().endOffset)\n+    }\n+    return element\n+}\n+\n+/**\n+ * Finds a leaf PSI element at the specified offset from the start of the text range of this node.\n+ * If found element is whitespace, returns its previous non-whitespace sibling.\n+ */\n+private fun PsiFile.findElementAtIgnoreWhitespaceAfter(offset: Int): PsiElement? {\n+    val element = findElementAt(offset)\n+    if (element is PsiWhiteSpace) {\n+        return findElementAt(element.getTextRange().startOffset - 1)\n+    }\n+    return element\n+}\n+\n+/**\n+ * Finds child of [parent] of which given element is descendant.\n+ */\n+private fun PsiElement.getTopmostParentInside(parent: PsiElement): PsiElement {\n+    if (parent == this) return this\n+\n+    var element = this\n+    while (parent != element.parent) {\n+        element = element.parent\n+    }\n+    return element\n+}\n+\n+private fun collectElements(start: PsiElement, stop: PsiElement?, pred: (PsiElement) -> Boolean): Array<out PsiElement> {","path":"src/main/kotlin/org/rust/lang/core/psi/util/RustPsiNavigationExtensions.kt","position":147,"original_position":149,"commit_id":"1385e8456a6fff4ffad8c3cceb74c48b0de3ac9c","original_commit_id":"fe34f4d3f6aef89892fb648b685b2e1afb2515ca","user":{"login":"jajakobyly","id":3450050,"avatar_url":"https://avatars.githubusercontent.com/u/3450050?v=3","gravatar_id":"","url":"https://api.github.com/users/jajakobyly","html_url":"https://github.com/jajakobyly","followers_url":"https://api.github.com/users/jajakobyly/followers","following_url":"https://api.github.com/users/jajakobyly/following{/other_user}","gists_url":"https://api.github.com/users/jajakobyly/gists{/gist_id}","starred_url":"https://api.github.com/users/jajakobyly/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jajakobyly/subscriptions","organizations_url":"https://api.github.com/users/jajakobyly/orgs","repos_url":"https://api.github.com/users/jajakobyly/repos","events_url":"https://api.github.com/users/jajakobyly/events{/privacy}","received_events_url":"https://api.github.com/users/jajakobyly/received_events","type":"User","site_admin":false},"body":"similar, but different :smile: \r\n\r\nI tried to introduce some small abstraction over range of PSI elements, but they are not comparable, so we are not able to use Kotlin's ranges :(","created_at":"2016-07-28T16:38:03Z","updated_at":"2016-07-28T16:38:03Z","html_url":"https://github.com/intellij-rust/intellij-rust/pull/561#discussion_r72656871","pull_request_url":"https://api.github.com/repos/intellij-rust/intellij-rust/pulls/561","_links":{"self":{"href":"https://api.github.com/repos/intellij-rust/intellij-rust/pulls/comments/72656871"},"html":{"href":"https://github.com/intellij-rust/intellij-rust/pull/561#discussion_r72656871"},"pull_request":{"href":"https://api.github.com/repos/intellij-rust/intellij-rust/pulls/561"}}},"pull_request":{"url":"https://api.github.com/repos/intellij-rust/intellij-rust/pulls/561","id":79219741,"html_url":"https://github.com/intellij-rust/intellij-rust/pull/561","diff_url":"https://github.com/intellij-rust/intellij-rust/pull/561.diff","patch_url":"https://github.com/intellij-rust/intellij-rust/pull/561.patch","issue_url":"https://api.github.com/repos/intellij-rust/intellij-rust/issues/561","number":561,"state":"open","locked":false,"title":"[WIP] Surrounders","user":{"login":"jajakobyly","id":3450050,"avatar_url":"https://avatars.githubusercontent.com/u/3450050?v=3","gravatar_id":"","url":"https://api.github.com/users/jajakobyly","html_url":"https://github.com/jajakobyly","followers_url":"https://api.github.com/users/jajakobyly/followers","following_url":"https://api.github.com/users/jajakobyly/following{/other_user}","gists_url":"https://api.github.com/users/jajakobyly/gists{/gist_id}","starred_url":"https://api.github.com/users/jajakobyly/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jajakobyly/subscriptions","organizations_url":"https://api.github.com/users/jajakobyly/orgs","repos_url":"https://api.github.com/users/jajakobyly/repos","events_url":"https://api.github.com/users/jajakobyly/events{/privacy}","received_events_url":"https://api.github.com/users/jajakobyly/received_events","type":"User","site_admin":false},"body":"This PR reworks surrounders infrastructure. Rather than relying on live templates, they are based on `Surrounder` interface now - which means they are: more accurate, more capable, more intelligent etc etc. Also features some testing infra, which generalised, might be useful e.g. for postfix completion.\r\n\r\nPlanned surrounders for this PR:\r\n - Expression:\r\n    - [x] `(expr)`\r\n    - [x] `!(expr)` (not available everywhere where applicable, because of missing typing, see #371)\r\n - Statements:\r\n    - [x] `{ }`\r\n    - [ ] `for`\r\n    - [ ] `while`\r\n    - [ ] `loop`\r\n(in other words: everything we did with live templates before)\r\n\r\nHighly inspired on Java, Kotlin, Go, Python surrounders (sorted by level of influence)\r\n\r\ncc #357 \r\ncc @RustSnippets ","created_at":"2016-07-28T15:44:00Z","updated_at":"2016-07-28T16:38:03Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e8f15fefdf3c7c640926fa35596345b350bc99d6","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/intellij-rust/intellij-rust/pulls/561/commits","review_comments_url":"https://api.github.com/repos/intellij-rust/intellij-rust/pulls/561/comments","review_comment_url":"https://api.github.com/repos/intellij-rust/intellij-rust/pulls/comments{/number}","comments_url":"https://api.github.com/repos/intellij-rust/intellij-rust/issues/561/comments","statuses_url":"https://api.github.com/repos/intellij-rust/intellij-rust/statuses/1385e8456a6fff4ffad8c3cceb74c48b0de3ac9c","head":{"label":"jajakobyly:surrounders","ref":"surrounders","sha":"1385e8456a6fff4ffad8c3cceb74c48b0de3ac9c","user":{"login":"jajakobyly","id":3450050,"avatar_url":"https://avatars.githubusercontent.com/u/3450050?v=3","gravatar_id":"","url":"https://api.github.com/users/jajakobyly","html_url":"https://github.com/jajakobyly","followers_url":"https://api.github.com/users/jajakobyly/followers","following_url":"https://api.github.com/users/jajakobyly/following{/other_user}","gists_url":"https://api.github.com/users/jajakobyly/gists{/gist_id}","starred_url":"https://api.github.com/users/jajakobyly/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jajakobyly/subscriptions","organizations_url":"https://api.github.com/users/jajakobyly/orgs","repos_url":"https://api.github.com/users/jajakobyly/repos","events_url":"https://api.github.com/users/jajakobyly/events{/privacy}","received_events_url":"https://api.github.com/users/jajakobyly/received_events","type":"User","site_admin":false},"repo":{"id":51250377,"name":"intellij-rust","full_name":"jajakobyly/intellij-rust","owner":{"login":"jajakobyly","id":3450050,"avatar_url":"https://avatars.githubusercontent.com/u/3450050?v=3","gravatar_id":"","url":"https://api.github.com/users/jajakobyly","html_url":"https://github.com/jajakobyly","followers_url":"https://api.github.com/users/jajakobyly/followers","following_url":"https://api.github.com/users/jajakobyly/following{/other_user}","gists_url":"https://api.github.com/users/jajakobyly/gists{/gist_id}","starred_url":"https://api.github.com/users/jajakobyly/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jajakobyly/subscriptions","organizations_url":"https://api.github.com/users/jajakobyly/orgs","repos_url":"https://api.github.com/users/jajakobyly/repos","events_url":"https://api.github.com/users/jajakobyly/events{/privacy}","received_events_url":"https://api.github.com/users/jajakobyly/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/jajakobyly/intellij-rust","description":"Rust IDE built using the IntelliJ Platform","fork":true,"url":"https://api.github.com/repos/jajakobyly/intellij-rust","forks_url":"https://api.github.com/repos/jajakobyly/intellij-rust/forks","keys_url":"https://api.github.com/repos/jajakobyly/intellij-rust/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jajakobyly/intellij-rust/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jajakobyly/intellij-rust/teams","hooks_url":"https://api.github.com/repos/jajakobyly/intellij-rust/hooks","issue_events_url":"https://api.github.com/repos/jajakobyly/intellij-rust/issues/events{/number}","events_url":"https://api.github.com/repos/jajakobyly/intellij-rust/events","assignees_url":"https://api.github.com/repos/jajakobyly/intellij-rust/assignees{/user}","branches_url":"https://api.github.com/repos/jajakobyly/intellij-rust/branches{/branch}","tags_url":"https://api.github.com/repos/jajakobyly/intellij-rust/tags","blobs_url":"https://api.github.com/repos/jajakobyly/intellij-rust/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jajakobyly/intellij-rust/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jajakobyly/intellij-rust/git/refs{/sha}","trees_url":"https://api.github.com/repos/jajakobyly/intellij-rust/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jajakobyly/intellij-rust/statuses/{sha}","languages_url":"https://api.github.com/repos/jajakobyly/intellij-rust/languages","stargazers_url":"https://api.github.com/repos/jajakobyly/intellij-rust/stargazers","contributors_url":"https://api.github.com/repos/jajakobyly/intellij-rust/contributors","subscribers_url":"https://api.github.com/repos/jajakobyly/intellij-rust/subscribers","subscription_url":"https://api.github.com/repos/jajakobyly/intellij-rust/subscription","commits_url":"https://api.github.com/repos/jajakobyly/intellij-rust/commits{/sha}","git_commits_url":"https://api.github.com/repos/jajakobyly/intellij-rust/git/commits{/sha}","comments_url":"https://api.github.com/repos/jajakobyly/intellij-rust/comments{/number}","issue_comment_url":"https://api.github.com/repos/jajakobyly/intellij-rust/issues/comments{/number}","contents_url":"https://api.github.com/repos/jajakobyly/intellij-rust/contents/{+path}","compare_url":"https://api.github.com/repos/jajakobyly/intellij-rust/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jajakobyly/intellij-rust/merges","archive_url":"https://api.github.com/repos/jajakobyly/intellij-rust/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jajakobyly/intellij-rust/downloads","issues_url":"https://api.github.com/repos/jajakobyly/intellij-rust/issues{/number}","pulls_url":"https://api.github.com/repos/jajakobyly/intellij-rust/pulls{/number}","milestones_url":"https://api.github.com/repos/jajakobyly/intellij-rust/milestones{/number}","notifications_url":"https://api.github.com/repos/jajakobyly/intellij-rust/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jajakobyly/intellij-rust/labels{/name}","releases_url":"https://api.github.com/repos/jajakobyly/intellij-rust/releases{/id}","deployments_url":"https://api.github.com/repos/jajakobyly/intellij-rust/deployments","created_at":"2016-02-07T14:28:01Z","updated_at":"2016-02-07T14:28:02Z","pushed_at":"2016-07-28T16:33:56Z","git_url":"git://github.com/jajakobyly/intellij-rust.git","ssh_url":"git@github.com:jajakobyly/intellij-rust.git","clone_url":"https://github.com/jajakobyly/intellij-rust.git","svn_url":"https://github.com/jajakobyly/intellij-rust","homepage":null,"size":9873,"stargazers_count":0,"watchers_count":0,"language":"Kotlin","has_issues":false,"has_downloads":true,"has_wiki":false,"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":"intellij-rust:master","ref":"master","sha":"6487a51d238ebb1473b81e8f0d75ea3861b5abbb","user":{"login":"intellij-rust","id":16057867,"avatar_url":"https://avatars.githubusercontent.com/u/16057867?v=3","gravatar_id":"","url":"https://api.github.com/users/intellij-rust","html_url":"https://github.com/intellij-rust","followers_url":"https://api.github.com/users/intellij-rust/followers","following_url":"https://api.github.com/users/intellij-rust/following{/other_user}","gists_url":"https://api.github.com/users/intellij-rust/gists{/gist_id}","starred_url":"https://api.github.com/users/intellij-rust/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/intellij-rust/subscriptions","organizations_url":"https://api.github.com/users/intellij-rust/orgs","repos_url":"https://api.github.com/users/intellij-rust/repos","events_url":"https://api.github.com/users/intellij-rust/events{/privacy}","received_events_url":"https://api.github.com/users/intellij-rust/received_events","type":"Organization","site_admin":false},"repo":{"id":42619487,"name":"intellij-rust","full_name":"intellij-rust/intellij-rust","owner":{"login":"intellij-rust","id":16057867,"avatar_url":"https://avatars.githubusercontent.com/u/16057867?v=3","gravatar_id":"","url":"https://api.github.com/users/intellij-rust","html_url":"https://github.com/intellij-rust","followers_url":"https://api.github.com/users/intellij-rust/followers","following_url":"https://api.github.com/users/intellij-rust/following{/other_user}","gists_url":"https://api.github.com/users/intellij-rust/gists{/gist_id}","starred_url":"https://api.github.com/users/intellij-rust/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/intellij-rust/subscriptions","organizations_url":"https://api.github.com/users/intellij-rust/orgs","repos_url":"https://api.github.com/users/intellij-rust/repos","events_url":"https://api.github.com/users/intellij-rust/events{/privacy}","received_events_url":"https://api.github.com/users/intellij-rust/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/intellij-rust/intellij-rust","description":"Rust IDE built using the IntelliJ Platform: https://intellij-rust.github.io/","fork":false,"url":"https://api.github.com/repos/intellij-rust/intellij-rust","forks_url":"https://api.github.com/repos/intellij-rust/intellij-rust/forks","keys_url":"https://api.github.com/repos/intellij-rust/intellij-rust/keys{/key_id}","collaborators_url":"https://api.github.com/repos/intellij-rust/intellij-rust/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/intellij-rust/intellij-rust/teams","hooks_url":"https://api.github.com/repos/intellij-rust/intellij-rust/hooks","issue_events_url":"https://api.github.com/repos/intellij-rust/intellij-rust/issues/events{/number}","events_url":"https://api.github.com/repos/intellij-rust/intellij-rust/events","assignees_url":"https://api.github.com/repos/intellij-rust/intellij-rust/assignees{/user}","branches_url":"https://api.github.com/repos/intellij-rust/intellij-rust/branches{/branch}","tags_url":"https://api.github.com/repos/intellij-rust/intellij-rust/tags","blobs_url":"https://api.github.com/repos/intellij-rust/intellij-rust/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/intellij-rust/intellij-rust/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/intellij-rust/intellij-rust/git/refs{/sha}","trees_url":"https://api.github.com/repos/intellij-rust/intellij-rust/git/trees{/sha}","statuses_url":"https://api.github.com/repos/intellij-rust/intellij-rust/statuses/{sha}","languages_url":"https://api.github.com/repos/intellij-rust/intellij-rust/languages","stargazers_url":"https://api.github.com/repos/intellij-rust/intellij-rust/stargazers","contributors_url":"https://api.github.com/repos/intellij-rust/intellij-rust/contributors","subscribers_url":"https://api.github.com/repos/intellij-rust/intellij-rust/subscribers","subscription_url":"https://api.github.com/repos/intellij-rust/intellij-rust/subscription","commits_url":"https://api.github.com/repos/intellij-rust/intellij-rust/commits{/sha}","git_commits_url":"https://api.github.com/repos/intellij-rust/intellij-rust/git/commits{/sha}","comments_url":"https://api.github.com/repos/intellij-rust/intellij-rust/comments{/number}","issue_comment_url":"https://api.github.com/repos/intellij-rust/intellij-rust/issues/comments{/number}","contents_url":"https://api.github.com/repos/intellij-rust/intellij-rust/contents/{+path}","compare_url":"https://api.github.com/repos/intellij-rust/intellij-rust/compare/{base}...{head}","merges_url":"https://api.github.com/repos/intellij-rust/intellij-rust/merges","archive_url":"https://api.github.com/repos/intellij-rust/intellij-rust/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/intellij-rust/intellij-rust/downloads","issues_url":"https://api.github.com/repos/intellij-rust/intellij-rust/issues{/number}","pulls_url":"https://api.github.com/repos/intellij-rust/intellij-rust/pulls{/number}","milestones_url":"https://api.github.com/repos/intellij-rust/intellij-rust/milestones{/number}","notifications_url":"https://api.github.com/repos/intellij-rust/intellij-rust/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/intellij-rust/intellij-rust/labels{/name}","releases_url":"https://api.github.com/repos/intellij-rust/intellij-rust/releases{/id}","deployments_url":"https://api.github.com/repos/intellij-rust/intellij-rust/deployments","created_at":"2015-09-16T23:44:57Z","updated_at":"2016-07-28T07:43:33Z","pushed_at":"2016-07-28T16:33:57Z","git_url":"git://github.com/intellij-rust/intellij-rust.git","ssh_url":"git@github.com:intellij-rust/intellij-rust.git","clone_url":"https://github.com/intellij-rust/intellij-rust.git","svn_url":"https://github.com/intellij-rust/intellij-rust","homepage":"","size":9905,"stargazers_count":812,"watchers_count":812,"language":"Kotlin","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":66,"mirror_url":null,"open_issues_count":36,"forks":66,"open_issues":36,"watchers":812,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/intellij-rust/intellij-rust/pulls/561"},"html":{"href":"https://github.com/intellij-rust/intellij-rust/pull/561"},"issue":{"href":"https://api.github.com/repos/intellij-rust/intellij-rust/issues/561"},"comments":{"href":"https://api.github.com/repos/intellij-rust/intellij-rust/issues/561/comments"},"review_comments":{"href":"https://api.github.com/repos/intellij-rust/intellij-rust/pulls/561/comments"},"review_comment":{"href":"https://api.github.com/repos/intellij-rust/intellij-rust/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/intellij-rust/intellij-rust/pulls/561/commits"},"statuses":{"href":"https://api.github.com/repos/intellij-rust/intellij-rust/statuses/1385e8456a6fff4ffad8c3cceb74c48b0de3ac9c"}}}}
{"actor":{"display_login":"jajakobyly"}}