Skip to content

@SideEffectFree annotations#282

Open
mernst wants to merge 7 commits into
typetools:masterfrom
mernst:side-effects-only-2
Open

@SideEffectFree annotations#282
mernst wants to merge 7 commits into
typetools:masterfrom
mernst:side-effects-only-2

Conversation

@mernst

@mernst mernst commented Jul 14, 2026

Copy link
Copy Markdown
Member
Co-Authored-By: James Yoo <jyoo980@gmail.com>
Co-Authored-By: Rashmi Mudduluru <rashmi4@cs.washington.edu>

@coderabbitai

coderabbitai Bot commented Jul 14, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@mernst, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 2 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 85d02d30-e834-46c4-8e12-105ae5c82743

📥 Commits

Reviewing files that changed from the base of the PR and between eeaace3 and b12126e.

📒 Files selected for processing (28)
  • src/java.base/share/classes/java/util/ArrayDeque.java
  • src/java.base/share/classes/java/util/Arrays.java
  • src/java.base/share/classes/java/util/Collections.java
  • src/java.base/share/classes/java/util/Comparator.java
  • src/java.base/share/classes/java/util/Comparators.java
  • src/java.base/share/classes/java/util/Deque.java
  • src/java.base/share/classes/java/util/ImmutableCollections.java
  • src/java.base/share/classes/java/util/LinkedHashMap.java
  • src/java.base/share/classes/java/util/LinkedHashSet.java
  • src/java.base/share/classes/java/util/LinkedList.java
  • src/java.base/share/classes/java/util/List.java
  • src/java.base/share/classes/java/util/NavigableMap.java
  • src/java.base/share/classes/java/util/NavigableSet.java
  • src/java.base/share/classes/java/util/Queue.java
  • src/java.base/share/classes/java/util/ReverseOrderDequeView.java
  • src/java.base/share/classes/java/util/ReverseOrderSortedMapView.java
  • src/java.base/share/classes/java/util/ReverseOrderSortedSetView.java
  • src/java.base/share/classes/java/util/SequencedCollection.java
  • src/java.base/share/classes/java/util/SequencedMap.java
  • src/java.base/share/classes/java/util/SequencedSet.java
  • src/java.base/share/classes/java/util/SortedMap.java
  • src/java.base/share/classes/java/util/SortedSet.java
  • src/java.base/share/classes/java/util/TreeMap.java
  • src/java.base/share/classes/java/util/concurrent/ConcurrentLinkedDeque.java
  • src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java
  • src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListSet.java
  • src/java.base/share/classes/java/util/concurrent/CopyOnWriteArrayList.java
  • src/java.base/share/classes/java/util/concurrent/LinkedBlockingDeque.java
📝 Walkthrough

Walkthrough

The PR activates Checker Framework @SideEffectsOnly imports and annotations across Java base APIs and implementations, including collections, maps, queues, iterators, strings, streams, I/O, networking, and concurrency classes. It also updates Checker Framework annotation metadata and documentation, improves formatter exception messages, fixes Javadocs, and cleans README link punctuation. Runtime algorithms and method bodies are generally unchanged.

Possibly related PRs

  • typetools/jdk#265 — Overlaps on String.getChars side-effect annotations.
  • typetools/jdk#275 — Concerns the same SideEffectsOnly annotation sites with opposite activation changes.
  • typetools/jdk#276 — Overlaps on Checker Framework annotations in iterator and stream-related APIs.
🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 40.27% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 9

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (5)
src/java.base/share/classes/sun/net/www/HeaderParser.java (1)

212-216: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Enforce the Iterator contract by throwing NoSuchElementException.

While the annotation additions are correct, the next() method itself violates the standard Iterator contract. If called when the iterator is exhausted, it throws an unexpected ArrayIndexOutOfBoundsException instead of a NoSuchElementException.

Add a boundary check to throw the correct exception.

