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 *
2727 */
2828package com.github.jonathanxd.bytecodedisassembler
2929
30+ import org.objectweb.asm.Attribute
3031import org.objectweb.asm.Type
3132import org.objectweb.asm.tree.*
3233import 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)} "
0 commit comments