Skip to content

Commit 51a8ded

Browse files
committed
update 'AnnotationProcessor' to process jar file
1 parent 353428e commit 51a8ded

File tree

2 files changed

+26
-16
lines changed

2 files changed

+26
-16
lines changed

plugin/main/src/kotlinx/benchmark/gradle/AndroidTasks.kt

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,8 @@ fun Project.unpackAndProcessAar(target: KotlinJvmAndroidCompilation) {
2323
if (classesJar.exists()) {
2424
println("Processing classes.jar for ${target.name}")
2525
val jar = JarFile(classesJar)
26-
val entries = jar.entries()
27-
2826
val annotationProcessor = AnnotationProcessor()
29-
30-
while (entries.hasMoreElements()) {
31-
val entry = entries.nextElement()
32-
if (entry.name.endsWith(".class")) {
33-
val inputStream = jar.getInputStream(entry)
34-
val classBytes = inputStream.readBytes()
35-
annotationProcessor.processClassBytes(classBytes)
36-
}
37-
}
27+
annotationProcessor.processJarFile(jar)
3828
jar.close()
3929

4030
val classAnnotationsDescriptors = annotationProcessor.getClassDescriptors()

plugin/main/src/kotlinx/benchmark/gradle/AnnotationProcessor.kt

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package kotlinx.benchmark.gradle
22

33
import org.jetbrains.org.objectweb.asm.*
44
import org.jetbrains.org.objectweb.asm.tree.*
5+
import java.util.jar.*
56

67
data class AnnotationData(
78
val name: String,
@@ -12,6 +13,7 @@ data class ClassAnnotationsDescriptor(
1213
val packageName: String,
1314
val name: String,
1415
val visibility: String,
16+
val isAbstract: Boolean,
1517
val annotations: List<AnnotationData>,
1618
val methods: List<MethodAnnotationsDescriptor>,
1719
val fields: List<FieldAnnotationsDescriptor>
@@ -33,7 +35,20 @@ class AnnotationProcessor {
3335

3436
private val classAnnotationsDescriptors = mutableListOf<ClassAnnotationsDescriptor>()
3537

36-
fun processClassBytes(classBytes: ByteArray) {
38+
fun processJarFile(jarFile: JarFile) {
39+
val entries = jarFile.entries()
40+
41+
while (entries.hasMoreElements()) {
42+
val entry = entries.nextElement()
43+
if (entry.name.endsWith(".class")) {
44+
val inputStream = jarFile.getInputStream(entry)
45+
val classBytes = inputStream.readBytes()
46+
processClassBytes(classBytes)
47+
}
48+
}
49+
}
50+
51+
private fun processClassBytes(classBytes: ByteArray) {
3752
val classReader = ClassReader(classBytes)
3853
val classNode = ClassNode()
3954
classReader.accept(classNode, 0)
@@ -64,6 +79,7 @@ class AnnotationProcessor {
6479
packageName,
6580
classNode.name.replace('/', '.').substringAfterLast('/'),
6681
getVisibility(classNode.access),
82+
isAbstract(classNode.access),
6783
classAnnotations,
6884
methodDescriptors,
6985
fieldDescriptors
@@ -145,13 +161,17 @@ class AnnotationProcessor {
145161
}
146162
}
147163

164+
private fun isAbstract(access: Int): Boolean {
165+
return (access and Opcodes.ACC_ABSTRACT) != 0
166+
}
167+
148168
fun getClassDescriptors(): List<ClassAnnotationsDescriptor> {
149169
return classAnnotationsDescriptors
150170
}
151171

152-
fun getClassAnnotations(packageName: String, className: String): List<AnnotationData> {
153-
return classAnnotationsDescriptors
154-
.filter { it.packageName == packageName && it.name == className }
155-
.flatMap { it.annotations }
172+
fun getPublicClassNames(): List<Pair<String, String>> {
173+
return classAnnotationsDescriptors.filter { it.visibility == "public" && !it.isAbstract }
174+
.map { it.packageName to it.name }
156175
}
176+
157177
}

0 commit comments

Comments
 (0)