openrewrite / openrewrite/rewrite-static-analysis
`Arrays` should not be copied using loops.`RSPEC-3012`
Nobody has claimed this yet.
- Dominant language
- Java
- Stars
- 62
- Forks
- 112
- Avg merge
- 1d 19h
- Merged PRs (30d)
- 40
Description
Using a loop to copy an array or a subset of an array is simply wasted code when there are built-in functions to do it for you. Instead, use Arrays.copyOf to copy an entire array into another array, use System.arraycopy to copy only a subset of an array into another array, and use Arrays.asList to feed the constructor of a new list with an array.
Note that Arrays.asList simply puts a Collections wrapper around the original array, so further steps are required if a non-fixed-size List is desired.
Noncompliant Code Example
public void makeCopies(String[] source) {
this.array = new String[source.length];
this.list = new ArrayList(source.length);
for (int i = 0; i < source.length; i++) {
this.array[i] = source[i]; // Noncompliant
}
for (String s : source) {
this.list.add(s); // Noncompliant
}
}
Compliant Solution
public void makeCopies(String[] source) {
this.array = Arrays.copyOf(source, source.length);
Collections.addAll(this.list, source);
}
Exceptions
Rule detects only the most idiomatic patterns, it will not consider loops with non-trivial control flow. For example, array elements that are copied conditionally are ignored.
public int[] getCopy(int[] source) {
int[] dest = new int[source.length];
for (int i = 0; i < source.length; i++) {
if (source[i] > 10) {
dest[i] = source[i]; // Compliant
}
}
return dest;
}
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reviewing the repository's existing Java static-analysis recipes and tests, then compare their structure with the RSPEC-3012 examples in this issue. Done means the recipe identifies straightforward loops that copy arrays or populate lists while ignoring loops with non-trivial control flow, with tests covering the compliant and noncompliant examples.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java
- Domain
- tooling
- Issue type
- Feature
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100