{"action":"created","comment":{"url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/pulls/comments/65096061","id":65096061,"diff_hunk":"@@ -0,0 +1,502 @@\n+/*\n+ * Copyright 2013-2016 Sergey Ignatov, Alexander Zolotov, Florin Patan\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\");\n+ * you may not use this file except in compliance with the License.\n+ * You may obtain a copy of the License at\n+ *\n+ * http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the License for the specific language governing permissions and\n+ * limitations under the License.\n+ */\n+\n+package com.goide.inspections;\n+\n+import com.goide.psi.*;\n+import com.goide.psi.impl.GoTypeUtil;\n+import com.intellij.codeInspection.ProblemHighlightType;\n+import com.intellij.codeInspection.ProblemsHolder;\n+import com.intellij.openapi.util.Couple;\n+import com.intellij.openapi.util.Pair;\n+import com.intellij.openapi.util.text.StringUtil;\n+import com.intellij.psi.PsiElement;\n+import com.intellij.psi.PsiReference;\n+import com.intellij.util.containers.ContainerUtil;\n+import org.jetbrains.annotations.NotNull;\n+import org.jetbrains.annotations.Nullable;\n+\n+import java.util.ArrayList;\n+import java.util.Collections;\n+import java.util.List;\n+import java.util.Map;\n+\n+import static com.goide.GoConstants.TESTING_PATH;\n+import static com.goide.inspections.GoPlaceholderChecker.PrintfArgType.*;\n+\n+public class GoPlaceholderChecker {\n+\n+  // This holds the name of the known formatting functions and position of the string to be formatted\n+  public static final Map<String, Integer> FORMATTING_FUNCTIONS = ContainerUtil.newHashMap(\n+    Pair.pair(\"errorf\", 0),\n+    Pair.pair(\"fatalf\", 0),\n+    Pair.pair(\"fprintf\", 1),\n+    Pair.pair(\"fscanf\", 1),\n+    Pair.pair(\"logf\", 0),\n+    Pair.pair(\"panicf\", 0),\n+    Pair.pair(\"printf\", 0),\n+    Pair.pair(\"scanf\", 0),\n+    Pair.pair(\"skipf\", 0),\n+    Pair.pair(\"sprintf\", 0),\n+    Pair.pair(\"sscanf\", 1));\n+\n+  public static final List<String> PRINT_FUNCTIONS = ContainerUtil.newArrayList(\n+    \"error\",\n+    \"error\",\n+    \"fatal\",\n+    \"fprint\",\n+    \"fprintln\",\n+    \"log\",\n+    \"panic\",\n+    \"panicln\",\n+    \"print\",\n+    \"println\",\n+    \"sprint\",\n+    \"sprintln\"\n+  );\n+\n+  // The types of expressions a printf verb accepts. It is a bitmask.\n+  protected enum PrintfArgType {\n+    argBool(1),\n+    argInt(2),\n+    argRune(3),\n+    argString(4),\n+    argFloat(5),\n+    argComplex(6),\n+    argPointer(7),\n+    anyType(-1);\n+\n+    private int myVal;\n+\n+    PrintfArgType(int val) {\n+      myVal = val;\n+    }\n+\n+    public int getValue() {\n+      return myVal;\n+    }\n+  }\n+\n+  private enum PrintVerb {\n+    Percent(Couple.of('%', Couple.of(\"\", 0))),\n+    b(Couple.of('b', Couple.of(\" -+.0\", argInt.getValue() | argFloat.getValue() | argComplex.getValue()))),\n+    c(Couple.of('c', Couple.of(\"-\", argRune.getValue() | argInt.getValue()))),\n+    d(Couple.of('d', Couple.of(\" -+.0\", argInt.getValue()))),\n+    e(Couple.of('e', Couple.of(\" -+.0\", argFloat.getValue() | argComplex.getValue()))),\n+    E(Couple.of('E', Couple.of(\" -+.0\", argFloat.getValue() | argComplex.getValue()))),\n+    f(Couple.of('f', Couple.of(\" -+.0\", argFloat.getValue() | argComplex.getValue()))),\n+    F(Couple.of('F', Couple.of(\" -+.0\", argFloat.getValue() | argComplex.getValue()))),\n+    g(Couple.of('g', Couple.of(\" -+.0\", argFloat.getValue() | argComplex.getValue()))),\n+    G(Couple.of('G', Couple.of(\" -+.0\", argFloat.getValue() | argComplex.getValue()))),\n+    o(Couple.of('o', Couple.of(\" -+.0#\", argInt.getValue()))),\n+    p(Couple.of('p', Couple.of(\"-#\", argPointer.getValue()))),\n+    q(Couple.of('q', Couple.of(\" -+.0#\", argRune.getValue() | argInt.getValue() | argString.getValue()))),\n+    s(Couple.of('s', Couple.of(\" -+.0\", argString.getValue()))),\n+    t(Couple.of('t', Couple.of(\"-\", argBool.getValue()))),\n+    T(Couple.of('T', Couple.of(\"-\", anyType.getValue()))),\n+    U(Couple.of('U', Couple.of(\"-#\", argRune.getValue() | argInt.getValue()))),\n+    V(Couple.of('v', Couple.of(\" -+.0#\", anyType.getValue()))),\n+    x(Couple.of('x', Couple.of(\" -+.0#\", argRune.getValue() | argInt.getValue() | argString.getValue()))),\n+    X(Couple.of('X', Couple.of(\" -+.0#\", argRune.getValue() | argInt.getValue() | argString.getValue())));\n+\n+    private Couple myVal;\n+\n+    PrintVerb(Couple val) {\n+      myVal = val;\n+    }\n+\n+    public Couple getValue() {\n+      return myVal;\n+    }\n+\n+    public char getVerb() {\n+      return (char)myVal.getFirst();\n+    }\n+\n+    @NotNull\n+    public String getFlags() {\n+      return (String)((Couple)myVal.getSecond()).getFirst();\n+    }\n+\n+    public int getMask() {\n+      return (int)((Couple)myVal.getSecond()).getSecond();\n+    }\n+\n+    @Nullable\n+    public static PrintVerb getByVerb(char verb) {\n+      for (PrintVerb v : values()) {\n+        if (verb == v.getVerb()) return v;\n+      }\n+      return null;\n+    }\n+  }\n+\n+  private ProblemsHolder myProblemsHolder;\n+  private GoCallExpr myCallExpr;\n+  private GoFunctionOrMethodDeclaration myDeclaration;\n+\n+  public GoPlaceholderChecker(ProblemsHolder problemsHolder, GoCallExpr callExpr, GoFunctionOrMethodDeclaration declaration) {\n+    myProblemsHolder = problemsHolder;\n+    myCallExpr = callExpr;\n+    myDeclaration = declaration;\n+  }\n+\n+  public void checkPrint() {\n+    // TODO florin: Implement the print function checking\n+    // Ref code: https://github.com/golang/go/blob/79f7ccf2c3931745aeb97c5c985b6ac7b44befb4/src/cmd/vet/print.go#L587\n+  }\n+\n+  public void checkPrintf() {\n+    int placeholderPosition = getPlaceholderPosition(myDeclaration);\n+    List<GoExpression> arguments = myCallExpr.getArgumentList().getExpressionList();\n+    if (placeholderPosition < 0 || arguments.size() <= placeholderPosition) return;\n+\n+    GoExpression placeholder = arguments.get(placeholderPosition);\n+    if (!GoTypeUtil.isString(placeholder.getGoType(null))) {\n+      String message = \"Value used for formatting text does not appear to be a string\";\n+      myProblemsHolder.registerProblem(placeholder, message, ProblemHighlightType.GENERIC_ERROR_OR_WARNING);\n+      return;\n+    }\n+\n+    String placeholderText = resolve(placeholder);\n+    if (placeholderText == null) return;\n+\n+    // We always receive the text with double quotes at the beginning and at the end so remove them\n+    placeholderText = placeholderText.substring(1, placeholderText.length() - 1);\n+\n+    if (!hasPlaceholder(placeholderText) && arguments.size() > placeholderPosition) {\n+      String message = \"Value used for formatting text does not appear to contain a placeholder\";\n+      myProblemsHolder.registerProblem(placeholder, message, ProblemHighlightType.GENERIC_ERROR_OR_WARNING);\n+      return;\n+    }\n+\n+    int firstArg = placeholderPosition + 1;\n+    int argNum = firstArg;\n+    int maxArgsNum = argNum;\n+    int w;\n+    for (int i = 0; i < placeholderText.length(); i += w) {\n+      w = 1;\n+      if (placeholderText.charAt(i) == '%') {\n+        FormatState state = parsePrintfVerb(placeholder, placeholderText.substring(i), firstArg, argNum);\n+        if (state == null) return;\n+        w = state.format.length();\n+\n+        // One error per format is enough\n+        if (!okPrintfArg(placeholder, arguments, state)) return;\n+\n+        if (!state.argNums.isEmpty()) {\n+          int maxArgNum = Collections.max(state.argNums) + 1;\n+          int lastArgNum = state.argNums.get(state.argNums.size() - 1) + 1;\n+          if (!state.indexed) {\n+            if (argNum < maxArgNum) {\n+              argNum = maxArgNum;\n+            }\n+          }\n+          else {\n+            argNum = lastArgNum;\n+          }\n+          if (maxArgsNum < maxArgNum) maxArgsNum = maxArgNum;\n+        }\n+      }\n+    }\n+\n+    if (hasVariadic(myCallExpr.getArgumentList()) && maxArgsNum >= arguments.size() - 1) {\n+      return;\n+    }\n+\n+    if (maxArgsNum != arguments.size()) {\n+      int expect = maxArgsNum - firstArg;\n+      int numArgs = arguments.size() - firstArg;\n+      String message = String.format(\"Got %d placeholder(s) for %d arguments(s)\", expect, numArgs);\n+      myProblemsHolder.registerProblem(placeholder, message, ProblemHighlightType.GENERIC_ERROR_OR_WARNING);\n+    }\n+  }\n+\n+  private static int getPlaceholderPosition(@NotNull GoFunctionOrMethodDeclaration function) {\n+    Integer position = FORMATTING_FUNCTIONS.get(StringUtil.toLowerCase(function.getName()));\n+    if (position != null) {\n+      String importPath = function.getContainingFile().getImportPath(false);\n+      if (\"fmt\".equals(importPath) || \"log\".equals(importPath) || TESTING_PATH.equals(importPath)) {\n+        return position;\n+      }\n+    }\n+    return -1;\n+  }\n+\n+  @Nullable\n+  private static String resolve(@NotNull GoExpression argument) {\n+    if (argument instanceof GoStringLiteral) return argument.getText();\n+\n+    PsiReference reference = argument.getReference();\n+    PsiElement resolved = reference != null ? reference.resolve() : null;\n+\n+    if (resolved instanceof GoVarDefinition) {\n+      return getValue(((GoVarDefinition)resolved).getValue());\n+    }\n+    if (resolved instanceof GoConstDefinition) {\n+      return getValue(((GoConstDefinition)resolved).getValue());\n+    }\n+\n+    return null;\n+  }\n+\n+  // todo: implement ConstEvaluator\n+  @Nullable\n+  private static String getValue(@Nullable GoExpression expression) {\n+    if (expression instanceof GoStringLiteral) {\n+      return expression.getText();\n+    }\n+    if (expression instanceof GoAddExpr) {\n+      String sum = getValue((GoAddExpr)expression);\n+      return sum.isEmpty() ? null : sum;\n+    }\n+\n+    return null;\n+  }\n+\n+  // todo: implement ConstEvaluator\n+  @NotNull\n+  private static String getValue(@Nullable GoAddExpr expression) {\n+    if (expression == null) return \"\";\n+    StringBuilder result = new StringBuilder();\n+    for (GoExpression expr : expression.getExpressionList()) {\n+      if (expr instanceof GoStringLiteral) {\n+        result.append(expr.getText());\n+      }\n+      else if (expr instanceof GoAddExpr) {\n+        result.append(getValue(expr));\n+      }\n+    }\n+\n+    return result.toString();\n+  }\n+\n+  private FormatState parsePrintfVerb(@NotNull GoExpression placeholder, @NotNull String format, int firstArg, int argNum) {\n+    FormatState state = new FormatState(format, argNum, firstArg);\n+\n+    // There may be flags","path":"src/com/goide/inspections/GoPlaceholderChecker.java","position":290,"original_position":290,"commit_id":"d794b010a8641e20faab2e573d0834820adb0ba1","original_commit_id":"d794b010a8641e20faab2e573d0834820adb0ba1","user":{"login":"zolotov","id":140920,"avatar_url":"https://avatars.githubusercontent.com/u/140920?v=3","gravatar_id":"","url":"https://api.github.com/users/zolotov","html_url":"https://github.com/zolotov","followers_url":"https://api.github.com/users/zolotov/followers","following_url":"https://api.github.com/users/zolotov/following{/other_user}","gists_url":"https://api.github.com/users/zolotov/gists{/gist_id}","starred_url":"https://api.github.com/users/zolotov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zolotov/subscriptions","organizations_url":"https://api.github.com/users/zolotov/orgs","repos_url":"https://api.github.com/users/zolotov/repos","events_url":"https://api.github.com/users/zolotov/events{/privacy}","received_events_url":"https://api.github.com/users/zolotov/received_events","type":"User","site_admin":false},"body":"comments about flags before invoking `parseFlags` method looks redundant","created_at":"2016-05-30T17:48:29Z","updated_at":"2016-05-30T17:48:29Z","html_url":"https://github.com/go-lang-plugin-org/go-lang-idea-plugin/pull/2548#discussion_r65096061","pull_request_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/pulls/2548","_links":{"self":{"href":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/pulls/comments/65096061"},"html":{"href":"https://github.com/go-lang-plugin-org/go-lang-idea-plugin/pull/2548#discussion_r65096061"},"pull_request":{"href":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/pulls/2548"}}},"pull_request":{"url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/pulls/2548","id":71844154,"html_url":"https://github.com/go-lang-plugin-org/go-lang-idea-plugin/pull/2548","diff_url":"https://github.com/go-lang-plugin-org/go-lang-idea-plugin/pull/2548.diff","patch_url":"https://github.com/go-lang-plugin-org/go-lang-idea-plugin/pull/2548.patch","issue_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/issues/2548","number":2548,"state":"open","locked":false,"title":"Rework placeholder count inspection (fixes #2188)","user":{"login":"dlsniper","id":607868,"avatar_url":"https://avatars.githubusercontent.com/u/607868?v=3","gravatar_id":"","url":"https://api.github.com/users/dlsniper","html_url":"https://github.com/dlsniper","followers_url":"https://api.github.com/users/dlsniper/followers","following_url":"https://api.github.com/users/dlsniper/following{/other_user}","gists_url":"https://api.github.com/users/dlsniper/gists{/gist_id}","starred_url":"https://api.github.com/users/dlsniper/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dlsniper/subscriptions","organizations_url":"https://api.github.com/users/dlsniper/orgs","repos_url":"https://api.github.com/users/dlsniper/repos","events_url":"https://api.github.com/users/dlsniper/events{/privacy}","received_events_url":"https://api.github.com/users/dlsniper/received_events","type":"User","site_admin":false},"body":"This matches the inspection with what `go vet` does. The problem is that `go vet` currently doesn't match the language specs / what the Go compiler does, thus the failing tests.\r\nI'll work into getting this back in working order without changing the tests as the error is in the inspection logic not the test code.","created_at":"2016-05-30T01:31:23Z","updated_at":"2016-05-30T17:48:29Z","closed_at":null,"merged_at":null,"merge_commit_sha":"cd772e54c79750e73bda040b9d3059392ff9d0c1","assignee":{"login":"zolotov","id":140920,"avatar_url":"https://avatars.githubusercontent.com/u/140920?v=3","gravatar_id":"","url":"https://api.github.com/users/zolotov","html_url":"https://github.com/zolotov","followers_url":"https://api.github.com/users/zolotov/followers","following_url":"https://api.github.com/users/zolotov/following{/other_user}","gists_url":"https://api.github.com/users/zolotov/gists{/gist_id}","starred_url":"https://api.github.com/users/zolotov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zolotov/subscriptions","organizations_url":"https://api.github.com/users/zolotov/orgs","repos_url":"https://api.github.com/users/zolotov/repos","events_url":"https://api.github.com/users/zolotov/events{/privacy}","received_events_url":"https://api.github.com/users/zolotov/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/pulls/2548/commits","review_comments_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/pulls/2548/comments","review_comment_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/pulls/comments{/number}","comments_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/issues/2548/comments","statuses_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/statuses/d794b010a8641e20faab2e573d0834820adb0ba1","head":{"label":"dlsniper:placeholder-rework","ref":"placeholder-rework","sha":"d794b010a8641e20faab2e573d0834820adb0ba1","user":{"login":"dlsniper","id":607868,"avatar_url":"https://avatars.githubusercontent.com/u/607868?v=3","gravatar_id":"","url":"https://api.github.com/users/dlsniper","html_url":"https://github.com/dlsniper","followers_url":"https://api.github.com/users/dlsniper/followers","following_url":"https://api.github.com/users/dlsniper/following{/other_user}","gists_url":"https://api.github.com/users/dlsniper/gists{/gist_id}","starred_url":"https://api.github.com/users/dlsniper/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dlsniper/subscriptions","organizations_url":"https://api.github.com/users/dlsniper/orgs","repos_url":"https://api.github.com/users/dlsniper/repos","events_url":"https://api.github.com/users/dlsniper/events{/privacy}","received_events_url":"https://api.github.com/users/dlsniper/received_events","type":"User","site_admin":false},"repo":{"id":13428622,"name":"google-go-lang-idea-plugin","full_name":"dlsniper/google-go-lang-idea-plugin","owner":{"login":"dlsniper","id":607868,"avatar_url":"https://avatars.githubusercontent.com/u/607868?v=3","gravatar_id":"","url":"https://api.github.com/users/dlsniper","html_url":"https://github.com/dlsniper","followers_url":"https://api.github.com/users/dlsniper/followers","following_url":"https://api.github.com/users/dlsniper/following{/other_user}","gists_url":"https://api.github.com/users/dlsniper/gists{/gist_id}","starred_url":"https://api.github.com/users/dlsniper/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dlsniper/subscriptions","organizations_url":"https://api.github.com/users/dlsniper/orgs","repos_url":"https://api.github.com/users/dlsniper/repos","events_url":"https://api.github.com/users/dlsniper/events{/privacy}","received_events_url":"https://api.github.com/users/dlsniper/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/dlsniper/google-go-lang-idea-plugin","description":"Google Go language IDE built using the Intellij Platform. Released both an integrated IDE and as a standalone Intellij IDEA plugin","fork":true,"url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin","forks_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/forks","keys_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/teams","hooks_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/hooks","issue_events_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/issues/events{/number}","events_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/events","assignees_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/assignees{/user}","branches_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/branches{/branch}","tags_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/tags","blobs_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/git/refs{/sha}","trees_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/statuses/{sha}","languages_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/languages","stargazers_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/stargazers","contributors_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/contributors","subscribers_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/subscribers","subscription_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/subscription","commits_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/commits{/sha}","git_commits_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/git/commits{/sha}","comments_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/comments{/number}","issue_comment_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/issues/comments{/number}","contents_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/contents/{+path}","compare_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/merges","archive_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/downloads","issues_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/issues{/number}","pulls_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/pulls{/number}","milestones_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/milestones{/number}","notifications_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/labels{/name}","releases_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/releases{/id}","deployments_url":"https://api.github.com/repos/dlsniper/google-go-lang-idea-plugin/deployments","created_at":"2013-10-08T23:54:54Z","updated_at":"2015-05-06T08:31:33Z","pushed_at":"2016-05-30T17:19:06Z","git_url":"git://github.com/dlsniper/google-go-lang-idea-plugin.git","ssh_url":"git@github.com:dlsniper/google-go-lang-idea-plugin.git","clone_url":"https://github.com/dlsniper/google-go-lang-idea-plugin.git","svn_url":"https://github.com/dlsniper/google-go-lang-idea-plugin","homepage":"http://plugins.intellij.net/plugin/?idea&id=5047","size":25855,"stargazers_count":2,"watchers_count":2,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":0,"forks":1,"open_issues":0,"watchers":2,"default_branch":"master"}},"base":{"label":"go-lang-plugin-org:master","ref":"master","sha":"572f8c771901ddf39dc11e7cdbfcf228211638f1","user":{"login":"go-lang-plugin-org","id":6117521,"avatar_url":"https://avatars.githubusercontent.com/u/6117521?v=3","gravatar_id":"","url":"https://api.github.com/users/go-lang-plugin-org","html_url":"https://github.com/go-lang-plugin-org","followers_url":"https://api.github.com/users/go-lang-plugin-org/followers","following_url":"https://api.github.com/users/go-lang-plugin-org/following{/other_user}","gists_url":"https://api.github.com/users/go-lang-plugin-org/gists{/gist_id}","starred_url":"https://api.github.com/users/go-lang-plugin-org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/go-lang-plugin-org/subscriptions","organizations_url":"https://api.github.com/users/go-lang-plugin-org/orgs","repos_url":"https://api.github.com/users/go-lang-plugin-org/repos","events_url":"https://api.github.com/users/go-lang-plugin-org/events{/privacy}","received_events_url":"https://api.github.com/users/go-lang-plugin-org/received_events","type":"Organization","site_admin":false},"repo":{"id":869754,"name":"go-lang-idea-plugin","full_name":"go-lang-plugin-org/go-lang-idea-plugin","owner":{"login":"go-lang-plugin-org","id":6117521,"avatar_url":"https://avatars.githubusercontent.com/u/6117521?v=3","gravatar_id":"","url":"https://api.github.com/users/go-lang-plugin-org","html_url":"https://github.com/go-lang-plugin-org","followers_url":"https://api.github.com/users/go-lang-plugin-org/followers","following_url":"https://api.github.com/users/go-lang-plugin-org/following{/other_user}","gists_url":"https://api.github.com/users/go-lang-plugin-org/gists{/gist_id}","starred_url":"https://api.github.com/users/go-lang-plugin-org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/go-lang-plugin-org/subscriptions","organizations_url":"https://api.github.com/users/go-lang-plugin-org/orgs","repos_url":"https://api.github.com/users/go-lang-plugin-org/repos","events_url":"https://api.github.com/users/go-lang-plugin-org/events{/privacy}","received_events_url":"https://api.github.com/users/go-lang-plugin-org/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/go-lang-plugin-org/go-lang-idea-plugin","description":"Google Go language IDE built using the IntelliJ Platform","fork":false,"url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin","forks_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/forks","keys_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/teams","hooks_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/hooks","issue_events_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/issues/events{/number}","events_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/events","assignees_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/assignees{/user}","branches_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/branches{/branch}","tags_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/tags","blobs_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/git/refs{/sha}","trees_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/statuses/{sha}","languages_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/languages","stargazers_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/stargazers","contributors_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/contributors","subscribers_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/subscribers","subscription_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/subscription","commits_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/commits{/sha}","git_commits_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/git/commits{/sha}","comments_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/comments{/number}","issue_comment_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/issues/comments{/number}","contents_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/contents/{+path}","compare_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/merges","archive_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/downloads","issues_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/issues{/number}","pulls_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/pulls{/number}","milestones_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/milestones{/number}","notifications_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/labels{/name}","releases_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/releases{/id}","deployments_url":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/deployments","created_at":"2010-08-29T08:20:01Z","updated_at":"2016-05-30T17:25:50Z","pushed_at":"2016-05-30T17:19:07Z","git_url":"git://github.com/go-lang-plugin-org/go-lang-idea-plugin.git","ssh_url":"git@github.com:go-lang-plugin-org/go-lang-idea-plugin.git","clone_url":"https://github.com/go-lang-plugin-org/go-lang-idea-plugin.git","svn_url":"https://github.com/go-lang-plugin-org/go-lang-idea-plugin","homepage":"https://plugins.jetbrains.com/plugin/5047","size":61240,"stargazers_count":3397,"watchers_count":3397,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":401,"mirror_url":null,"open_issues_count":330,"forks":401,"open_issues":330,"watchers":3397,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/pulls/2548"},"html":{"href":"https://github.com/go-lang-plugin-org/go-lang-idea-plugin/pull/2548"},"issue":{"href":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/issues/2548"},"comments":{"href":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/issues/2548/comments"},"review_comments":{"href":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/pulls/2548/comments"},"review_comment":{"href":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/pulls/2548/commits"},"statuses":{"href":"https://api.github.com/repos/go-lang-plugin-org/go-lang-idea-plugin/statuses/d794b010a8641e20faab2e573d0834820adb0ba1"}}}}
{"actor":{"display_login":"zolotov"}}