{"action":"created","comment":{"url":"https://api.github.com/repos/flutter/flutter-intellij/pulls/comments/182317029","pull_request_review_id":113086167,"id":182317029,"diff_hunk":"@@ -119,27 +129,250 @@ public FlutterApp getApp() {\n     return debugProcess.getApp();\n   }\n \n-  public CompletableFuture<XSourcePosition> getPropertyLocation(InstanceRef instanceRef, String name) {\n-    return getInstance(instanceRef).thenComposeAsync((Instance instance) -> getPropertyLocationHelper(instance.getClassRef(), name));\n+  public ObjectGroup createObjectGroup(String debugName) {\n+    return new ObjectGroup(debugName);\n   }\n \n-  public CompletableFuture<XSourcePosition> getPropertyLocationHelper(ClassRef classRef, String name) {\n-    return inspectorLibrary.getClass(classRef).thenComposeAsync((ClassObj clazz) -> {\n-      for (FuncRef f : clazz.getFunctions()) {\n-        // TODO(pq): check for private properties that match name.\n-        if (f.getName().equals(name)) {\n-          return inspectorLibrary.getFunc(f).thenComposeAsync((Func func) -> {\n-            final SourceLocation location = func.getLocation();\n-            return inspectorLibrary.getSourcePosition(debugProcess, location.getScript(), location.getTokenPos());\n+  private EvalOnDartLibrary getInspectorLibrary() {\n+    return inspectorLibrary;\n+  }\n+\n+  @Override\n+  public void dispose() {\n+    inspectorLibrary.dispose();\n+  }\n+\n+  public void forceRefresh() {\n+    for (InspectorServiceClient client : clients) {\n+      client.onForceRefresh();\n+    }\n+  }\n+\n+  private void notifySelectionChanged() {\n+    ApplicationManager.getApplication().invokeLater(() -> {\n+      for (InspectorServiceClient client : clients) {\n+        client.onInspectorSelectionChanged();\n+      }\n+    });\n+  }\n+\n+  public void addClient(InspectorServiceClient client) {\n+    clients.add(client);\n+  }\n+\n+  private void onVmServiceReceived(String streamId, Event event) {\n+    switch (streamId) {\n+      case VmService.DEBUG_STREAM_ID: {\n+        if (event.getKind() == EventKind.Inspect) {\n+          // Make sure the WidgetInspector on the device switches to show the inspected object\n+          // if the inspected object is a Widget or RenderObject.\n+\n+          // We create a dummy object group as this particular operation\n+          // doesn't actually require an object group.\n+          createObjectGroup(\"dummy\").setSelection(event.getInspectee(), true);\n+          // Update the UI in IntelliJ.\n+          notifySelectionChanged();\n+        }\n+        break;\n+      }\n+      case VmService.EXTENSION_STREAM_ID: {\n+        if (\"Flutter.Frame\".equals(event.getExtensionKind())) {\n+          ApplicationManager.getApplication().invokeLater(() -> {\n+            for (InspectorServiceClient client : clients) {\n+              client.onFlutterFrame();\n+            }\n           });\n         }\n+        break;\n+      }\n+      default:\n+    }\n+  }\n+\n+  /**\n+   * If the widget tree is not ready, the application should wait for the next\n+   * Flutter.Frame event before attempting to display the widget tree. If the\n+   * application is ready, the next Flutter.Frame event may never come as no\n+   * new frames will be triggered to draw unless something changes in the UI.\n+   */\n+  public CompletableFuture<Boolean> isWidgetTreeReady() {\n+    if (isDaemonApiSupported) {\n+      return invokeServiceMethodDaemonNoGroup(\"isWidgetTreeReady\", new HashMap<>())\n+        .thenApplyAsync((JsonElement element) -> element.getAsBoolean() == true);\n+    }\n+    else {\n+      return invokeServiceMethodObservatoryNoGroup(\"isWidgetTreeReady\")\n+        .thenApplyAsync((InstanceRef ref) -> \"true\".equals(ref.getValueAsString()));\n+    }\n+  }\n+\n+  CompletableFuture<JsonElement> invokeServiceMethodDaemonNoGroup(String methodName, List<String> args) {\n+    final Map<String, Object> params = new HashMap<>();\n+    for (int i = 0; i < args.size(); ++i) {\n+      params.put(\"arg\" + i, args.get(i));\n+    }\n+    return invokeServiceMethodDaemonNoGroup(methodName, params);\n+  }\n+\n+\n+  public CompletableFuture<Void> setPubRootDirectories(List<String> rootDirectories) {\n+    // TODO(jacobr): remove call to hasServiceMethod(\"setPubRootDirectories\") after\n+    // the `setPubRootDirectories` method has been in two revs of the Flutter Alpha\n+    // channel. The feature is expected to have landed in the Flutter dev\n+    // chanel on March 2, 2018.\n+    if (!hasServiceMethod(\"setPubRootDirectories\")) {\n+      return CompletableFuture.completedFuture(null);\n+    }\n+\n+    if (isDaemonApiSupported) {\n+      return invokeServiceMethodDaemonNoGroup(\"setPubRootDirectories\", rootDirectories).thenApplyAsync((ignored) -> null);\n+    }\n+    else {\n+      // TODO(jacobr): remove this call as soon as\n+      // `ext.flutter.inspector.*` has been in two revs of the Flutter Beta\n+      // channel. The feature landed in the Flutter dev chanel on\n+      // April 16, 2018.\n+      final JsonArray jsonArray = new JsonArray();\n+      for (String rootDirectory : rootDirectories) {\n+        jsonArray.add(rootDirectory);\n       }\n-      final ClassRef superClass = clazz.getSuperClass();\n-      return superClass == null ? CompletableFuture.completedFuture(null) : getPropertyLocationHelper(superClass, name);\n+      return getInspectorLibrary().eval(\n+        \"WidgetInspectorService.instance.setPubRootDirectories(\" + new Gson().toJson(jsonArray) + \")\", null, null)\n+        .thenApplyAsync((instance) -> null);\n+    }\n+  }\n+\n+  CompletableFuture<InstanceRef> invokeServiceMethodObservatoryNoGroup(String methodName) {\n+    return getInspectorLibrary().eval(\"WidgetInspectorService.instance.\" + methodName + \"()\", null, null);\n+  }\n+\n+  CompletableFuture<JsonElement> invokeServiceMethodDaemonNoGroup(String methodName, Map<String, Object> params) {\n+    return getApp().callServiceExtension(\"ext.flutter.inspector.\" + methodName, params).thenApply((JsonObject json) -> {\n+      if (json.has(\"errorMessage\")) {\n+        String message = json.get(\"errorMessage\").getAsString();\n+        throw new RuntimeException(methodName + \" -- \" + message);\n+      }\n+      return json.get(\"result\");\n     });\n   }\n \n+// TODO(jacobr): fix indent of this class before landing.\n+/**\n+ * Class managing a group of inspector objects that can be freed by\n+ * a single call to dispose().\n+ * After dispose is called, all pending requests made with the ObjectGroup\n+ * will be skipped. This means that clients should not have to write any\n+ * special logic to handle orphaned requests.\n+ *\n+ * safeWhenComplete is the recommended way to await futures returned by the\n+ * ObjectGroup as with that method the callback will be skipped if the\n+ * ObjectGroup is disposed making it easy to get the correct behavior of\n+ * skipping orphaned requests. Otherwise, code needs to handle getting back\n+ * futures that return null values for requests from disposed ObjectGroup\n+ * objects.\n+ */\n+public class ObjectGroup implements Disposable {\n+  /**\n+   * Object group all objects in this arena are allocated with.\n+   */\n+  final String groupName;\n+\n+  volatile boolean disposed;\n+  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();\n+\n+  private ObjectGroup(String debugName) {\n+    this.groupName = debugName + \"_\" + nextGroupId;\n+    nextGroupId++;\n+  }\n+\n+  /**\n+   * Once an ObjecGroup has been disposed, all methods returning\n+   * DiagnosticsNode objects will return a placeholder dummy node and all methods\n+   * returning lists or maps will return empty lists and all other methods will\n+   * return null. Generally code should not be written to never call methods on","path":"src/io/flutter/inspector/InspectorService.java","position":262,"original_position":262,"commit_id":"117f4f812f2e60ba7cf5a38d2ff5d3c61f246481","original_commit_id":"117f4f812f2e60ba7cf5a38d2ff5d3c61f246481","user":{"login":"jacob314","id":1226812,"avatar_url":"https://avatars1.githubusercontent.com/u/1226812?v=4","gravatar_id":"","url":"https://api.github.com/users/jacob314","html_url":"https://github.com/jacob314","followers_url":"https://api.github.com/users/jacob314/followers","following_url":"https://api.github.com/users/jacob314/following{/other_user}","gists_url":"https://api.github.com/users/jacob314/gists{/gist_id}","starred_url":"https://api.github.com/users/jacob314/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jacob314/subscriptions","organizations_url":"https://api.github.com/users/jacob314/orgs","repos_url":"https://api.github.com/users/jacob314/repos","events_url":"https://api.github.com/users/jacob314/events{/privacy}","received_events_url":"https://api.github.com/users/jacob314/received_events","type":"User","site_admin":false},"body":"cleaned up this comment","created_at":"2018-04-18T06:06:18Z","updated_at":"2018-04-18T06:06:18Z","html_url":"https://github.com/flutter/flutter-intellij/pull/2094#discussion_r182317029","pull_request_url":"https://api.github.com/repos/flutter/flutter-intellij/pulls/2094","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/flutter/flutter-intellij/pulls/comments/182317029"},"html":{"href":"https://github.com/flutter/flutter-intellij/pull/2094#discussion_r182317029"},"pull_request":{"href":"https://api.github.com/repos/flutter/flutter-intellij/pulls/2094"}},"in_reply_to_id":182289863},"pull_request":{"url":"https://api.github.com/repos/flutter/flutter-intellij/pulls/2094","id":182240070,"html_url":"https://github.com/flutter/flutter-intellij/pull/2094","diff_url":"https://github.com/flutter/flutter-intellij/pull/2094.diff","patch_url":"https://github.com/flutter/flutter-intellij/pull/2094.patch","issue_url":"https://api.github.com/repos/flutter/flutter-intellij/issues/2094","number":2094,"state":"open","locked":false,"title":"Details subtree review","user":{"login":"jacob314","id":1226812,"avatar_url":"https://avatars1.githubusercontent.com/u/1226812?v=4","gravatar_id":"","url":"https://api.github.com/users/jacob314","html_url":"https://github.com/jacob314","followers_url":"https://api.github.com/users/jacob314/followers","following_url":"https://api.github.com/users/jacob314/following{/other_user}","gists_url":"https://api.github.com/users/jacob314/gists{/gist_id}","starred_url":"https://api.github.com/users/jacob314/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jacob314/subscriptions","organizations_url":"https://api.github.com/users/jacob314/orgs","repos_url":"https://api.github.com/users/jacob314/repos","events_url":"https://api.github.com/users/jacob314/events{/privacy}","received_events_url":"https://api.github.com/users/jacob314/received_events","type":"User","site_admin":false},"body":"My apologies on the size of this commit. The changes to InspectorPanel escalated to the point where the diff is not very readable at points.\r\nTo test locally, patch https://github.com/flutter/flutter/pull/16638 into your flutter build.\r\nIf you don't do that, everything will work and you will see the custom tree line drawing but you won't see a details-summary view.\r\n\r\nTLDR for InspectorService is all methods that were on InspectorService are now on the InspectorService.ObjectGroup class so that lifecycles of object references can be managed and there are now tons of checks to make sure we stop chaining futures as soon as the ObjectGroup is disposed. \r\nThe code should now never leak memory on the device instead of leaking all the objects referenced by the inspector. This is important as the inspector is now referencing a ton more objects.\r\n\r\nChanges:\r\nDetail summary tree (when --track-widget-creation is set).\r\nAnimated auto-horizontal scroll.\r\nAnimated scroll to selected tree node.\r\nProper memory management of object lifecycles so we don't cause the device to leak a ton of memory.\r\nThe concept of an ObjectGroup which existed in the protocol but wasn't really exposed on the IntelliJ is used extensively to achieve that goal. \r\n\r\nCustom tree view rendering with lines between parents and children including dashed lines for offstage children.\r\nDisplay of all properties inline in the tree view with the same tooltips and custom rendering as for the table view.\r\nWe are now aggressive at shutting down the inspector tree when you tab away from it rebuilding the tree from scratch when you tab back. This means we no longer pay the cost for the render tree when users rarely ever tab to it.\r\nFixes for out of order execution bugs that are now an issue given we are disposing object groups.\r\n\r\nLots of extra checks to make sure we dump the value of a future returned if the object group is disposed.\r\n\r\nExtra menu item to trigger a UI refresh and an extra menu item to turn off the auto horizontal scrolling.","created_at":"2018-04-17T17:29:03Z","updated_at":"2018-04-18T06:06:18Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3fa18ee8c5a2a1d5ab71e448f5e85a6a302ff9b9","assignee":null,"assignees":[],"requested_reviewers":[{"login":"devoncarew","id":1269969,"avatar_url":"https://avatars0.githubusercontent.com/u/1269969?v=4","gravatar_id":"","url":"https://api.github.com/users/devoncarew","html_url":"https://github.com/devoncarew","followers_url":"https://api.github.com/users/devoncarew/followers","following_url":"https://api.github.com/users/devoncarew/following{/other_user}","gists_url":"https://api.github.com/users/devoncarew/gists{/gist_id}","starred_url":"https://api.github.com/users/devoncarew/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/devoncarew/subscriptions","organizations_url":"https://api.github.com/users/devoncarew/orgs","repos_url":"https://api.github.com/users/devoncarew/repos","events_url":"https://api.github.com/users/devoncarew/events{/privacy}","received_events_url":"https://api.github.com/users/devoncarew/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":487496526,"url":"https://api.github.com/repos/flutter/flutter-intellij/labels/cla:%20yes","name":"cla: yes","color":"0e8a16","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/flutter/flutter-intellij/pulls/2094/commits","review_comments_url":"https://api.github.com/repos/flutter/flutter-intellij/pulls/2094/comments","review_comment_url":"https://api.github.com/repos/flutter/flutter-intellij/pulls/comments{/number}","comments_url":"https://api.github.com/repos/flutter/flutter-intellij/issues/2094/comments","statuses_url":"https://api.github.com/repos/flutter/flutter-intellij/statuses/117f4f812f2e60ba7cf5a38d2ff5d3c61f246481","head":{"label":"jacob314:DETAILS_SUBTREE_REVIEW","ref":"DETAILS_SUBTREE_REVIEW","sha":"117f4f812f2e60ba7cf5a38d2ff5d3c61f246481","user":{"login":"jacob314","id":1226812,"avatar_url":"https://avatars1.githubusercontent.com/u/1226812?v=4","gravatar_id":"","url":"https://api.github.com/users/jacob314","html_url":"https://github.com/jacob314","followers_url":"https://api.github.com/users/jacob314/followers","following_url":"https://api.github.com/users/jacob314/following{/other_user}","gists_url":"https://api.github.com/users/jacob314/gists{/gist_id}","starred_url":"https://api.github.com/users/jacob314/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jacob314/subscriptions","organizations_url":"https://api.github.com/users/jacob314/orgs","repos_url":"https://api.github.com/users/jacob314/repos","events_url":"https://api.github.com/users/jacob314/events{/privacy}","received_events_url":"https://api.github.com/users/jacob314/received_events","type":"User","site_admin":false},"repo":{"id":112400909,"name":"flutter-intellij","full_name":"jacob314/flutter-intellij","owner":{"login":"jacob314","id":1226812,"avatar_url":"https://avatars1.githubusercontent.com/u/1226812?v=4","gravatar_id":"","url":"https://api.github.com/users/jacob314","html_url":"https://github.com/jacob314","followers_url":"https://api.github.com/users/jacob314/followers","following_url":"https://api.github.com/users/jacob314/following{/other_user}","gists_url":"https://api.github.com/users/jacob314/gists{/gist_id}","starred_url":"https://api.github.com/users/jacob314/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jacob314/subscriptions","organizations_url":"https://api.github.com/users/jacob314/orgs","repos_url":"https://api.github.com/users/jacob314/repos","events_url":"https://api.github.com/users/jacob314/events{/privacy}","received_events_url":"https://api.github.com/users/jacob314/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/jacob314/flutter-intellij","description":"Flutter makes it easy and fast to build beautiful mobile apps.","fork":true,"url":"https://api.github.com/repos/jacob314/flutter-intellij","forks_url":"https://api.github.com/repos/jacob314/flutter-intellij/forks","keys_url":"https://api.github.com/repos/jacob314/flutter-intellij/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jacob314/flutter-intellij/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jacob314/flutter-intellij/teams","hooks_url":"https://api.github.com/repos/jacob314/flutter-intellij/hooks","issue_events_url":"https://api.github.com/repos/jacob314/flutter-intellij/issues/events{/number}","events_url":"https://api.github.com/repos/jacob314/flutter-intellij/events","assignees_url":"https://api.github.com/repos/jacob314/flutter-intellij/assignees{/user}","branches_url":"https://api.github.com/repos/jacob314/flutter-intellij/branches{/branch}","tags_url":"https://api.github.com/repos/jacob314/flutter-intellij/tags","blobs_url":"https://api.github.com/repos/jacob314/flutter-intellij/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jacob314/flutter-intellij/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jacob314/flutter-intellij/git/refs{/sha}","trees_url":"https://api.github.com/repos/jacob314/flutter-intellij/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jacob314/flutter-intellij/statuses/{sha}","languages_url":"https://api.github.com/repos/jacob314/flutter-intellij/languages","stargazers_url":"https://api.github.com/repos/jacob314/flutter-intellij/stargazers","contributors_url":"https://api.github.com/repos/jacob314/flutter-intellij/contributors","subscribers_url":"https://api.github.com/repos/jacob314/flutter-intellij/subscribers","subscription_url":"https://api.github.com/repos/jacob314/flutter-intellij/subscription","commits_url":"https://api.github.com/repos/jacob314/flutter-intellij/commits{/sha}","git_commits_url":"https://api.github.com/repos/jacob314/flutter-intellij/git/commits{/sha}","comments_url":"https://api.github.com/repos/jacob314/flutter-intellij/comments{/number}","issue_comment_url":"https://api.github.com/repos/jacob314/flutter-intellij/issues/comments{/number}","contents_url":"https://api.github.com/repos/jacob314/flutter-intellij/contents/{+path}","compare_url":"https://api.github.com/repos/jacob314/flutter-intellij/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jacob314/flutter-intellij/merges","archive_url":"https://api.github.com/repos/jacob314/flutter-intellij/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jacob314/flutter-intellij/downloads","issues_url":"https://api.github.com/repos/jacob314/flutter-intellij/issues{/number}","pulls_url":"https://api.github.com/repos/jacob314/flutter-intellij/pulls{/number}","milestones_url":"https://api.github.com/repos/jacob314/flutter-intellij/milestones{/number}","notifications_url":"https://api.github.com/repos/jacob314/flutter-intellij/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jacob314/flutter-intellij/labels{/name}","releases_url":"https://api.github.com/repos/jacob314/flutter-intellij/releases{/id}","deployments_url":"https://api.github.com/repos/jacob314/flutter-intellij/deployments","created_at":"2017-11-28T23:24:05Z","updated_at":"2017-11-28T23:24:08Z","pushed_at":"2018-04-17T21:56:43Z","git_url":"git://github.com/jacob314/flutter-intellij.git","ssh_url":"git@github.com:jacob314/flutter-intellij.git","clone_url":"https://github.com/jacob314/flutter-intellij.git","svn_url":"https://github.com/jacob314/flutter-intellij","homepage":"https://flutter.io/intellij-ide","size":15691,"stargazers_count":0,"watchers_count":0,"language":"Java","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":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"flutter:master","ref":"master","sha":"3f008848622e0b577cc4416a572b5cb6dff6510a","user":{"login":"flutter","id":14101776,"avatar_url":"https://avatars3.githubusercontent.com/u/14101776?v=4","gravatar_id":"","url":"https://api.github.com/users/flutter","html_url":"https://github.com/flutter","followers_url":"https://api.github.com/users/flutter/followers","following_url":"https://api.github.com/users/flutter/following{/other_user}","gists_url":"https://api.github.com/users/flutter/gists{/gist_id}","starred_url":"https://api.github.com/users/flutter/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/flutter/subscriptions","organizations_url":"https://api.github.com/users/flutter/orgs","repos_url":"https://api.github.com/users/flutter/repos","events_url":"https://api.github.com/users/flutter/events{/privacy}","received_events_url":"https://api.github.com/users/flutter/received_events","type":"Organization","site_admin":false},"repo":{"id":64172164,"name":"flutter-intellij","full_name":"flutter/flutter-intellij","owner":{"login":"flutter","id":14101776,"avatar_url":"https://avatars3.githubusercontent.com/u/14101776?v=4","gravatar_id":"","url":"https://api.github.com/users/flutter","html_url":"https://github.com/flutter","followers_url":"https://api.github.com/users/flutter/followers","following_url":"https://api.github.com/users/flutter/following{/other_user}","gists_url":"https://api.github.com/users/flutter/gists{/gist_id}","starred_url":"https://api.github.com/users/flutter/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/flutter/subscriptions","organizations_url":"https://api.github.com/users/flutter/orgs","repos_url":"https://api.github.com/users/flutter/repos","events_url":"https://api.github.com/users/flutter/events{/privacy}","received_events_url":"https://api.github.com/users/flutter/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/flutter/flutter-intellij","description":"Flutter makes it easy and fast to build beautiful mobile apps.","fork":false,"url":"https://api.github.com/repos/flutter/flutter-intellij","forks_url":"https://api.github.com/repos/flutter/flutter-intellij/forks","keys_url":"https://api.github.com/repos/flutter/flutter-intellij/keys{/key_id}","collaborators_url":"https://api.github.com/repos/flutter/flutter-intellij/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/flutter/flutter-intellij/teams","hooks_url":"https://api.github.com/repos/flutter/flutter-intellij/hooks","issue_events_url":"https://api.github.com/repos/flutter/flutter-intellij/issues/events{/number}","events_url":"https://api.github.com/repos/flutter/flutter-intellij/events","assignees_url":"https://api.github.com/repos/flutter/flutter-intellij/assignees{/user}","branches_url":"https://api.github.com/repos/flutter/flutter-intellij/branches{/branch}","tags_url":"https://api.github.com/repos/flutter/flutter-intellij/tags","blobs_url":"https://api.github.com/repos/flutter/flutter-intellij/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/flutter/flutter-intellij/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/flutter/flutter-intellij/git/refs{/sha}","trees_url":"https://api.github.com/repos/flutter/flutter-intellij/git/trees{/sha}","statuses_url":"https://api.github.com/repos/flutter/flutter-intellij/statuses/{sha}","languages_url":"https://api.github.com/repos/flutter/flutter-intellij/languages","stargazers_url":"https://api.github.com/repos/flutter/flutter-intellij/stargazers","contributors_url":"https://api.github.com/repos/flutter/flutter-intellij/contributors","subscribers_url":"https://api.github.com/repos/flutter/flutter-intellij/subscribers","subscription_url":"https://api.github.com/repos/flutter/flutter-intellij/subscription","commits_url":"https://api.github.com/repos/flutter/flutter-intellij/commits{/sha}","git_commits_url":"https://api.github.com/repos/flutter/flutter-intellij/git/commits{/sha}","comments_url":"https://api.github.com/repos/flutter/flutter-intellij/comments{/number}","issue_comment_url":"https://api.github.com/repos/flutter/flutter-intellij/issues/comments{/number}","contents_url":"https://api.github.com/repos/flutter/flutter-intellij/contents/{+path}","compare_url":"https://api.github.com/repos/flutter/flutter-intellij/compare/{base}...{head}","merges_url":"https://api.github.com/repos/flutter/flutter-intellij/merges","archive_url":"https://api.github.com/repos/flutter/flutter-intellij/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/flutter/flutter-intellij/downloads","issues_url":"https://api.github.com/repos/flutter/flutter-intellij/issues{/number}","pulls_url":"https://api.github.com/repos/flutter/flutter-intellij/pulls{/number}","milestones_url":"https://api.github.com/repos/flutter/flutter-intellij/milestones{/number}","notifications_url":"https://api.github.com/repos/flutter/flutter-intellij/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/flutter/flutter-intellij/labels{/name}","releases_url":"https://api.github.com/repos/flutter/flutter-intellij/releases{/id}","deployments_url":"https://api.github.com/repos/flutter/flutter-intellij/deployments","created_at":"2016-07-25T22:31:03Z","updated_at":"2018-04-17T21:44:04Z","pushed_at":"2018-04-17T21:56:44Z","git_url":"git://github.com/flutter/flutter-intellij.git","ssh_url":"git@github.com:flutter/flutter-intellij.git","clone_url":"https://github.com/flutter/flutter-intellij.git","svn_url":"https://github.com/flutter/flutter-intellij","homepage":"https://flutter.io/using-ide/","size":15486,"stargazers_count":235,"watchers_count":235,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":36,"mirror_url":null,"archived":false,"open_issues_count":166,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":36,"open_issues":166,"watchers":235,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/flutter/flutter-intellij/pulls/2094"},"html":{"href":"https://github.com/flutter/flutter-intellij/pull/2094"},"issue":{"href":"https://api.github.com/repos/flutter/flutter-intellij/issues/2094"},"comments":{"href":"https://api.github.com/repos/flutter/flutter-intellij/issues/2094/comments"},"review_comments":{"href":"https://api.github.com/repos/flutter/flutter-intellij/pulls/2094/comments"},"review_comment":{"href":"https://api.github.com/repos/flutter/flutter-intellij/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/flutter/flutter-intellij/pulls/2094/commits"},"statuses":{"href":"https://api.github.com/repos/flutter/flutter-intellij/statuses/117f4f812f2e60ba7cf5a38d2ff5d3c61f246481"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"jacob314"}}