Skip to content

Commit 0fc59cc

Browse files
GooolerCopilot
andauthored
Support relocating list of types in RelocatorRemapper (#1714)
* Test `relocateMultiClassSignatureStringConstants` * Update `RelocatorRemapper` * Comment `classPattern` * Add unit test for `RelocatorRemapperTest` * Update changelog * Update src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/RelocatorRemapper.kt Co-authored-by: Copilot <[email protected]> * Update src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/RelocatorRemapper.kt Co-authored-by: Copilot <[email protected]> * Cleanups * Update src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/internal/RelocatorRemapper.kt Co-authored-by: Copilot <[email protected]> --------- Co-authored-by: Copilot <[email protected]>
1 parent 18d71d3 commit 0fc59cc

File tree

4 files changed

+90
-2
lines changed

4 files changed

+90
-2
lines changed

docs/changes/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
- Support relocating Groovy extensions in Module descriptors. ([#1705](https://github.com/GradleUp/shadow/pull/1705))
99
- Add extensions for `Iterable<Relocator>`. ([#1710](https://github.com/GradleUp/shadow/pull/1710))
10+
- Support relocating list of types in `RelocatorRemapper`. ([#1714](https://github.com/GradleUp/shadow/pull/1714))
1011

1112
### Changed
1213

src/functionalTest/kotlin/com/github/jengelman/gradle/plugins/shadow/RelocationTest.kt

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,45 @@ class RelocationTest : BasePluginTest() {
533533
}
534534
}
535535

536+
@Issue(
537+
"https://github.com/GradleUp/shadow/issues/1403",
538+
)
539+
@Test
540+
fun relocateMultiClassSignatureStringConstants() {
541+
writeClass {
542+
"""
543+
package my;
544+
public class Main {
545+
public static void main(String[] args) {
546+
System.out.println("Lorg/package/ClassA;Lorg/package/ClassB;");
547+
System.out.println("(Lorg/package/ClassC;Lorg/package/ClassD;)");
548+
System.out.println("()Lorg/package/ClassE;Lorg/package/ClassF;");
549+
}
550+
}
551+
""".trimIndent()
552+
}
553+
projectScript.appendText(
554+
"""
555+
$shadowJarTask {
556+
manifest {
557+
attributes '$mainClassAttributeKey': 'my.Main'
558+
}
559+
relocate('org.package', 'shadow.org.package')
560+
}
561+
""".trimIndent(),
562+
)
563+
564+
run(shadowJarPath)
565+
val result = runProcess("java", "-jar", outputShadowedJar.use { it.toString() })
566+
567+
// Just check that the jar can be executed without NoClassDefFoundError.
568+
assertThat(result).contains(
569+
"Lshadow/org/package/ClassA;Lshadow/org/package/ClassB",
570+
"Lshadow/org/package/ClassC;Lshadow/org/package/ClassD",
571+
"Lshadow/org/package/ClassE;Lshadow/org/package/ClassF",
572+
)
573+
}
574+
536575
@Test
537576
fun classBytesUnchangedIfPossible() {
538577
val mainClassEntry = writeClass()

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ internal class RelocatorRemapper(
1616
private val relocators: Set<Relocator>,
1717
private val onModified: () -> Unit = {},
1818
) : Remapper() {
19-
private val classPattern: Pattern = Pattern.compile("(\\[*)?L(.+)")
2019

2120
override fun mapValue(value: Any): Any {
2221
return if (value is String) {
@@ -29,7 +28,11 @@ internal class RelocatorRemapper(
2928
override fun map(internalName: String): String = mapName(internalName)
3029

3130
private fun mapName(name: String, mapLiterals: Boolean = false): String {
32-
val newName = mapNameImpl(name, mapLiterals)
31+
// Maybe a list of types.
32+
val newName = name.split(';').joinToString(";") {
33+
mapNameImpl(it, mapLiterals)
34+
}
35+
3336
if (newName != name) {
3437
onModified()
3538
}
@@ -60,4 +63,8 @@ internal class RelocatorRemapper(
6063

6164
return name
6265
}
66+
67+
private companion object {
68+
val classPattern: Pattern = Pattern.compile("([\\[()]*)?L([^;]+);?")
69+
}
6370
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.github.jengelman.gradle.plugins.shadow.relocation
2+
3+
import assertk.assertThat
4+
import assertk.assertions.isEqualTo
5+
import com.github.jengelman.gradle.plugins.shadow.internal.RelocatorRemapper
6+
import org.junit.jupiter.params.ParameterizedTest
7+
import org.junit.jupiter.params.provider.Arguments
8+
import org.junit.jupiter.params.provider.MethodSource
9+
10+
class RelocatorRemapperTest {
11+
@ParameterizedTest
12+
@MethodSource("classSignatureStringConstants")
13+
fun relocateSignaturePatterns(input: String, expected: String) {
14+
val relocator = RelocatorRemapper(
15+
relocators = setOf(
16+
SimpleRelocator("org.package", "shadow.org.package"),
17+
),
18+
)
19+
assertThat(relocator.map(input)).isEqualTo(expected)
20+
}
21+
22+
private companion object {
23+
@JvmStatic
24+
fun classSignatureStringConstants() = listOf(
25+
// Normal class.
26+
Arguments.of("Lorg/package/ClassA;", "Lshadow/org/package/ClassA;"),
27+
// Array class.
28+
Arguments.of("[Lorg/package/ClassA;", "[Lshadow/org/package/ClassA;"),
29+
// Multidimensional array of class.
30+
Arguments.of("[[Lorg/package/ClassA;", "[[Lshadow/org/package/ClassA;"),
31+
// Multiple classes.
32+
Arguments.of("Lorg/package/ClassA;Lorg/package/ClassB;", "Lshadow/org/package/ClassA;Lshadow/org/package/ClassB;"),
33+
// Multiple classes.
34+
Arguments.of("Ljava/lang/Object;Lorg/package/ClassB;", "Ljava/lang/Object;Lshadow/org/package/ClassB;"),
35+
// Method arguments.
36+
Arguments.of("(Lorg/package/ClassA;Lorg/package/ClassB;)", "(Lshadow/org/package/ClassA;Lshadow/org/package/ClassB;)"),
37+
// Method return types.
38+
Arguments.of("()Lorg/package/ClassA;Lorg/package/ClassB;", "()Lshadow/org/package/ClassA;Lshadow/org/package/ClassB;"),
39+
)
40+
}
41+
}

0 commit comments

Comments
 (0)