Skip to content

Commit 70b5f1d

Browse files
committed
Replace RelocatorRemapper with ShadowClassRemapper
1 parent acb7c7a commit 70b5f1d

3 files changed

Lines changed: 56 additions & 60 deletions

File tree

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

Lines changed: 0 additions & 54 deletions
This file was deleted.
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.github.jengelman.gradle.plugins.shadow.internal
2+
3+
import org.objectweb.asm.ClassVisitor
4+
import org.objectweb.asm.commons.ClassRemapper
5+
import org.objectweb.asm.commons.Remapper
6+
7+
/**
8+
* Modified from [org.apache.maven.plugins.shade.DefaultShader.ShadeClassRemapper.java](https://github.com/apache/maven-shade-plugin/blob/5115e41e66ac19f10b661e63f8de76ad3e5905d2/src/main/java/org/apache/maven/plugins/shade/DefaultShader.java#L808-L844).
9+
*/
10+
internal class ShadowClassRemapper(
11+
classVisitor: ClassVisitor,
12+
private val packageMapper: PackageMapper,
13+
private val pkg: String,
14+
remapper: Remapper = object : Remapper() {
15+
override fun mapValue(value: Any): Any {
16+
return if (value is String) {
17+
packageMapper.map(value, mapPaths = true, mapPackages = true)
18+
} else {
19+
super.mapValue(value)
20+
}
21+
}
22+
23+
override fun map(internalName: String): String {
24+
return packageMapper.map(internalName, mapPaths = true, mapPackages = false)
25+
}
26+
},
27+
) : ClassRemapper(classVisitor, remapper),
28+
PackageMapper {
29+
private var remapped = false
30+
31+
override fun visitSource(source: String?, debug: String?) {
32+
if (source == null) return super.visitSource(null, debug)
33+
34+
val fqSource: String = pkg + source
35+
val mappedSource = map(fqSource, mapPaths = true, mapPackages = false)
36+
val filename = mappedSource.substring(mappedSource.lastIndexOf('/') + 1)
37+
super.visitSource(filename, debug)
38+
}
39+
40+
override fun map(entityName: String, mapPaths: Boolean, mapPackages: Boolean): String {
41+
val mapped = packageMapper.map(entityName, mapPaths, mapPackages)
42+
if (!remapped) {
43+
remapped = mapped != entityName
44+
}
45+
return mapped
46+
}
47+
}

src/main/kotlin/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowCopyAction.kt

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.github.jengelman.gradle.plugins.shadow.tasks
22

3-
import com.github.jengelman.gradle.plugins.shadow.internal.RelocatorRemapper
3+
import com.github.jengelman.gradle.plugins.shadow.internal.DefaultPackageMapper
4+
import com.github.jengelman.gradle.plugins.shadow.internal.ShadowClassRemapper
45
import com.github.jengelman.gradle.plugins.shadow.internal.cast
56
import com.github.jengelman.gradle.plugins.shadow.internal.zipEntry
67
import com.github.jengelman.gradle.plugins.shadow.relocation.Relocator
@@ -24,7 +25,6 @@ import org.gradle.api.tasks.WorkResult
2425
import org.gradle.api.tasks.WorkResults
2526
import org.objectweb.asm.ClassReader
2627
import org.objectweb.asm.ClassWriter
27-
import org.objectweb.asm.commons.ClassRemapper
2828

2929
/**
3030
* Modified from [org.gradle.api.internal.file.archive.ZipCopyAction.java](https://github.com/gradle/gradle/blob/b893c2b085046677cf858fb3d5ce00e68e556c3a/platforms/core-configuration/file-operations/src/main/java/org/gradle/api/internal/file/archive/ZipCopyAction.java).
@@ -124,7 +124,7 @@ public open class ShadowCopyAction(
124124
private inner class StreamAction(
125125
private val zipOutStr: ZipOutputStream,
126126
) : CopyActionProcessingStreamAction {
127-
private val remapper = RelocatorRemapper(relocators)
127+
private val packageMapper = DefaultPackageMapper(relocators)
128128

129129
init {
130130
logger.info("Relocator count: ${relocators.size}.")
@@ -155,7 +155,7 @@ public open class ShadowCopyAction(
155155
}
156156
fileDetails.remapClass()
157157
} else {
158-
val mapped = remapper.map(path)
158+
val mapped = packageMapper.map(path, mapPaths = true, mapPackages = true)
159159
if (transform(fileDetails, mapped)) return
160160
fileDetails.writeToZip(mapped)
161161
}
@@ -184,7 +184,8 @@ public open class ShadowCopyAction(
184184
// that use the constant pool to determine the dependencies of a class.
185185
val cw = ClassWriter(0)
186186
val cr = ClassReader(inputStream)
187-
val cv = ClassRemapper(cw, remapper)
187+
val pkg = name.substring(0, name.lastIndexOf('/') + 1)
188+
val cv = ShadowClassRemapper(cw, packageMapper, pkg)
188189

189190
try {
190191
cr.accept(cv, ClassReader.EXPAND_FRAMES)
@@ -195,7 +196,9 @@ public open class ShadowCopyAction(
195196
// Temporarily remove the multi-release prefix.
196197
val multiReleasePrefix = "^META-INF/versions/\\d+/".toRegex().find(path)?.value.orEmpty()
197198
val newPath = path.replace(multiReleasePrefix, "")
198-
val mappedName = multiReleasePrefix + remapper.mapPath(newPath)
199+
val mappedName = multiReleasePrefix + packageMapper.map(newPath, mapPaths = true, mapPackages = false)
200+
// Need to take the .class off for remapping evaluation
201+
.substringBeforeLast('.')
199202
try {
200203
val entry = zipEntry("$mappedName.class", preserveFileTimestamps, lastModified) {
201204
unixMode = UnixStat.FILE_FLAG or permissions.toUnixNumeric()

0 commit comments

Comments
 (0)