🐛 Proposed fix
         `@SideEffectsOnly`("this")
         `@DoesNotUnrefineReceiver`("modifiability")
         public String next () {
+            if (!hasNext()) {
+                throw new java.util.NoSuchElementException();
+            }
             return tab[index++][returnsValue?1:0];
         }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/java.base/share/classes/sun/net/www/HeaderParser.java` around lines 212 -
216, Update HeaderParser.next() to check whether the iterator is exhausted
before indexing tab, and throw NoSuchElementException when index has reached the
available entries. Preserve the existing return and index-advance behavior for
valid elements.
src/java.base/share/classes/java/util/regex/Matcher.java (1)

1359-1369: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Include the enclosing instance in these @SideEffectsOnly lists.
"this" only covers the iterator object; these methods also mutate the outer collection.

  • src/java.base/share/classes/java/util/regex/Matcher.java#L1359-L1369: add Matcher.this
  • src/java.base/share/classes/java/util/RegularEnumSet.java#L138-L145: add RegularEnumSet.this
  • src/java.base/share/classes/java/util/PriorityQueue.java#L572-L594: add PriorityQueue.this
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/java.base/share/classes/java/util/regex/Matcher.java` around lines 1359 -
1369, Update the `@SideEffectsOnly` annotations on the affected iterator methods
to include both the iterator receiver and its enclosing collection instance: add
Matcher.this in
src/java.base/share/classes/java/util/regex/Matcher.java:1359-1369,
RegularEnumSet.this in
src/java.base/share/classes/java/util/RegularEnumSet.java:138-145, and
PriorityQueue.this in
src/java.base/share/classes/java/util/PriorityQueue.java:572-594.
src/java.base/share/classes/java/util/concurrent/BlockingQueue.java (1)

380-409: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Include c in drainTo’s side-effect spec. Both overloads can mutate c as well as this, so @SideEffectsOnly("this") is incomplete; list both targets with the argument-expression form (for example, @SideEffectsOnly({"this", "#1"})).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/java.base/share/classes/java/util/concurrent/BlockingQueue.java` around
lines 380 - 409, Update both drainTo overloads in BlockingQueue so their
`@SideEffectsOnly` annotations include both the receiver and collection argument
c, using the argument-expression target form "`#1`". Leave the existing
`@DoesNotUnrefineReceiver` annotations and method signatures unchanged.
src/java.base/share/classes/java/util/concurrent/SynchronousQueue.java (1)

1125-1138: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Include the collection parameter in the @SideEffectsOnly annotation.

The drainTo methods mutate the provided collection c by adding elements to it (c.add(e)). Therefore, the @SideEffectsOnly("this") annotation is incorrect as it claims only the receiver (this) is modified.

Consider updating the annotation to include the first parameter, for example, @SideEffectsOnly({"this", "#1"}), so that the static analysis correctly tracks the mutation on the passed collection.

