Skip to content

Commit 0564cae

Browse files
CopilotGoooler
andauthored
Fix skipStringConstants per-relocator behavior: use continue instead of return (#1968)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Goooler <10363352+Goooler@users.noreply.github.com>
1 parent 8d995b2 commit 0564cae

3 files changed

Lines changed: 29 additions & 5 deletions

File tree

docs/changes/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
### Fixed
2121

2222
- Fix interaction with Gradle artifact transforms. ([#1345](https://github.com/GradleUp/shadow/pull/1345))
23+
- Fix skipStringConstants per-relocator behavior in mapName. ([#1968](https://github.com/GradleUp/shadow/pull/1968))
2324

2425
## [9.3.2](https://github.com/GradleUp/shadow/releases/tag/9.3.2) - 2026-02-27
2526

src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/Relocators.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ private val classPattern: Pattern = Pattern.compile("([\\[()BCDFIJSZ]*)?L([^;]+)
1111
internal fun Set<Relocator>.mapName(
1212
name: String,
1313
mapLiterals: Boolean = false,
14-
onModified: () -> Unit,
14+
onModified: () -> Unit = {},
1515
): String {
1616
// Maybe a list of types.
1717
val newName = name.split(';').joinToString(";") { realMap(it, mapLiterals) }
@@ -35,7 +35,7 @@ private fun Set<Relocator>.realMap(name: String, mapLiterals: Boolean): String {
3535

3636
for (relocator in this) {
3737
if (mapLiterals && relocator.skipStringConstants) {
38-
return name
38+
continue
3939
} else if (relocator.canRelocateClass(newName)) {
4040
return prefix + relocator.relocateClass(newName) + suffix
4141
} else if (relocator.canRelocatePath(newName)) {

src/test/kotlin/com/github/jengelman/gradle/plugins/shadow/relocation/RelocatorsTest.kt

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.github.jengelman.gradle.plugins.shadow.relocation
33
import assertk.assertThat
44
import assertk.assertions.isEqualTo
55
import com.github.jengelman.gradle.plugins.shadow.internal.mapName
6+
import org.junit.jupiter.api.Test
67
import org.junit.jupiter.params.ParameterizedTest
78
import org.junit.jupiter.params.provider.Arguments
89
import org.junit.jupiter.params.provider.MethodSource
@@ -11,12 +12,34 @@ class RelocatorsTest {
1112
@ParameterizedTest
1213
@MethodSource("signaturePatternsProvider")
1314
fun relocateSignaturePatterns(input: String, expected: String) {
14-
val actual =
15-
setOf(SimpleRelocator("org.package", "shadow.org.package"))
16-
.mapName(name = input, onModified = {})
15+
val actual = setOf(SimpleRelocator("org.package", "shadow.org.package")).mapName(name = input)
1716
assertThat(actual).isEqualTo(expected)
1817
}
1918

19+
/**
20+
* Verifies that a relocator with [Relocator.skipStringConstants] = true is skipped individually
21+
* when mapping literals, rather than short-circuiting the entire set of relocators.
22+
*/
23+
@Test
24+
fun skipStringConstantsIsPerRelocator() {
25+
val skippingRelocator =
26+
SimpleRelocator("org.package", "shadow.org.package", skipStringConstants = true)
27+
val normalRelocator = SimpleRelocator("com.example", "shadow.com.example")
28+
val relocators = linkedSetOf(skippingRelocator, normalRelocator)
29+
30+
// The skipping relocator cannot match "com.example.Foo", but the normal one can.
31+
// Ensure the normal relocator is still applied even though the first one has
32+
// skipStringConstants.
33+
assertThat(relocators.mapName("com.example.Foo", mapLiterals = true))
34+
.isEqualTo("shadow.com.example.Foo")
35+
// When mapLiterals=true, the skipping relocator should not apply to its own pattern.
36+
assertThat(relocators.mapName("org.package.Bar", mapLiterals = true))
37+
.isEqualTo("org.package.Bar")
38+
// When mapLiterals=false, the skipping relocator applies normally.
39+
assertThat(relocators.mapName("org.package.Bar", mapLiterals = false))
40+
.isEqualTo("shadow.org.package.Bar")
41+
}
42+
2043
private companion object {
2144
val primitiveTypes = setOf('B', 'C', 'D', 'F', 'I', 'J', 'S', 'Z')
2245

0 commit comments

Comments
 (0)