Skip to content

Commit 0bd739d

Browse files
committed
Version 2.3.0
- Support modules - Support record - Support permits - Support Nests - Support sealed class - Support attributes - Support from Java 10 to Java 17 - Support class Kind
1 parent fca219f commit 0bd739d

33 files changed

Lines changed: 650 additions & 26 deletions

‎build.gradle‎

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
buildscript {
2-
ext.kotlin_version = '1.4.32'
2+
ext.kotlin_version = '1.5.21'
33

44
repositories {
55
mavenCentral()
@@ -11,12 +11,13 @@ buildscript {
1111
}
1212

1313
plugins {
14-
id 'com.github.hierynomus.license' version '0.15.0'
14+
id 'com.github.hierynomus.license' version '0.16.1'
1515
id 'com.github.johnrengelman.shadow' version '6.1.0'
16+
id 'maven-publish'
1617
}
1718

1819
group 'com.github.jonathanxd'
19-
version '2.2.0'
20+
version '2.3.0'
2021

2122
apply plugin: 'java'
2223
apply plugin: 'kotlin'
@@ -31,14 +32,14 @@ repositories {
3132

3233
dependencies {
3334
// Kotlin
34-
compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
35+
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
3536

3637
// ASM
37-
compile "org.ow2.asm:asm:6.0"
38-
compile "org.ow2.asm:asm-tree:6.0"
39-
compile "org.ow2.asm:asm-util:6.0"
38+
implementation "org.ow2.asm:asm:9.2"
39+
implementation "org.ow2.asm:asm-tree:9.2"
40+
implementation "org.ow2.asm:asm-util:9.2"
4041

41-
testCompile group: 'junit', name: 'junit', version: '4.11'
42+
testImplementation group: 'junit', name: 'junit', version: '4.11'
4243
}
4344

4445
// Tasks
@@ -99,3 +100,19 @@ license {
99100
kt = 'JAVADOC_STYLE'
100101
}
101102
}
103+
104+
publishing {
105+
repositories {
106+
maven {
107+
// change to point to your repo, e.g. http://my.org/repo
108+
url = "$buildDir/repo"
109+
}
110+
}
111+
publications {
112+
maven(MavenPublication) {
113+
from components.kotlin
114+
115+
artifact sourcesJar
116+
}
117+
}
118+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists

‎src/main/kotlin/com/github/jonathanxd/bytecodedisassembler/Appender.kt‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
*
44
* The MIT License (MIT)
55
*
6-
* Copyright (c) 2020 JonathanxD <jonathan.scripter@programmer.net>
6+
* Copyright (c) 2021 JonathanxD <jonathan.scripter@programmer.net>
77
* Copyright (c) contributors
88
*
99
*

‎src/main/kotlin/com/github/jonathanxd/bytecodedisassembler/ClassNodeParser.kt‎

Lines changed: 117 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
*
44
* The MIT License (MIT)
55
*
6-
* Copyright (c) 2020 JonathanxD <jonathan.scripter@programmer.net>
6+
* Copyright (c) 2021 JonathanxD <jonathan.scripter@programmer.net>
77
* Copyright (c) contributors
88
*
99
*
@@ -27,6 +27,7 @@
2727
*/
2828
package com.github.jonathanxd.bytecodedisassembler
2929

30+
import org.objectweb.asm.Attribute
3031
import org.objectweb.asm.Type
3132
import org.objectweb.asm.tree.*
3233
import java.util.*
@@ -74,6 +75,91 @@ object ClassNodeParser {
7475
appender.append("!extends: ${classNode.superName}")
7576
appender.append("!implements: ${classNode.interfaces}")
7677

78+
classNode.nestHostClass?.let {
79+
appender.append("!NestHost: $it")
80+
}
81+
82+
classNode.nestMembers.orEmpty().forEach {
83+
appender.append("!NestMember: $it")
84+
}
85+
86+
classNode.attrs.orEmpty().forEach {
87+
it.readAttribute(appender)
88+
}
89+
90+
val isModule = classNode.module != null
91+
92+
if (isModule) {
93+
classNode.module?.let {
94+
val modsStr = Util.parseAsModifiersStr(Util.CLASS, it.access)
95+
val modsstr = if (modsStr.isEmpty()) "" else "$modsStr "
96+
appender.append("${modsstr}module ${it.name} {")
97+
val fi = Appender.FourIndent(appender)
98+
99+
fi.append("!mainClass: ${it.mainClass}")
100+
fi.append("!version: ${it.version}")
101+
102+
val packages = it.packages.orEmpty()
103+
if (packages.isNotEmpty()) {
104+
fi.append("packages: $packages")
105+
}
106+
107+
val exports = it.exports.orEmpty()
108+
if (exports.isNotEmpty()) {
109+
fi.append("exports {")
110+
val fi1 = Appender.FourIndent(fi)
111+
exports.forEach {
112+
fi1.append("!modifiers: ${Util.parseAsModifiersStr(Util.CLASS, it.access)}")
113+
fi1.append("!package: ${it.packaze}")
114+
fi1.append("!modules: ${it.modules}")
115+
}
116+
fi.append("}")
117+
}
118+
119+
val opens = it.opens.orEmpty()
120+
if (opens.isNotEmpty()) {
121+
fi.append("opens {")
122+
val fi1 = Appender.FourIndent(fi)
123+
opens.forEach {
124+
fi1.append("!modifiers: ${Util.parseAsModifiersStr(Util.CLASS, it.access)}")
125+
fi1.append("!package: ${it.packaze}")
126+
fi1.append("!modules: ${it.modules}")
127+
}
128+
fi.append("}")
129+
}
130+
131+
val uses = it.uses.orEmpty()
132+
if (uses.isNotEmpty()) {
133+
fi.append("uses: $uses")
134+
}
135+
136+
val provides = it.provides.orEmpty()
137+
if (provides.isNotEmpty()) {
138+
fi.append("provides {")
139+
val fi1 = Appender.FourIndent(fi)
140+
provides.forEach {
141+
fi1.append("!service: ${it.service}")
142+
fi1.append("!providers: ${it.providers}")
143+
}
144+
fi.append("}")
145+
}
146+
147+
val requires = it.requires.orEmpty()
148+
if (requires.isNotEmpty()) {
149+
fi.append("requires {")
150+
val fi1 = Appender.FourIndent(fi)
151+
requires.forEach {
152+
fi1.append("!modifiers: ${Util.parseAsModifiersStr(Util.CLASS, it.access)}")
153+
fi1.append("!module: ${it.module}")
154+
fi1.append("!version: ${it.version}")
155+
}
156+
fi.append("}")
157+
}
158+
159+
//appender.append("}")
160+
}
161+
}
162+
77163
val modsStr = Util.parseAsModifiersStr(Util.CLASS, classNode.access)
78164
val ext = if (classNode.superName != null) " extends ${Util.parseType(classNode.superName)}" else ""
79165
val ext2 = if (classNode.interfaces != null && classNode.interfaces.isNotEmpty()) " implements ${classNode.interfaces.map { Util.parseType(it as String) }.joinToString()}" else ""
@@ -84,7 +170,18 @@ object ClassNodeParser {
84170
appender.append(parseAnnotationNode(it))
85171
}
86172

87-
appender.append("$modsStr class ${Util.parseType(classNode.name)}$ext$ext2 {")
173+
val permits = classNode.permittedSubclasses.orEmpty()
174+
175+
permits.forEach {
176+
appender.append("!permits: $it")
177+
}
178+
179+
val sealed = if (permits.isNotEmpty()) "sealed " else ""
180+
val modsstr = if (modsStr.isEmpty()) "" else "$modsStr "
181+
val kind = Util.parseClassKind(classNode.access)
182+
if (!isModule) {
183+
appender.append("$modsstr$sealed$kind ${Util.parseType(classNode.name)}$ext$ext2 {")
184+
}
88185

89186
appender.append("")
90187

@@ -93,8 +190,15 @@ object ClassNodeParser {
93190
// Inner classes
94191
val innerClasses = classNode.innerClasses.orEmpty() as List<InnerClassNode>
95192

96-
innerClasses.forEach {
97-
indented.append(parseInnerClassNode(it))
193+
if (innerClasses.isNotEmpty()) {
194+
indented.append("inner {")
195+
val sub = Appender.FourIndent(indented)
196+
197+
innerClasses.forEach {
198+
sub.append(parseInnerClassNode(it))
199+
}
200+
201+
indented.append("}")
98202
}
99203

100204
if (innerClasses.isNotEmpty())
@@ -177,6 +281,15 @@ object ClassNodeParser {
177281
buffer.append(Util.parseArrayValue(value))
178282
}
179283

284+
private fun Attribute.readAttribute(appender: Appender) {
285+
appender.append("!Attribute: {")
286+
val fi = Appender.FourIndent(appender)
287+
fi.append("Type: ${this.type}")
288+
fi.append("Unknown: ${this.isUnknown}")
289+
fi.append("CodeAttribute: ${this.isCodeAttribute}")
290+
appender.append("}")
291+
}
292+
180293
private fun parseInnerClassNode(innerClassNode: InnerClassNode): String {
181294
return "!access: ${Util.parseAccess(Util.CLASS, innerClassNode.access)} (${innerClassNode.access})\n" +
182295
"${Util.parseAsModifiersStr(Util.CLASS, innerClassNode.access)} ${Util.parseType(innerClassNode.outerName)}.${innerClassNode.innerName} -> ${Util.parseType(innerClassNode.name)}"

‎src/main/kotlin/com/github/jonathanxd/bytecodedisassembler/Disassembler.kt‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
*
44
* The MIT License (MIT)
55
*
6-
* Copyright (c) 2020 JonathanxD <jonathan.scripter@programmer.net>
6+
* Copyright (c) 2021 JonathanxD <jonathan.scripter@programmer.net>
77
* Copyright (c) contributors
88
*
99
*

‎src/main/kotlin/com/github/jonathanxd/bytecodedisassembler/LabelMapper.kt‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
*
44
* The MIT License (MIT)
55
*
6-
* Copyright (c) 2020 JonathanxD <jonathan.scripter@programmer.net>
6+
* Copyright (c) 2021 JonathanxD <jonathan.scripter@programmer.net>
77
* Copyright (c) contributors
88
*
99
*

‎src/main/kotlin/com/github/jonathanxd/bytecodedisassembler/MethodInstructionsParser.kt‎

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
*
44
* The MIT License (MIT)
55
*
6-
* Copyright (c) 2020 JonathanxD <jonathan.scripter@programmer.net>
6+
* Copyright (c) 2021 JonathanxD <jonathan.scripter@programmer.net>
77
* Copyright (c) contributors
88
*
99
*
@@ -27,10 +27,12 @@
2727
*/
2828
package com.github.jonathanxd.bytecodedisassembler
2929

30+
import org.objectweb.asm.ConstantDynamic
3031
import org.objectweb.asm.Handle
3132
import org.objectweb.asm.Opcodes
3233
import org.objectweb.asm.Type
3334
import org.objectweb.asm.tree.*
35+
import org.objectweb.asm.util.Printer
3436

3537
object MethodInstructionsParser {
3638

@@ -109,7 +111,10 @@ object MethodInstructionsParser {
109111
fun Handle?.asStr() =
110112
if (this == null) "null" else "${Util.parseType(this.owner)}.${this.name}${Util.parseDesc(this.desc)} (tag: ${Util.getHandleTagName(this.tag)}, itf: ${this.isInterface})"
111113

112-
val bsmArgsStr = it.bsmArgs.orEmpty().map { (it as? Handle)?.asStr() ?: it.toString() }
114+
val bsmArgsStr = it.bsmArgs.orEmpty().map {
115+
(it as? Handle)?.asStr()
116+
?: if (it is String) it.surrogate() else it.toString()
117+
}
113118

114119
normalAppender.append("invokedynamic ${it.name}${Util.parseDesc(it.desc)} [")
115120

@@ -154,4 +159,10 @@ object MethodInstructionsParser {
154159
}
155160

156161
}
162+
163+
private fun String.surrogate(): String {
164+
val sb = StringBuilder()
165+
Printer.appendString(sb, this)
166+
return sb.toString()
167+
}
157168
}

0 commit comments

Comments
 (0)