@@ -2,6 +2,7 @@ package kotlinx.benchmark.gradle
2
2
3
3
import org.jetbrains.org.objectweb.asm.*
4
4
import org.jetbrains.org.objectweb.asm.tree.*
5
+ import java.util.jar.*
5
6
6
7
data class AnnotationData (
7
8
val name : String ,
@@ -12,6 +13,7 @@ data class ClassAnnotationsDescriptor(
12
13
val packageName : String ,
13
14
val name : String ,
14
15
val visibility : String ,
16
+ val isAbstract : Boolean ,
15
17
val annotations : List <AnnotationData >,
16
18
val methods : List <MethodAnnotationsDescriptor >,
17
19
val fields : List <FieldAnnotationsDescriptor >
@@ -33,7 +35,20 @@ class AnnotationProcessor {
33
35
34
36
private val classAnnotationsDescriptors = mutableListOf<ClassAnnotationsDescriptor >()
35
37
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 ) {
37
52
val classReader = ClassReader (classBytes)
38
53
val classNode = ClassNode ()
39
54
classReader.accept(classNode, 0 )
@@ -64,6 +79,7 @@ class AnnotationProcessor {
64
79
packageName,
65
80
classNode.name.replace(' /' , ' .' ).substringAfterLast(' /' ),
66
81
getVisibility(classNode.access),
82
+ isAbstract(classNode.access),
67
83
classAnnotations,
68
84
methodDescriptors,
69
85
fieldDescriptors
@@ -145,13 +161,17 @@ class AnnotationProcessor {
145
161
}
146
162
}
147
163
164
+ private fun isAbstract (access : Int ): Boolean {
165
+ return (access and Opcodes .ACC_ABSTRACT ) != 0
166
+ }
167
+
148
168
fun getClassDescriptors (): List <ClassAnnotationsDescriptor > {
149
169
return classAnnotationsDescriptors
150
170
}
151
171
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 }
156
175
}
176
+
157
177
}
0 commit comments