Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
极致猎手
jadx
提交
bd3e6261
J
jadx
项目概览
极致猎手
/
jadx
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
jadx
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
bd3e6261
编写于
1月 31, 2022
作者:
S
Skylot
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix: correct inline for enums in `j$.time.temporal`
上级
00b48473
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
89 addition
and
65 deletion
+89
-65
jadx-core/src/main/java/jadx/core/codegen/ClassGen.java
jadx-core/src/main/java/jadx/core/codegen/ClassGen.java
+1
-1
jadx-core/src/main/java/jadx/core/dex/visitors/EnumVisitor.java
...ore/src/main/java/jadx/core/dex/visitors/EnumVisitor.java
+20
-6
jadx-core/src/main/java/jadx/core/dex/visitors/ProcessAnonymous.java
...rc/main/java/jadx/core/dex/visitors/ProcessAnonymous.java
+17
-4
jadx-core/src/test/java/jadx/tests/api/utils/assertj/JadxCodeAssertions.java
...java/jadx/tests/api/utils/assertj/JadxCodeAssertions.java
+9
-10
jadx-core/src/test/java/jadx/tests/integration/enums/TestEnums2.java
...rc/test/java/jadx/tests/integration/enums/TestEnums2.java
+22
-23
jadx-core/src/test/java/jadx/tests/integration/enums/TestEnumsInterface.java
...java/jadx/tests/integration/enums/TestEnumsInterface.java
+20
-21
未找到文件。
jadx-core/src/main/java/jadx/core/codegen/ClassGen.java
浏览文件 @
bd3e6261
...
...
@@ -459,7 +459,7 @@ public class ClassGen {
}
if
(
f
.
getCls
()
!=
null
)
{
code
.
add
(
' '
);
new
ClassGen
(
f
.
getCls
(),
this
).
addClassBody
(
code
);
new
ClassGen
(
f
.
getCls
(),
this
).
addClassBody
(
code
,
true
);
}
if
(
it
.
hasNext
())
{
code
.
add
(
','
);
...
...
jadx-core/src/main/java/jadx/core/dex/visitors/EnumVisitor.java
浏览文件 @
bd3e6261
...
...
@@ -71,7 +71,14 @@ public class EnumVisitor extends AbstractVisitor {
@Override
public
boolean
visit
(
ClassNode
cls
)
throws
JadxException
{
if
(!
convertToEnum
(
cls
))
{
boolean
converted
;
try
{
converted
=
convertToEnum
(
cls
);
}
catch
(
Exception
e
)
{
cls
.
addWarnComment
(
"Enum visitor error"
,
e
);
converted
=
false
;
}
if
(!
converted
)
{
AccessInfo
accessFlags
=
cls
.
getAccessFlags
();
if
(
accessFlags
.
isEnum
())
{
cls
.
setAccessFlags
(
accessFlags
.
remove
(
AccessFlags
.
ENUM
));
...
...
@@ -179,8 +186,7 @@ public class EnumVisitor extends AbstractVisitor {
if
(!
enumClsInfo
.
equals
(
cls
.
getClassInfo
()))
{
ClassNode
enumCls
=
cls
.
root
().
resolveClass
(
enumClsInfo
);
if
(
enumCls
!=
null
)
{
processEnumCls
(
enumField
,
enumCls
);
cls
.
addInlinedClass
(
enumCls
);
processEnumCls
(
cls
,
enumField
,
enumCls
);
}
}
List
<
RegisterArg
>
regs
=
new
ArrayList
<>();
...
...
@@ -381,7 +387,11 @@ public class EnumVisitor extends AbstractVisitor {
if
(
constrCls
==
null
)
{
return
null
;
}
if
(!
clsInfo
.
equals
(
cls
.
getClassInfo
())
&&
!
constrCls
.
getAccessFlags
().
isEnum
())
{
if
(
constrCls
.
equals
(
cls
))
{
// allow same class
}
else
if
(
constrCls
.
contains
(
AFlag
.
ANONYMOUS_CLASS
))
{
// allow external class already marked as anonymous
}
else
{
return
null
;
}
MethodNode
ctrMth
=
cls
.
root
().
resolveMethod
(
co
.
getCallMth
());
...
...
@@ -466,7 +476,7 @@ public class EnumVisitor extends AbstractVisitor {
return
InsnUtils
.
searchInsn
(
mth
,
InsnType
.
SGET
,
insnTest
)
!=
null
;
}
private
static
void
processEnumCls
(
EnumField
field
,
ClassNode
innerCls
)
{
private
static
void
processEnumCls
(
ClassNode
cls
,
EnumField
field
,
ClassNode
innerCls
)
{
// remove constructor, because it is anonymous class
for
(
MethodNode
innerMth
:
innerCls
.
getMethods
())
{
if
(
innerMth
.
getAccessFlags
().
isConstructor
())
{
...
...
@@ -474,7 +484,11 @@ public class EnumVisitor extends AbstractVisitor {
}
}
field
.
setCls
(
innerCls
);
innerCls
.
add
(
AFlag
.
DONT_GENERATE
);
if
(!
innerCls
.
getParentClass
().
equals
(
cls
))
{
// not inner
cls
.
addInlinedClass
(
innerCls
);
innerCls
.
add
(
AFlag
.
DONT_GENERATE
);
}
}
private
ConstructorInsn
getConstructorInsn
(
InsnNode
insn
)
{
...
...
jadx-core/src/main/java/jadx/core/dex/visitors/ProcessAnonymous.java
浏览文件 @
bd3e6261
...
...
@@ -42,10 +42,7 @@ public class ProcessAnonymous extends AbstractVisitor {
}
private
static
void
markAnonymousClass
(
ClassNode
cls
)
{
boolean
synthetic
=
cls
.
getAccessFlags
().
isSynthetic
()
||
cls
.
getClassInfo
().
getShortName
().
contains
(
"$"
)
||
Character
.
isDigit
(
cls
.
getClassInfo
().
getShortName
().
charAt
(
0
));
if
(!
synthetic
)
{
if
(!
canBeAnonymous
(
cls
))
{
return
;
}
MethodNode
anonymousConstructor
=
checkUsage
(
cls
);
...
...
@@ -77,6 +74,22 @@ public class ProcessAnonymous extends AbstractVisitor {
}
}
private
static
boolean
canBeAnonymous
(
ClassNode
cls
)
{
if
(
cls
.
getAccessFlags
().
isSynthetic
())
{
return
true
;
}
String
shortName
=
cls
.
getClassInfo
().
getShortName
();
if
(
shortName
.
contains
(
"$"
)
||
Character
.
isDigit
(
shortName
.
charAt
(
0
)))
{
return
true
;
}
if
(
cls
.
getUseIn
().
size
()
==
1
&&
cls
.
getUseInMth
().
size
()
==
1
)
{
MethodNode
useMth
=
cls
.
getUseInMth
().
get
(
0
);
// allow use in enum class init
return
useMth
.
getMethodInfo
().
isClassInit
()
&&
useMth
.
getParentClass
().
isEnum
();
}
return
false
;
}
/**
* Checks:
* - class have only one constructor which used only once (allow common code for field init)
...
...
jadx-core/src/test/java/jadx/tests/api/utils/assertj/JadxCodeAssertions.java
浏览文件 @
bd3e6261
...
...
@@ -52,19 +52,18 @@ public class JadxCodeAssertions extends AbstractStringAssert<JadxCodeAssertions>
}
String
indent
=
TestUtils
.
indent
(
commonIndent
);
StringBuilder
sb
=
new
StringBuilder
();
boolean
first
=
true
;
for
(
String
line
:
lines
)
{
if
(!
line
.
isEmpty
())
{
if
(
first
)
{
first
=
false
;
}
else
{
sb
.
append
(
ICodeWriter
.
NL
);
}
sb
.
append
(
indent
);
sb
.
append
(
line
);
sb
.
append
(
ICodeWriter
.
NL
);
if
(
line
.
isEmpty
())
{
// don't add common indent to empty lines
continue
;
}
String
searchLine
=
indent
+
line
;
sb
.
append
(
searchLine
);
// check every line for easier debugging
contains
(
searchLine
);
}
return
containsOnlyOnce
(
sb
.
toString
(
));
return
containsOnlyOnce
(
sb
.
substring
(
ICodeWriter
.
NL
.
length
()
));
}
public
JadxCodeAssertions
removeBlockComments
()
{
...
...
jadx-core/src/test/java/jadx/tests/integration/enums/TestEnums2.java
浏览文件 @
bd3e6261
...
...
@@ -2,11 +2,10 @@ package jadx.tests.integration.enums;
import
org.junit.jupiter.api.Test
;
import
jadx.
core.dex.nodes.ClassNode
;
import
jadx.
api.CommentsLevel
;
import
jadx.tests.api.IntegrationTest
;
import
jadx.tests.api.utils.JadxMatchers
;
import
static
org
.
hamcrest
.
MatcherAssert
.
assertThat
;
import
static
jadx
.
tests
.
api
.
utils
.
assertj
.
JadxAssertions
.
assertThat
;
public
class
TestEnums2
extends
IntegrationTest
{
...
...
@@ -32,25 +31,25 @@ public class TestEnums2 extends IntegrationTest {
@Test
public
void
test
()
{
ClassNode
cls
=
getClassNode
(
TestCls
.
class
);
String
code
=
removeLineComments
(
cls
);
assertThat
(
code
,
JadxMatchers
.
containsLines
(
1
,
"public enum Operation {"
,
indent
(
1
)
+
"PLUS {"
,
indent
(
2
)
+
"@Override"
,
indent
(
2
)
+
"public int apply(int x, int y) {"
,
indent
(
3
)
+
"return x + y;"
,
indent
(
2
)
+
'}'
,
indent
(
1
)
+
"},"
,
indent
(
1
)
+
"MINUS {"
,
indent
(
2
)
+
"@Override"
,
indent
(
2
)
+
"public int apply(int x, int y) {"
,
indent
(
3
)
+
"return x - y;"
,
indent
(
2
)
+
'}'
,
indent
(
1
)
+
"};"
,
""
,
indent
(
1
)
+
"public abstract int apply(int i, int i2);"
,
"}"
)
);
getArgs
().
setCommentsLevel
(
CommentsLevel
.
WARN
);
assertThat
(
getClassNode
(
TestCls
.
class
))
.
code
()
.
containsLines
(
1
,
"public enum Operation {"
,
indent
(
1
)
+
"PLUS {"
,
indent
(
2
)
+
"@Override"
,
indent
(
2
)
+
"public int apply(int x, int y) {"
,
indent
(
3
)
+
"return x + y;"
,
indent
(
2
)
+
'}'
,
indent
(
1
)
+
"},"
,
indent
(
1
)
+
"MINUS {"
,
indent
(
2
)
+
"@Override"
,
indent
(
2
)
+
"public int apply(int x, int y) {"
,
indent
(
3
)
+
"return x - y;"
,
indent
(
2
)
+
'}'
,
indent
(
1
)
+
"};"
,
""
,
indent
(
1
)
+
"public abstract int apply(int i, int i2);"
,
"}"
);
}
}
jadx-core/src/test/java/jadx/tests/integration/enums/TestEnumsInterface.java
浏览文件 @
bd3e6261
...
...
@@ -2,11 +2,10 @@ package jadx.tests.integration.enums;
import
org.junit.jupiter.api.Test
;
import
jadx.
core.dex.nodes.ClassNode
;
import
jadx.
api.CommentsLevel
;
import
jadx.tests.api.IntegrationTest
;
import
jadx.tests.api.utils.JadxMatchers
;
import
static
org
.
hamcrest
.
MatcherAssert
.
assertThat
;
import
static
jadx
.
tests
.
api
.
utils
.
assertj
.
JadxAssertions
.
assertThat
;
public
class
TestEnumsInterface
extends
IntegrationTest
{
...
...
@@ -34,23 +33,23 @@ public class TestEnumsInterface extends IntegrationTest {
@Test
public
void
test
()
{
ClassNode
cls
=
getClassNode
(
TestCls
.
class
);
String
code
=
removeLineComments
(
cls
);
assertThat
(
code
,
JadxMatchers
.
containsLines
(
1
,
"public enum Operation implements IOperation {"
,
indent
(
1
)
+
"PLUS {"
,
indent
(
2
)
+
"@Override"
,
indent
(
2
)
+
"public int apply(int x, int y) {"
,
indent
(
3
)
+
"return x + y;"
,
indent
(
2
)
+
'}'
,
indent
(
1
)
+
"},"
,
indent
(
1
)
+
"MINUS {"
,
indent
(
2
)
+
"@Override"
,
indent
(
2
)
+
"public int apply(int x, int y) {"
,
indent
(
3
)
+
"return x - y;"
,
indent
(
2
)
+
'}'
,
indent
(
1
)
+
'}'
,
"}"
)
);
getArgs
().
setCommentsLevel
(
CommentsLevel
.
WARN
);
assertThat
(
getClassNode
(
TestCls
.
class
))
.
code
()
.
containsLines
(
1
,
"public enum Operation implements IOperation {"
,
indent
(
1
)
+
"PLUS {"
,
indent
(
2
)
+
"@Override"
,
indent
(
2
)
+
"public int apply(int x, int y) {"
,
indent
(
3
)
+
"return x + y;"
,
indent
(
2
)
+
'}'
,
indent
(
1
)
+
"},"
,
indent
(
1
)
+
"MINUS {"
,
indent
(
2
)
+
"@Override"
,
indent
(
2
)
+
"public int apply(int x, int y) {"
,
indent
(
3
)
+
"return x - y;"
,
indent
(
2
)
+
'}'
,
indent
(
1
)
+
'}'
,
"}"
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录