Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Quincy379
jadx
提交
151c1716
J
jadx
项目概览
Quincy379
/
jadx
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
jadx
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
151c1716
编写于
9月 23, 2022
作者:
S
Skylot
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix: handle empty block at end of `else-if` chain (#1674)
上级
79477a2d
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
48 addition
and
17 deletion
+48
-17
jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfRegionVisitor.java
.../java/jadx/core/dex/visitors/regions/IfRegionVisitor.java
+11
-3
jadx-core/src/main/java/jadx/core/utils/RegionUtils.java
jadx-core/src/main/java/jadx/core/utils/RegionUtils.java
+0
-14
jadx-core/src/test/java/jadx/tests/integration/conditions/TestElseIfCodeStyle.java
...adx/tests/integration/conditions/TestElseIfCodeStyle.java
+37
-0
未找到文件。
jadx-core/src/main/java/jadx/core/dex/visitors/regions/IfRegionVisitor.java
浏览文件 @
151c1716
...
...
@@ -3,8 +3,10 @@ package jadx.core.dex.visitors.regions;
import
java.util.List
;
import
jadx.core.dex.attributes.AFlag
;
import
jadx.core.dex.instructions.InsnType
;
import
jadx.core.dex.nodes.IContainer
;
import
jadx.core.dex.nodes.IRegion
;
import
jadx.core.dex.nodes.InsnNode
;
import
jadx.core.dex.nodes.MethodNode
;
import
jadx.core.dex.regions.Region
;
import
jadx.core.dex.regions.conditions.IfCondition
;
...
...
@@ -45,7 +47,7 @@ public class IfRegionVisitor extends AbstractVisitor {
}
}
@SuppressWarnings
(
"UnnecessaryReturnStatement"
)
@SuppressWarnings
(
{
"UnnecessaryReturnStatement"
,
"StatementWithEmptyBody"
}
)
private
static
void
orderBranches
(
MethodNode
mth
,
IfRegion
ifRegion
)
{
if
(
RegionUtils
.
isEmpty
(
ifRegion
.
getElseRegion
()))
{
return
;
...
...
@@ -79,9 +81,15 @@ public class IfRegionVisitor extends AbstractVisitor {
return
;
}
}
boolean
lastRegion
=
ifRegion
==
RegionUtils
.
getLastRegion
(
mth
.
getRegion
()
);
boolean
lastRegion
=
RegionUtils
.
hasExitEdge
(
ifRegion
);
if
(
elseSize
==
1
&&
lastRegion
&&
mth
.
isVoidReturn
())
{
// single return at method end will be removed later
InsnNode
lastElseInsn
=
RegionUtils
.
getLastInsn
(
ifRegion
.
getElseRegion
());
if
(
lastElseInsn
!=
null
&&
lastElseInsn
.
getType
()
==
InsnType
.
THROW
)
{
// move `throw` into `then` block
invertIfRegion
(
ifRegion
);
}
else
{
// single return at method end will be removed later
}
return
;
}
if
(!
lastRegion
)
{
...
...
jadx-core/src/main/java/jadx/core/utils/RegionUtils.java
浏览文件 @
151c1716
...
...
@@ -146,20 +146,6 @@ public class RegionUtils {
}
}
@Nullable
public
static
IContainer
getLastRegion
(
@Nullable
IContainer
container
)
{
if
(
container
==
null
)
{
return
null
;
}
if
(
container
instanceof
IBlock
||
container
instanceof
IBranchRegion
)
{
return
container
;
}
if
(
container
instanceof
IRegion
)
{
return
getLastRegion
(
Utils
.
last
(((
IRegion
)
container
).
getSubBlocks
()));
}
throw
new
JadxRuntimeException
(
unknownContainerType
(
container
));
}
public
static
boolean
isExitBlock
(
MethodNode
mth
,
IContainer
container
)
{
if
(
container
instanceof
BlockNode
)
{
return
BlockUtils
.
isExitBlock
(
mth
,
(
BlockNode
)
container
);
...
...
jadx-core/src/test/java/jadx/tests/integration/conditions/TestElseIfCodeStyle.java
0 → 100644
浏览文件 @
151c1716
package
jadx.tests.integration.conditions
;
import
org.junit.jupiter.api.Test
;
import
jadx.api.ICodeWriter
;
import
jadx.tests.api.IntegrationTest
;
import
static
jadx
.
tests
.
api
.
utils
.
assertj
.
JadxAssertions
.
assertThat
;
public
class
TestElseIfCodeStyle
extends
IntegrationTest
{
@SuppressWarnings
(
"unused"
)
public
static
class
TestCls
{
public
void
test
(
String
str
)
{
if
(
"a"
.
equals
(
str
))
{
call
(
1
);
}
else
if
(
"b"
.
equals
(
str
))
{
call
(
2
);
}
else
if
(
"c"
.
equals
(
str
))
{
call
(
3
);
}
}
private
void
call
(
int
i
)
{
}
}
@Test
public
void
test
()
{
noDebugInfo
();
assertThat
(
getClassNode
(
TestCls
.
class
))
.
code
()
.
doesNotContain
(
"!\"c\".equals(str)"
)
.
doesNotContain
(
"{"
+
ICodeWriter
.
NL
+
indent
(
2
)
+
"} else {"
);
// no empty `then` block
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录