🐛 Proposed fix
-    `@SideEffectsOnly`("this")
+    `@SideEffectsOnly`({"this", "`#1`"})
     `@DoesNotUnrefineReceiver`("modifiability")
     public int drainTo(`@GuardSatisfied` `@CanShrink` SynchronousQueue<E> this, Collection<? super E> c) {

And similarly for the other drainTo overload:

-    `@SideEffectsOnly`("this")
+    `@SideEffectsOnly`({"this", "`#1`"})
     `@DoesNotUnrefineReceiver`("modifiability")
     public int drainTo(`@GuardSatisfied` `@CanShrink` SynchronousQueue<E> this, Collection<? super E> c, int maxElements) {

Also applies to: 1143-1156

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/java.base/share/classes/java/util/concurrent/SynchronousQueue.java`
around lines 1125 - 1138, Update the `@SideEffectsOnly` annotations on both
drainTo overloads in SynchronousQueue to include the collection parameter
alongside "this" (for example, "this" and "`#1`"), so the mutation performed by
c.add(e) is correctly tracked.
src/java.base/share/classes/java/util/Collections.java (1)

1204-1215: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Remove incorrect @SideEffectsOnly from read-only methods. Read-only view methods and stream-creation methods were erroneously annotated with @SideEffectsOnly("this") and @DoesNotUnrefineReceiver("modifiability"). This incorrectly flags them as mutators and breaks static analysis by preventing their use on immutable references. The shared root cause is likely a copy-paste error during the mass annotation update.

  • src/java.base/share/classes/java/util/Collections.java#L1204-L1215: remove the mutator annotations from stream() and parallelStream().
  • src/java.base/share/classes/java/util/Collections.java#L1271-L1275: remove the mutator annotations from reversed().
  • src/java.base/share/classes/java/util/Collections.java#L1401-L1405: remove the mutator annotations from reversed().
  • src/java.base/share/classes/java/util/Collections.java#L1450-L1464: remove the mutator annotations from subSet, headSet, and tailSet.
  • src/java.base/share/classes/java/util/Collections.java#L1550-L1577: remove the mutator annotations from descendingSet, subSet, headSet, and tailSet.
  • src/java.base/share/classes/java/util/Collections.java#L1671-L1673: remove the mutator annotations from listIterator(int).
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/java.base/share/classes/java/util/Collections.java` around lines 1204 -
1215, Remove `@SideEffectsOnly`("this") and
`@DoesNotUnrefineReceiver`("modifiability") from the read-only methods in
Collections.java: stream() and parallelStream() at lines 1204-1215, reversed()
at 1271-1275 and 1401-1405, subSet(), headSet(), and tailSet() at 1450-1464,
descendingSet(), subSet(), headSet(), and tailSet() at 1550-1577, and
listIterator(int) at 1671-1673. Leave their existing implementations and other
annotations unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/java.base/share/classes/java/lang/StringBuilder.java`:
- Around line 502-505: Remove the contradictory `@SideEffectFree` annotation from
StringBuilder.repeat(int codePoint, int count), keeping `@SideEffectsOnly`("this")
and the existing method behavior unchanged.

In `@src/java.base/share/classes/java/util/concurrent/DelayQueue.java`:
- Around line 406-408: Update the `@SideEffectsOnly` annotations on both drainTo
overloads in src/java.base/share/classes/java/util/concurrent/DelayQueue.java at
lines 406-408 and 418-420, and both drainTo overloads in
src/java.base/share/classes/java/util/concurrent/PriorityBlockingQueue.java at
lines 751-753 and 763-765, to declare mutations of both the receiver and the
first parameter using {"this", "`#1`"}.

In `@src/java.base/share/classes/java/util/concurrent/LinkedBlockingQueue.java`:
- Around line 728-730: Update both LinkedBlockingQueue.drainTo overloads at
src/java.base/share/classes/java/util/concurrent/LinkedBlockingQueue.java lines
728-730 and 740-742: expand `@SideEffectsOnly` to include both "this" and the
first parameter ("`#1`" or "c"), preserving the existing `@DoesNotUnrefineReceiver`
annotation.

In `@src/java.base/share/classes/java/util/Deque.java`:
- Line 385: Remove the incorrect `@SideEffectsOnly`("this") annotations from the
read-only methods at src/java.base/share/classes/java/util/Deque.java lines 385,
396, 537, 552, 692, and 706; use `@SideEffectFree` instead at lines 692 and 706
where appropriate. Remove the annotation from
src/java.base/share/classes/java/util/SequencedSet.java line 60 and consider
`@SideEffectFree`, and remove it from
src/java.base/share/classes/java/util/TreeMap.java lines 313, 988, and 1182,
using `@SideEffectFree` at lines 988 and 1182 where appropriate. Keep existing
`@Pure` annotations and method behavior unchanged.

In `@src/java.base/share/classes/java/util/DualPivotQuicksort.java`:
- Around line 186-187: Update all four Sorter-based sort overloads in
src/java.base/share/classes/java/util/DualPivotQuicksort.java at lines 186-187,
942-943, 2490-2491, and 3298-3299: include both arguments in `@SideEffectsOnly`,
and bind low/high to the array parameter (`#2`) rather than the Sorter parameter
(`#1`). Apply the identical annotation correction to the int[], long[], float[],
and double[] overloads.

In `@src/java.base/share/classes/java/util/LinkedHashSet.java`:
- Around line 333-335: Replace the mutator annotations on
LinkedHashSet.reversed() in
src/java.base/share/classes/java/util/LinkedHashSet.java:333-335 with
`@SideEffectFree`. Apply the same annotation change to TreeSet.reversed() in
src/java.base/share/classes/java/util/TreeSet.java:222-224, removing
`@SideEffectsOnly`("this") and `@DoesNotUnrefineReceiver`("modifiability") at both
sites.

In `@src/java.base/share/classes/java/util/Queue.java`:
- Line 235: Remove the contradictory `@SideEffectsOnly`("this") annotation from
the Queue.peek() method, preserving its existing `@Pure` annotation and
non-mutating behavior.

In `@src/java.base/share/classes/java/util/SortedMap.java`:
- Around line 351-353: Update SortedMap.reversed() to replace
`@SideEffectsOnly`("this") and `@DoesNotUnrefineReceiver`("modifiability") with
`@SideEffectFree`, matching the annotations used by other view-creating methods
such as subMap and headMap.

In `@src/java.base/share/classes/java/util/SortedSet.java`:
- Around line 403-404: Update the annotations on the SortedSet.reversed()
view-factory method: replace `@SideEffectsOnly`("this") with `@SideEffectFree` and
remove the redundant `@DoesNotUnrefineReceiver`("modifiability") annotation,
matching the annotation pattern used by subSet and headSet.

---

Outside diff comments:
In `@src/java.base/share/classes/java/util/Collections.java`:
- Around line 1204-1215: Remove `@SideEffectsOnly`("this") and
`@DoesNotUnrefineReceiver`("modifiability") from the read-only methods in
Collections.java: stream() and parallelStream() at lines 1204-1215, reversed()
at 1271-1275 and 1401-1405, subSet(), headSet(), and tailSet() at 1450-1464,
descendingSet(), subSet(), headSet(), and tailSet() at 1550-1577, and
listIterator(int) at 1671-1673. Leave their existing implementations and other
annotations unchanged.

In `@src/java.base/share/classes/java/util/concurrent/BlockingQueue.java`:
- Around line 380-409: Update both drainTo overloads in BlockingQueue so their
`@SideEffectsOnly` annotations include both the receiver and collection argument
c, using the argument-expression target form "`#1`". Leave the existing
`@DoesNotUnrefineReceiver` annotations and method signatures unchanged.

In `@src/java.base/share/classes/java/util/concurrent/SynchronousQueue.java`:
- Around line 1125-1138: Update the `@SideEffectsOnly` annotations on both drainTo
overloads in SynchronousQueue to include the collection parameter alongside
"this" (for example, "this" and "`#1`"), so the mutation performed by c.add(e) is
correctly tracked.

In `@src/java.base/share/classes/java/util/regex/Matcher.java`:
- Around line 1359-1369: Update the `@SideEffectsOnly` annotations on the affected
iterator methods to include both the iterator receiver and its enclosing
collection instance: add Matcher.this in
src/java.base/share/classes/java/util/regex/Matcher.java:1359-1369,
RegularEnumSet.this in
src/java.base/share/classes/java/util/RegularEnumSet.java:138-145, and
PriorityQueue.this in
src/java.base/share/classes/java/util/PriorityQueue.java:572-594.

In `@src/java.base/share/classes/sun/net/www/HeaderParser.java`:
- Around line 212-216: Update HeaderParser.next() to check whether the iterator
is exhausted before indexing tab, and throw NoSuchElementException when index
has reached the available entries. Preserve the existing return and
index-advance behavior for valid elements.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 99f555c6-6920-448f-91af-ac1798aa1ab4

📥 Commits

Reviewing files that changed from the base of the PR and between 0e5bddd and 21c0697.

⛔ Files ignored due to path filters (1)
  • checker-qual.jar is excluded by !**/*.jar
📒 Files selected for processing (122)
  • README.md
  • src/java.base/share/classes/java/io/BufferedReader.java
  • src/java.base/share/classes/java/lang/AbstractStringBuilder.java
  • src/java.base/share/classes/java/lang/CharSequence.java
  • src/java.base/share/classes/java/lang/StackStreamFactory.java
  • src/java.base/share/classes/java/lang/String.java
  • src/java.base/share/classes/java/lang/StringBuffer.java
  • src/java.base/share/classes/java/lang/StringBuilder.java
  • src/java.base/share/classes/java/lang/StringLatin1.java
  • src/java.base/share/classes/java/lang/StringUTF16.java
  • src/java.base/share/classes/java/lang/invoke/AbstractConstantGroup.java
  • src/java.base/share/classes/java/net/URL.java
  • src/java.base/share/classes/java/nio/charset/Charset.java
  • src/java.base/share/classes/java/nio/file/FileTreeIterator.java
  • src/java.base/share/classes/java/nio/file/Files.java
  • src/java.base/share/classes/java/nio/file/Path.java
  • src/java.base/share/classes/java/text/EntryPair.java
  • src/java.base/share/classes/java/util/AbstractCollection.java
  • src/java.base/share/classes/java/util/AbstractList.java
  • src/java.base/share/classes/java/util/AbstractMap.java
  • src/java.base/share/classes/java/util/AbstractQueue.java
  • src/java.base/share/classes/java/util/AbstractSequentialList.java
  • src/java.base/share/classes/java/util/AbstractSet.java
  • src/java.base/share/classes/java/util/ArrayDeque.java
  • src/java.base/share/classes/java/util/ArrayList.java
  • src/java.base/share/classes/java/util/Arrays.java
  • src/java.base/share/classes/java/util/BitSet.java
  • src/java.base/share/classes/java/util/Collection.java
  • src/java.base/share/classes/java/util/Collections.java
  • src/java.base/share/classes/java/util/ComparableTimSort.java
  • src/java.base/share/classes/java/util/Deque.java
  • src/java.base/share/classes/java/util/DualPivotQuicksort.java
  • src/java.base/share/classes/java/util/EnumMap.java
  • src/java.base/share/classes/java/util/EnumSet.java
  • src/java.base/share/classes/java/util/Enumeration.java
  • src/java.base/share/classes/java/util/HashMap.java
  • src/java.base/share/classes/java/util/HashSet.java
  • src/java.base/share/classes/java/util/Hashtable.java
  • src/java.base/share/classes/java/util/IdentityHashMap.java
  • src/java.base/share/classes/java/util/ImmutableCollections.java
  • src/java.base/share/classes/java/util/Iterator.java
  • src/java.base/share/classes/java/util/JumboEnumSet.java
  • src/java.base/share/classes/java/util/LinkedHashMap.java
  • src/java.base/share/classes/java/util/LinkedHashSet.java
  • src/java.base/share/classes/java/util/LinkedList.java
  • src/java.base/share/classes/java/util/List.java
  • src/java.base/share/classes/java/util/ListIterator.java
  • src/java.base/share/classes/java/util/Map.java
  • src/java.base/share/classes/java/util/NavigableMap.java
  • src/java.base/share/classes/java/util/NavigableSet.java
  • src/java.base/share/classes/java/util/PrimitiveIterator.java
  • src/java.base/share/classes/java/util/PriorityQueue.java
  • src/java.base/share/classes/java/util/Properties.java
  • src/java.base/share/classes/java/util/Queue.java
  • src/java.base/share/classes/java/util/RegularEnumSet.java
  • src/java.base/share/classes/java/util/ReverseOrderDequeView.java
  • src/java.base/share/classes/java/util/ReverseOrderListView.java
  • src/java.base/share/classes/java/util/ReverseOrderSortedSetView.java
  • src/java.base/share/classes/java/util/Scanner.java
  • src/java.base/share/classes/java/util/SequencedCollection.java
  • src/java.base/share/classes/java/util/SequencedMap.java
  • src/java.base/share/classes/java/util/SequencedSet.java
  • src/java.base/share/classes/java/util/ServiceLoader.java
  • src/java.base/share/classes/java/util/Set.java
  • src/java.base/share/classes/java/util/SortedMap.java
  • src/java.base/share/classes/java/util/SortedSet.java
  • src/java.base/share/classes/java/util/Spliterators.java
  • src/java.base/share/classes/java/util/Stack.java
  • src/java.base/share/classes/java/util/TreeMap.java
  • src/java.base/share/classes/java/util/TreeSet.java
  • src/java.base/share/classes/java/util/Vector.java
  • src/java.base/share/classes/java/util/WeakHashMap.java
  • src/java.base/share/classes/java/util/concurrent/ArrayBlockingQueue.java
  • src/java.base/share/classes/java/util/concurrent/BlockingDeque.java
  • src/java.base/share/classes/java/util/concurrent/BlockingQueue.java
  • src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java
  • src/java.base/share/classes/java/util/concurrent/ConcurrentLinkedDeque.java
  • src/java.base/share/classes/java/util/concurrent/ConcurrentLinkedQueue.java
  • src/java.base/share/classes/java/util/concurrent/ConcurrentMap.java
  • src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java
  • src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListSet.java
  • src/java.base/share/classes/java/util/concurrent/CopyOnWriteArrayList.java
  • src/java.base/share/classes/java/util/concurrent/CopyOnWriteArraySet.java
  • src/java.base/share/classes/java/util/concurrent/DelayQueue.java
  • src/java.base/share/classes/java/util/concurrent/LinkedBlockingDeque.java
  • src/java.base/share/classes/java/util/concurrent/LinkedBlockingQueue.java
  • src/java.base/share/classes/java/util/concurrent/LinkedTransferQueue.java
  • src/java.base/share/classes/java/util/concurrent/PriorityBlockingQueue.java
  • src/java.base/share/classes/java/util/concurrent/ScheduledThreadPoolExecutor.java
  • src/java.base/share/classes/java/util/concurrent/SynchronousQueue.java
  • src/java.base/share/classes/java/util/jar/Attributes.java
  • src/java.base/share/classes/java/util/regex/Matcher.java
  • src/java.base/share/classes/java/util/regex/Pattern.java
  • src/java.base/share/classes/java/util/zip/ZipFile.java
  • src/java.base/share/classes/javax/security/auth/Subject.java
  • src/java.base/share/classes/jdk/internal/icu/text/Replaceable.java
  • src/java.base/share/classes/jdk/internal/icu/text/ReplaceableString.java
  • src/java.base/share/classes/org/checkerframework/checker/builder/qual/CalledMethods.java
  • src/java.base/share/classes/org/checkerframework/checker/formatter/qual/ConversionCategory.java
  • src/java.base/share/classes/org/checkerframework/checker/formatter/qual/FormatBottom.java
  • src/java.base/share/classes/org/checkerframework/checker/i18nformatter/qual/I18nConversionCategory.java
  • src/java.base/share/classes/org/checkerframework/checker/i18nformatter/qual/I18nFormatBottom.java
  • src/java.base/share/classes/org/checkerframework/checker/index/qual/IndexOrHigh.java
  • src/java.base/share/classes/org/checkerframework/checker/index/qual/LengthOf.java
  • src/java.base/share/classes/org/checkerframework/checker/interning/qual/InternedDistinct.java
  • src/java.base/share/classes/org/checkerframework/checker/nonempty/qual/EnsuresNonEmptyIf.java
  • src/java.base/share/classes/org/checkerframework/checker/optional/qual/RequiresPresent.java
  • src/java.base/share/classes/org/checkerframework/checker/regex/qual/RegexBottom.java
  • src/java.base/share/classes/org/checkerframework/checker/signature/qual/README.md
  • src/java.base/share/classes/org/checkerframework/checker/sqlquotes/qual/SqlQuotesBottom.java
  • src/java.base/share/classes/org/checkerframework/common/aliasing/qual/NonLeaked.java
  • src/java.base/share/classes/org/checkerframework/common/returnsreceiver/qual/UnknownThis.java
  • src/java.base/share/classes/org/checkerframework/dataflow/qual/SideEffectFree.java
  • src/java.base/share/classes/org/checkerframework/dataflow/qual/SideEffectsOnly.java
  • src/java.base/share/classes/org/checkerframework/framework/qual/ConditionalPostconditionAnnotation.java
  • src/java.base/share/classes/org/checkerframework/framework/qual/DoesNotUnrefineReceiver.java
  • src/java.base/share/classes/sun/net/www/HeaderParser.java
  • src/java.base/share/classes/sun/net/www/MessageHeader.java
  • src/java.base/share/classes/sun/security/jca/ProviderList.java
  • src/java.base/share/classes/sun/util/PreHashedMap.java
  • src/java.base/share/classes/sun/util/locale/StringTokenIterator.java
  • src/java.base/share/classes/sun/util/resources/ParallelListResourceBundle.java

Comment thread src/java.base/share/classes/java/lang/StringBuilder.java
Comment thread src/java.base/share/classes/java/util/concurrent/DelayQueue.java Outdated
Comment thread src/java.base/share/classes/java/util/concurrent/LinkedBlockingQueue.java Outdated
Comment thread src/java.base/share/classes/java/util/Deque.java Outdated
Comment thread src/java.base/share/classes/java/util/DualPivotQuicksort.java
Comment thread src/java.base/share/classes/java/util/LinkedHashSet.java Outdated
Comment thread src/java.base/share/classes/java/util/Queue.java Outdated
Comment thread src/java.base/share/classes/java/util/SortedMap.java Outdated
Comment thread src/java.base/share/classes/java/util/SortedSet.java Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/java.base/share/classes/java/util/concurrent/PriorityBlockingQueue.java (1)

913-914: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Add @DoesNotUnrefineReceiver("modifiability") to Itr.next.
PriorityBlockingQueue.Itr.next is side-effecting and should match the same receiver refinement contract used by DelayQueue and LinkedBlockingQueue.

Suggested fix
     `@SideEffectsOnly`("this")
+    `@DoesNotUnrefineReceiver`("modifiability")
     public E next(`@NonEmpty` Itr this) {
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/java.base/share/classes/java/util/concurrent/PriorityBlockingQueue.java`
around lines 913 - 914, Add `@DoesNotUnrefineReceiver`("modifiability") to
PriorityBlockingQueue.Itr.next alongside its existing `@SideEffectsOnly`("this")
annotation, matching the receiver refinement contract used by DelayQueue and
LinkedBlockingQueue.
src/java.base/share/classes/java/util/Collections.java (1)

904-906: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Fix invalid receiver annotations on a static method.

The replaceAll method is static and therefore has no receiver (this). The @SideEffectsOnly("this") and @DoesNotUnrefineReceiver annotations are intended for instance methods and are invalid here. The method mutates its first parameter (list), so the correct annotation is @SideEffectsOnly("#1").

🐛 Proposed fix
-    `@SideEffectsOnly`("this")
-    `@DoesNotUnrefineReceiver`("modifiability")
+    `@SideEffectsOnly`("`#1`")
     public static <T> boolean replaceAll(List<T> list, `@Nullable` T oldVal, T newVal) {
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/java.base/share/classes/java/util/Collections.java` around lines 904 -
906, Update the static Collections.replaceAll method annotations to reference
its first parameter rather than the nonexistent receiver: change the side-effect
target to "`#1`" and remove or replace the receiver-specific
`@DoesNotUnrefineReceiver` annotation according to the project’s
parameter-annotation conventions.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@src/java.base/share/classes/java/util/Collections.java`:
- Around line 904-906: Update the static Collections.replaceAll method
annotations to reference its first parameter rather than the nonexistent
receiver: change the side-effect target to "`#1`" and remove or replace the
receiver-specific `@DoesNotUnrefineReceiver` annotation according to the project’s
parameter-annotation conventions.

In `@src/java.base/share/classes/java/util/concurrent/PriorityBlockingQueue.java`:
- Around line 913-914: Add `@DoesNotUnrefineReceiver`("modifiability") to
PriorityBlockingQueue.Itr.next alongside its existing `@SideEffectsOnly`("this")
annotation, matching the receiver refinement contract used by DelayQueue and
LinkedBlockingQueue.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: a8ae828d-ce9b-4c74-a888-6cf4df156d28

📥 Commits

Reviewing files that changed from the base of the PR and between 21c0697 and eeaace3.

📒 Files selected for processing (10)
  • src/java.base/share/classes/java/lang/StringBuilder.java
  • src/java.base/share/classes/java/util/Collections.java
  • src/java.base/share/classes/java/util/concurrent/ArrayBlockingQueue.java
  • src/java.base/share/classes/java/util/concurrent/BlockingQueue.java
  • src/java.base/share/classes/java/util/concurrent/DelayQueue.java
  • src/java.base/share/classes/java/util/concurrent/LinkedBlockingDeque.java
  • src/java.base/share/classes/java/util/concurrent/LinkedBlockingQueue.java
  • src/java.base/share/classes/java/util/concurrent/LinkedTransferQueue.java
  • src/java.base/share/classes/java/util/concurrent/PriorityBlockingQueue.java
  • src/java.base/share/classes/java/util/concurrent/SynchronousQueue.java

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant