Skip to content

Commit 8e0714c

Browse files
committed
🪰lambda式展開の不具合修正
インスタンスメソッドを呼び出した場合に意図通り動作していなかった。 この不具合のあるバージョン: 2025.5.1...2025.7.1
1 parent 309c3f3 commit 8e0714c

2 files changed

Lines changed: 25 additions & 2 deletions

File tree

jig-core/src/main/java/org/dddjava/jig/infrastructure/asm/AsmMethodVisitor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,10 @@ private JigMethodHeader jigMethodHeader(int access, JigMethodId jigMethodId, Jig
9999
if (name.equals("<clinit>")) flags.add(JigMethodFlag.STATIC_INITIALIZER);
100100

101101
// lambda合成メソッドの判定
102-
// 名前だけ(lambda$ から始まる)は書こうと思えば書けるので、 ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC も条件とする。
102+
// 名前だけ(lambda$ から始まる)は書こうと思えば書けるので、 ACC_PRIVATE, ACC_SYNTHETIC も条件とする。
103+
// ACC_STATICはlambdaでインスタンスメソッドを呼ばない場合に付与されるので条件にしてはいけない
103104
if (name.startsWith("lambda$")
104105
&& jigMemberVisibility == JigMemberVisibility.PRIVATE
105-
&& ownership == JigMemberOwnership.CLASS
106106
&& flags.contains(JigMethodFlag.SYNTHETIC)) {
107107
flags.add(JigMethodFlag.LAMBDA_SUPPORT);
108108
}

jig-core/src/test/java/org/dddjava/jig/infrastructure/asm/AsmMethodVisitorInstructionTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,13 @@ private static class SutClass {
4444
.close();
4545
}
4646

47+
private void lambda式で呼ばれるインスタンスメソッド() {
48+
}
49+
50+
public void lambda式メソッド_インスタンスメソッド呼び出し() {
51+
Stream.empty().forEach(i -> lambda式で呼ばれるインスタンスメソッド());
52+
}
53+
4754
public void lambda式の多段メソッド() {
4855
Supplier<Object> s = () -> {
4956
return UUID.randomUUID();
@@ -185,6 +192,22 @@ private static Stream<MethodCall> getDynamicMethodCallStream(JigMethod jigMethod
185192
).sorted().toList(), actual);
186193
}
187194

195+
@Test
196+
void Lambda式で呼び出しているメソッドがlambda式を記述したメソッドから取得できる_インスタンスメソッド呼び出し() {
197+
JigMethod jigMethod = TestSupport.JigMethod準備(SutClass.class, "lambda式メソッド_インスタンスメソッド呼び出し");
198+
199+
List<String> actual = jigMethod.instructions().lambdaInlinedMethodCallStream()
200+
.map(MethodCall::methodName)
201+
// バイトコードの順番は記述順と異なるので名前順にしておく
202+
.sorted()
203+
.toList();
204+
205+
assertEquals(Stream.of(
206+
"empty", "forEach", // lambda式の外
207+
"lambda式で呼ばれるインスタンスメソッド" // lambda式の内側
208+
).sorted().toList(), actual);
209+
}
210+
188211
@Test
189212
void Lambda式で呼び出しているメソッドがlambda式を記述したメソッドから取得できる_多段() {
190213
JigMethod jigMethod = TestSupport.JigMethod準備(SutClass.class, "lambda式の多段メソッド");

0 commit comments

Comments
 (0)