{"action":"created","comment":{"url":"https://api.github.com/repos/typetools/checker-framework/pulls/comments/46087477","id":46087477,"diff_hunk":"@@ -96,28 +107,310 @@ public LockTransfer createFlowTransferFunction(CFAbstractAnalysis<CFValue, LockS\n         return new LockTransfer((LockAnalysis) analysis,(LockChecker)this.checker);\n     }\n \n-    protected AnnotatedTypeMirror getDeclaredAndDefaultedAnnotatedType(Tree tree) {\n-        shouldCache = false;\n+    class LockQualifierHierarchy extends MultiGraphQualifierHierarchy {\n+\n+        public LockQualifierHierarchy(MultiGraphFactory f) {\n+            super(f, LOCKHELD);\n+        }\n+\n+\n+        boolean isGuardedBy(AnnotationMirror am) {\n+            return AnnotationUtils.areSameIgnoringValues(am, GUARDEDBY) ||\n+                   AnnotationUtils.areSameIgnoringValues(am, JAVAXGUARDEDBY) ||\n+                   AnnotationUtils.areSameIgnoringValues(am, JCIPGUARDEDBY);\n+        }\n+\n+        @Override\n+        public boolean isSubtype(AnnotationMirror rhs, AnnotationMirror lhs) {\n+\n+            boolean lhsIsGuardedBy = isGuardedBy(lhs);\n+            boolean rhsIsGuardedBy = isGuardedBy(rhs);\n+\n+            if (lhsIsGuardedBy && rhsIsGuardedBy) {\n+                // Two @GuardedBy annotations are considered subtypes of each other if and only if their values match exactly.\n+\n+                List<String> lhsValues =\n+                    AnnotationUtils.getElementValueArray(lhs, \"value\", String.class, true);\n+                List<String> rhsValues =\n+                    AnnotationUtils.getElementValueArray(rhs, \"value\", String.class, true);\n+\n+                return rhsValues.containsAll(lhsValues) && lhsValues.containsAll(rhsValues);\n+            }\n+\n+            boolean lhsIsGuardSatisfied = AnnotationUtils.areSameIgnoringValues(lhs, GUARDSATISFIED);\n+            boolean rhsIsGuardSatisfied = AnnotationUtils.areSameIgnoringValues(rhs, GUARDSATISFIED);\n+\n+            if (lhsIsGuardSatisfied && rhsIsGuardSatisfied) {\n+                // Two @GuardSatisfied annotations are considered subtypes of each other if and only if their indices match exactly.\n+                return AnnotationUtils.areSame(lhs, rhs);\n+            }\n+\n+            // Remove values from @GuardedBy annotations (and use the Checker Framework's GuardedBy annotation, not JCIP's or Javax's)\n+            // for further subtype checking. Remove indices from @GuardSatisfied annotations.\n+\n+            if (lhsIsGuardedBy) {\n+                lhs = GUARDEDBY;\n+            }\n+            else if (AnnotationUtils.areSameIgnoringValues(lhs, GUARDSATISFIED)) {\n+                lhs = GUARDSATISFIED;\n+            }\n+\n+            if (rhsIsGuardedBy) {\n+                rhs = GUARDEDBY;\n+            }\n+            else if (AnnotationUtils.areSameIgnoringValues(rhs, GUARDSATISFIED)) {\n+                rhs = GUARDSATISFIED;\n+            }\n+\n+            return super.isSubtype(rhs, lhs);\n+        }\n+\n+        @Override\n+        public AnnotationMirror greatestLowerBound(AnnotationMirror a1, AnnotationMirror a2) {\n+        \tAnnotationMirror a1top = getTopAnnotation(a1);\n+        \tAnnotationMirror a2top = getTopAnnotation(a2);\n+\n+        \tif (AnnotationUtils.areSame(a1top, LOCKPOSSIBLYHELD) &&\n+                AnnotationUtils.areSame(a2top, LOCKPOSSIBLYHELD)) {\n+        \t\treturn greatestLowerBoundInLockPossiblyHeldHierarchy(a1, a2);\n+        \t} else if (AnnotationUtils.areSame(a1top, GUARDEDBYINACCESSIBLE) &&\n+                       AnnotationUtils.areSame(a2top, GUARDEDBYINACCESSIBLE)) {\n+                return greatestLowerBoundInGuardedByInaccessibleHierarchy(a1, a2);\n+        \t}\n+\n+        \treturn null;\n+        }\n+\n+        private AnnotationMirror greatestLowerBoundInGuardedByInaccessibleHierarchy(AnnotationMirror a1, AnnotationMirror a2) {\n+        \tif (AnnotationUtils.areSame(a1, GUARDEDBYINACCESSIBLE)) {\n+        \t\treturn a2;\n+        \t}\n \n-        AnnotatedTypeMirror type = getAnnotatedType(tree);\n+        \tif (AnnotationUtils.areSame(a2, GUARDEDBYINACCESSIBLE)) {\n+        \t\treturn a1;\n+        \t}\n \n-        shouldCache = true;\n+            if (isGuardedBy(a1) && isGuardedBy(a2)) {\n+                // Two @GuardedBy annotations are considered subtypes of each other if and only if their values match exactly.\n \n-        return type;\n+                List<String> a1Values =\n+                    AnnotationUtils.getElementValueArray(a1, \"value\", String.class, true);\n+                List<String> a2Values =\n+                    AnnotationUtils.getElementValueArray(a2, \"value\", String.class, true);\n+\n+                if (a2Values.containsAll(a1Values) && a1Values.containsAll(a2Values)) {\n+                \treturn a1;\n+                }\n+            } else if (AnnotationUtils.areSame(a1, a2)) {\n+        \t\treturn a1;\n+        \t}\n+\n+        \treturn GUARDEDBYBOTTOM;\n+        }\n+\n+        private AnnotationMirror greatestLowerBoundInLockPossiblyHeldHierarchy(AnnotationMirror a1, AnnotationMirror a2) {\n+        \tif (AnnotationUtils.areSame(a1, LOCKPOSSIBLYHELD)) {\n+        \t\treturn a2;\n+        \t}\n+\n+        \tif (AnnotationUtils.areSame(a2, LOCKPOSSIBLYHELD)) {\n+        \t\treturn a1;\n+        \t}\n+\n+        \treturn LOCKHELD;\n+        }\n     }\n \n-    /**\n-     * @return The list of annotations of the lock type system.\n-     */\n-    public Set<Class<? extends Annotation>> getLockAnnotations() {\n-        return lockAnnos;\n+    // The side effect annotations processed by the Lock Checker.\n+    enum SideEffectAnnotation {\n+        MAYRELEASELOCKS(\"@MayReleaseLocks\", MayReleaseLocks.class),\n+        RELEASESNOLOCKS(\"@ReleasesNoLocks\", ReleasesNoLocks.class),\n+        LOCKINGFREE(\"@LockingFree\",LockingFree.class),\n+        SIDEEFFECTFREE(\"@SideEffectFree\",SideEffectFree.class),\n+        PURE(\"@Pure\",Pure.class);\n+        final String annotation;\n+        final  Class<? extends Annotation> annotationClass;\n+\n+        SideEffectAnnotation(String annotation, Class<? extends Annotation> annotationClass) {\n+            this.annotation = annotation;\n+            this.annotationClass=annotationClass;\n+        }\n+\n+        public String getNameOfSideEffectAnnotation() {\n+            return annotation;\n+        }\n+\n+        public Class<? extends Annotation> getAnnotationClass() {\n+            return annotationClass;\n+        }\n+\n+        /**\n+         * Returns true if the receiver side effect annotation is weaker\n+         * than side effect annotation 'other'.\n+         */\n+        boolean isWeakerThan(SideEffectAnnotation other) {\n+            boolean weaker = false;\n+\n+            switch (other) {\n+                case MAYRELEASELOCKS:\n+                    break;\n+                case RELEASESNOLOCKS:\n+                    if (this == SideEffectAnnotation.MAYRELEASELOCKS) {\n+                        weaker = true;\n+                    }\n+                    break;\n+                case LOCKINGFREE:\n+                    switch (this) {\n+                        case MAYRELEASELOCKS:\n+                        case RELEASESNOLOCKS:\n+                            weaker = true;\n+                            break;\n+                        default:\n+                    }\n+                    break;\n+                case SIDEEFFECTFREE:\n+                    switch (this) {\n+                        case MAYRELEASELOCKS:\n+                        case RELEASESNOLOCKS:\n+                        case LOCKINGFREE:\n+                            weaker = true;\n+                            break;\n+                        default:\n+                    }\n+                    break;\n+                case PURE:\n+                    switch (this) {\n+                        case MAYRELEASELOCKS:\n+                        case RELEASESNOLOCKS:\n+                        case LOCKINGFREE:\n+                        case SIDEEFFECTFREE:\n+                            weaker = true;\n+                            break;\n+                        default:\n+                    }\n+                    break;\n+            }\n+\n+            return weaker;\n+        }\n+\n+        static SideEffectAnnotation weakest = null;\n+        public static SideEffectAnnotation weakest() {\n+            if(weakest == null) {\n+                for (SideEffectAnnotation sea : SideEffectAnnotation.values()) {\n+                    if (weakest == null) weakest = sea;\n+                    if (sea.isWeakerThan(weakest)) {\n+                        weakest = sea;\n+                    }\n+                }\n+            }\n+            return weakest;\n+        }\n     }\n \n-    class LockQualifierHierarchy extends GraphQualifierHierarchy {\n+    // Indicates which side effect annotation is present on the given method.\n+    // If more than one annotation is present, this method issues an error (if issueErrorIfMoreThanOnePresent is true)\n+    // and returns the annotation providing the weakest guarantee.\n+    // If no annotation is present, return RELEASESNOLOCKS as the default, and MAYRELEASELOCKS\n+    // as the default for unannotated code.\n+    SideEffectAnnotation methodSideEffectAnnotation(Element element, boolean issueErrorIfMoreThanOnePresent) {\n+        if (element != null) {\n+            List<SideEffectAnnotation> sideEffectAnnotationPresent = new ArrayList<>();\n+            for (SideEffectAnnotation sea:SideEffectAnnotation.values()){\n+                if(getDeclAnnotationNoAliases(element, sea.getAnnotationClass()) != null){\n+                    sideEffectAnnotationPresent.add(sea);\n+                }\n+            }\n \n-        public LockQualifierHierarchy(MultiGraphFactory f) {\n-            super(f, LOCKHELD);\n+            int count = sideEffectAnnotationPresent.size();\n+\n+            if (count == 0) {\n+                return defaults.applyUnannotatedDefaults(element) ?\n+                    SideEffectAnnotation.MAYRELEASELOCKS :\n+                    SideEffectAnnotation.RELEASESNOLOCKS;\n+            }\n+\n+            if (count > 1 && issueErrorIfMoreThanOnePresent) {\n+                // TODO: Turn on after figuring out how this interacts with inherited annotations.\n+                // checker.report(Result.failure(\"multiple.sideeffect.annotations\"), element);\n+            }\n+\n+            SideEffectAnnotation weakest = sideEffectAnnotationPresent.get(0);\n+            // At least one side effect annotation was found. Return the weakest.\n+            for(SideEffectAnnotation sea :sideEffectAnnotationPresent) {","path":"checker/src/org/checkerframework/checker/lock/LockAnnotatedTypeFactory.java","position":375,"original_position":375,"commit_id":"77aec5dd51843af73b2b96dba42c926cdc3d3f83","original_commit_id":"77aec5dd51843af73b2b96dba42c926cdc3d3f83","user":{"login":"jthaine","id":7230054,"avatar_url":"https://avatars.githubusercontent.com/u/7230054?v=3","gravatar_id":"","url":"https://api.github.com/users/jthaine","html_url":"https://github.com/jthaine","followers_url":"https://api.github.com/users/jthaine/followers","following_url":"https://api.github.com/users/jthaine/following{/other_user}","gists_url":"https://api.github.com/users/jthaine/gists{/gist_id}","starred_url":"https://api.github.com/users/jthaine/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jthaine/subscriptions","organizations_url":"https://api.github.com/users/jthaine/orgs","repos_url":"https://api.github.com/users/jthaine/repos","events_url":"https://api.github.com/users/jthaine/events{/privacy}","received_events_url":"https://api.github.com/users/jthaine/received_events","type":"User","site_admin":false},"body":"fixed","created_at":"2015-11-29T04:22:14Z","updated_at":"2015-11-29T04:22:14Z","html_url":"https://github.com/typetools/checker-framework/pull/522#discussion_r46087477","pull_request_url":"https://api.github.com/repos/typetools/checker-framework/pulls/522","_links":{"self":{"href":"https://api.github.com/repos/typetools/checker-framework/pulls/comments/46087477"},"html":{"href":"https://github.com/typetools/checker-framework/pull/522#discussion_r46087477"},"pull_request":{"href":"https://api.github.com/repos/typetools/checker-framework/pulls/522"}}},"pull_request":{"url":"https://api.github.com/repos/typetools/checker-framework/pulls/522","id":51601296,"html_url":"https://github.com/typetools/checker-framework/pull/522","diff_url":"https://github.com/typetools/checker-framework/pull/522.diff","patch_url":"https://github.com/typetools/checker-framework/pull/522.patch","issue_url":"https://api.github.com/repos/typetools/checker-framework/issues/522","number":522,"state":"open","locked":false,"title":"Lock Checker implementation providing value protection semantics","user":{"login":"jthaine","id":7230054,"avatar_url":"https://avatars.githubusercontent.com/u/7230054?v=3","gravatar_id":"","url":"https://api.github.com/users/jthaine","html_url":"https://github.com/jthaine","followers_url":"https://api.github.com/users/jthaine/followers","following_url":"https://api.github.com/users/jthaine/following{/other_user}","gists_url":"https://api.github.com/users/jthaine/gists{/gist_id}","starred_url":"https://api.github.com/users/jthaine/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jthaine/subscriptions","organizations_url":"https://api.github.com/users/jthaine/orgs","repos_url":"https://api.github.com/users/jthaine/repos","events_url":"https://api.github.com/users/jthaine/events{/privacy}","received_events_url":"https://api.github.com/users/jthaine/received_events","type":"User","site_admin":false},"body":"To review LockAnnotatedTypeFactory.java and LockVisitor.java, it is easier to read them in their entirety (i.e. click on View to view the whole file) rather than viewing the diffs.","created_at":"2015-11-24T00:27:10Z","updated_at":"2015-11-29T04:22:14Z","closed_at":null,"merged_at":null,"merge_commit_sha":"1d62a6ad9748d918f221650d0a96ba64080852aa","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/typetools/checker-framework/pulls/522/commits","review_comments_url":"https://api.github.com/repos/typetools/checker-framework/pulls/522/comments","review_comment_url":"https://api.github.com/repos/typetools/checker-framework/pulls/comments{/number}","comments_url":"https://api.github.com/repos/typetools/checker-framework/issues/522/comments","statuses_url":"https://api.github.com/repos/typetools/checker-framework/statuses/77aec5dd51843af73b2b96dba42c926cdc3d3f83","head":{"label":"typetools:lock-checker","ref":"lock-checker","sha":"77aec5dd51843af73b2b96dba42c926cdc3d3f83","user":{"login":"typetools","id":12883499,"avatar_url":"https://avatars.githubusercontent.com/u/12883499?v=3","gravatar_id":"","url":"https://api.github.com/users/typetools","html_url":"https://github.com/typetools","followers_url":"https://api.github.com/users/typetools/followers","following_url":"https://api.github.com/users/typetools/following{/other_user}","gists_url":"https://api.github.com/users/typetools/gists{/gist_id}","starred_url":"https://api.github.com/users/typetools/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/typetools/subscriptions","organizations_url":"https://api.github.com/users/typetools/orgs","repos_url":"https://api.github.com/users/typetools/repos","events_url":"https://api.github.com/users/typetools/events{/privacy}","received_events_url":"https://api.github.com/users/typetools/received_events","type":"Organization","site_admin":false},"repo":{"id":38488726,"name":"checker-framework","full_name":"typetools/checker-framework","owner":{"login":"typetools","id":12883499,"avatar_url":"https://avatars.githubusercontent.com/u/12883499?v=3","gravatar_id":"","url":"https://api.github.com/users/typetools","html_url":"https://github.com/typetools","followers_url":"https://api.github.com/users/typetools/followers","following_url":"https://api.github.com/users/typetools/following{/other_user}","gists_url":"https://api.github.com/users/typetools/gists{/gist_id}","starred_url":"https://api.github.com/users/typetools/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/typetools/subscriptions","organizations_url":"https://api.github.com/users/typetools/orgs","repos_url":"https://api.github.com/users/typetools/repos","events_url":"https://api.github.com/users/typetools/events{/privacy}","received_events_url":"https://api.github.com/users/typetools/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/typetools/checker-framework","description":"Pluggable type-checking for Java","fork":false,"url":"https://api.github.com/repos/typetools/checker-framework","forks_url":"https://api.github.com/repos/typetools/checker-framework/forks","keys_url":"https://api.github.com/repos/typetools/checker-framework/keys{/key_id}","collaborators_url":"https://api.github.com/repos/typetools/checker-framework/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/typetools/checker-framework/teams","hooks_url":"https://api.github.com/repos/typetools/checker-framework/hooks","issue_events_url":"https://api.github.com/repos/typetools/checker-framework/issues/events{/number}","events_url":"https://api.github.com/repos/typetools/checker-framework/events","assignees_url":"https://api.github.com/repos/typetools/checker-framework/assignees{/user}","branches_url":"https://api.github.com/repos/typetools/checker-framework/branches{/branch}","tags_url":"https://api.github.com/repos/typetools/checker-framework/tags","blobs_url":"https://api.github.com/repos/typetools/checker-framework/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/typetools/checker-framework/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/typetools/checker-framework/git/refs{/sha}","trees_url":"https://api.github.com/repos/typetools/checker-framework/git/trees{/sha}","statuses_url":"https://api.github.com/repos/typetools/checker-framework/statuses/{sha}","languages_url":"https://api.github.com/repos/typetools/checker-framework/languages","stargazers_url":"https://api.github.com/repos/typetools/checker-framework/stargazers","contributors_url":"https://api.github.com/repos/typetools/checker-framework/contributors","subscribers_url":"https://api.github.com/repos/typetools/checker-framework/subscribers","subscription_url":"https://api.github.com/repos/typetools/checker-framework/subscription","commits_url":"https://api.github.com/repos/typetools/checker-framework/commits{/sha}","git_commits_url":"https://api.github.com/repos/typetools/checker-framework/git/commits{/sha}","comments_url":"https://api.github.com/repos/typetools/checker-framework/comments{/number}","issue_comment_url":"https://api.github.com/repos/typetools/checker-framework/issues/comments{/number}","contents_url":"https://api.github.com/repos/typetools/checker-framework/contents/{+path}","compare_url":"https://api.github.com/repos/typetools/checker-framework/compare/{base}...{head}","merges_url":"https://api.github.com/repos/typetools/checker-framework/merges","archive_url":"https://api.github.com/repos/typetools/checker-framework/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/typetools/checker-framework/downloads","issues_url":"https://api.github.com/repos/typetools/checker-framework/issues{/number}","pulls_url":"https://api.github.com/repos/typetools/checker-framework/pulls{/number}","milestones_url":"https://api.github.com/repos/typetools/checker-framework/milestones{/number}","notifications_url":"https://api.github.com/repos/typetools/checker-framework/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/typetools/checker-framework/labels{/name}","releases_url":"https://api.github.com/repos/typetools/checker-framework/releases{/id}","created_at":"2015-07-03T11:09:17Z","updated_at":"2015-11-26T16:43:27Z","pushed_at":"2015-11-28T22:27:18Z","git_url":"git://github.com/typetools/checker-framework.git","ssh_url":"git@github.com:typetools/checker-framework.git","clone_url":"https://github.com/typetools/checker-framework.git","svn_url":"https://github.com/typetools/checker-framework","homepage":"http://checkerframework.org/","size":167658,"stargazers_count":60,"watchers_count":60,"language":"Java","has_issues":true,"has_downloads":false,"has_wiki":false,"has_pages":false,"forks_count":22,"mirror_url":null,"open_issues_count":144,"forks":22,"open_issues":144,"watchers":60,"default_branch":"master"}},"base":{"label":"typetools:master","ref":"master","sha":"019cddbf6971f8ef8110973c327df96c00dbc1ed","user":{"login":"typetools","id":12883499,"avatar_url":"https://avatars.githubusercontent.com/u/12883499?v=3","gravatar_id":"","url":"https://api.github.com/users/typetools","html_url":"https://github.com/typetools","followers_url":"https://api.github.com/users/typetools/followers","following_url":"https://api.github.com/users/typetools/following{/other_user}","gists_url":"https://api.github.com/users/typetools/gists{/gist_id}","starred_url":"https://api.github.com/users/typetools/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/typetools/subscriptions","organizations_url":"https://api.github.com/users/typetools/orgs","repos_url":"https://api.github.com/users/typetools/repos","events_url":"https://api.github.com/users/typetools/events{/privacy}","received_events_url":"https://api.github.com/users/typetools/received_events","type":"Organization","site_admin":false},"repo":{"id":38488726,"name":"checker-framework","full_name":"typetools/checker-framework","owner":{"login":"typetools","id":12883499,"avatar_url":"https://avatars.githubusercontent.com/u/12883499?v=3","gravatar_id":"","url":"https://api.github.com/users/typetools","html_url":"https://github.com/typetools","followers_url":"https://api.github.com/users/typetools/followers","following_url":"https://api.github.com/users/typetools/following{/other_user}","gists_url":"https://api.github.com/users/typetools/gists{/gist_id}","starred_url":"https://api.github.com/users/typetools/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/typetools/subscriptions","organizations_url":"https://api.github.com/users/typetools/orgs","repos_url":"https://api.github.com/users/typetools/repos","events_url":"https://api.github.com/users/typetools/events{/privacy}","received_events_url":"https://api.github.com/users/typetools/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/typetools/checker-framework","description":"Pluggable type-checking for Java","fork":false,"url":"https://api.github.com/repos/typetools/checker-framework","forks_url":"https://api.github.com/repos/typetools/checker-framework/forks","keys_url":"https://api.github.com/repos/typetools/checker-framework/keys{/key_id}","collaborators_url":"https://api.github.com/repos/typetools/checker-framework/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/typetools/checker-framework/teams","hooks_url":"https://api.github.com/repos/typetools/checker-framework/hooks","issue_events_url":"https://api.github.com/repos/typetools/checker-framework/issues/events{/number}","events_url":"https://api.github.com/repos/typetools/checker-framework/events","assignees_url":"https://api.github.com/repos/typetools/checker-framework/assignees{/user}","branches_url":"https://api.github.com/repos/typetools/checker-framework/branches{/branch}","tags_url":"https://api.github.com/repos/typetools/checker-framework/tags","blobs_url":"https://api.github.com/repos/typetools/checker-framework/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/typetools/checker-framework/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/typetools/checker-framework/git/refs{/sha}","trees_url":"https://api.github.com/repos/typetools/checker-framework/git/trees{/sha}","statuses_url":"https://api.github.com/repos/typetools/checker-framework/statuses/{sha}","languages_url":"https://api.github.com/repos/typetools/checker-framework/languages","stargazers_url":"https://api.github.com/repos/typetools/checker-framework/stargazers","contributors_url":"https://api.github.com/repos/typetools/checker-framework/contributors","subscribers_url":"https://api.github.com/repos/typetools/checker-framework/subscribers","subscription_url":"https://api.github.com/repos/typetools/checker-framework/subscription","commits_url":"https://api.github.com/repos/typetools/checker-framework/commits{/sha}","git_commits_url":"https://api.github.com/repos/typetools/checker-framework/git/commits{/sha}","comments_url":"https://api.github.com/repos/typetools/checker-framework/comments{/number}","issue_comment_url":"https://api.github.com/repos/typetools/checker-framework/issues/comments{/number}","contents_url":"https://api.github.com/repos/typetools/checker-framework/contents/{+path}","compare_url":"https://api.github.com/repos/typetools/checker-framework/compare/{base}...{head}","merges_url":"https://api.github.com/repos/typetools/checker-framework/merges","archive_url":"https://api.github.com/repos/typetools/checker-framework/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/typetools/checker-framework/downloads","issues_url":"https://api.github.com/repos/typetools/checker-framework/issues{/number}","pulls_url":"https://api.github.com/repos/typetools/checker-framework/pulls{/number}","milestones_url":"https://api.github.com/repos/typetools/checker-framework/milestones{/number}","notifications_url":"https://api.github.com/repos/typetools/checker-framework/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/typetools/checker-framework/labels{/name}","releases_url":"https://api.github.com/repos/typetools/checker-framework/releases{/id}","created_at":"2015-07-03T11:09:17Z","updated_at":"2015-11-26T16:43:27Z","pushed_at":"2015-11-28T22:27:18Z","git_url":"git://github.com/typetools/checker-framework.git","ssh_url":"git@github.com:typetools/checker-framework.git","clone_url":"https://github.com/typetools/checker-framework.git","svn_url":"https://github.com/typetools/checker-framework","homepage":"http://checkerframework.org/","size":167658,"stargazers_count":60,"watchers_count":60,"language":"Java","has_issues":true,"has_downloads":false,"has_wiki":false,"has_pages":false,"forks_count":22,"mirror_url":null,"open_issues_count":144,"forks":22,"open_issues":144,"watchers":60,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/typetools/checker-framework/pulls/522"},"html":{"href":"https://github.com/typetools/checker-framework/pull/522"},"issue":{"href":"https://api.github.com/repos/typetools/checker-framework/issues/522"},"comments":{"href":"https://api.github.com/repos/typetools/checker-framework/issues/522/comments"},"review_comments":{"href":"https://api.github.com/repos/typetools/checker-framework/pulls/522/comments"},"review_comment":{"href":"https://api.github.com/repos/typetools/checker-framework/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/typetools/checker-framework/pulls/522/commits"},"statuses":{"href":"https://api.github.com/repos/typetools/checker-framework/statuses/77aec5dd51843af73b2b96dba42c926cdc3d3f83"}}}}