diff --git a/src/org/jetbrains/java/decompiler/main/ClassWriter.java b/src/org/jetbrains/java/decompiler/main/ClassWriter.java index 0bdd8a8..ad6a952 100644 --- a/src/org/jetbrains/java/decompiler/main/ClassWriter.java +++ b/src/org/jetbrains/java/decompiler/main/ClassWriter.java @@ -254,8 +254,11 @@ public class ClassWriter { if (hasContent) { buffer.appendLineSeparator(); + startLine++; } - classToJava(inner, buffer, indent + 1, tracer); + BytecodeMappingTracer class_tracer = new BytecodeMappingTracer(startLine); + classToJava(inner, buffer, indent + 1, class_tracer); + startLine = buffer.countLines(); hasContent = true; } @@ -840,7 +843,7 @@ public class ClassWriter { // save total lines // TODO: optimize - tracer.setCurrentSourceLine(buffer.countLines(start_index_method)); + //tracer.setCurrentSourceLine(buffer.countLines(start_index_method)); return !hideMethod; } diff --git a/src/org/jetbrains/java/decompiler/main/ClassesProcessor.java b/src/org/jetbrains/java/decompiler/main/ClassesProcessor.java index 66cfa63..20d6942 100644 --- a/src/org/jetbrains/java/decompiler/main/ClassesProcessor.java +++ b/src/org/jetbrains/java/decompiler/main/ClassesProcessor.java @@ -280,6 +280,7 @@ public class ClassesProcessor { } //buffer.append(lineSeparator); + total_offset_lines = buffer.countLines(); buffer.append(classBuffer); if (DecompilerContext.getOption(IFernflowerPreferences.BYTECODE_SOURCE_MAPPING)) { diff --git a/src/org/jetbrains/java/decompiler/modules/decompiler/stats/CatchStatement.java b/src/org/jetbrains/java/decompiler/modules/decompiler/stats/CatchStatement.java index 1cddbbc..f6287c2 100644 --- a/src/org/jetbrains/java/decompiler/modules/decompiler/stats/CatchStatement.java +++ b/src/org/jetbrains/java/decompiler/modules/decompiler/stats/CatchStatement.java @@ -187,7 +187,6 @@ public class CatchStatement extends Statement { tracer.incrementCurrentSourceLine(); buf.append(ExprProcessor.jmpWrapper(stats.get(i), indent + 1, true, tracer)).append(indstr) .append("}"); - tracer.incrementCurrentSourceLine(); } buf.append(new_line_separator); diff --git a/testData/classes/pkg/TestClassSimpleBytecodeMapping$InnerClass.class b/testData/classes/pkg/TestClassSimpleBytecodeMapping$InnerClass.class new file mode 100644 index 0000000..bd3481b Binary files /dev/null and b/testData/classes/pkg/TestClassSimpleBytecodeMapping$InnerClass.class differ diff --git a/testData/classes/pkg/TestClassSimpleBytecodeMapping$InnerClass2.class b/testData/classes/pkg/TestClassSimpleBytecodeMapping$InnerClass2.class new file mode 100644 index 0000000..b28c357 Binary files /dev/null and b/testData/classes/pkg/TestClassSimpleBytecodeMapping$InnerClass2.class differ diff --git a/testData/classes/pkg/TestClassSimpleBytecodeMapping.class b/testData/classes/pkg/TestClassSimpleBytecodeMapping.class index 4e4f8fb..010c748 100644 Binary files a/testData/classes/pkg/TestClassSimpleBytecodeMapping.class and b/testData/classes/pkg/TestClassSimpleBytecodeMapping.class differ diff --git a/testData/results/TestClassSimpleBytecodeMapping.dec b/testData/results/TestClassSimpleBytecodeMapping.dec index 9a46f78..5647f76 100644 --- a/testData/results/TestClassSimpleBytecodeMapping.dec +++ b/testData/results/TestClassSimpleBytecodeMapping.dec @@ -8,6 +8,7 @@ public class TestClassSimpleBytecodeMapping { System.out.println("Runnable"); } }); + this.test2("1"); if(Math.random() > 0.0D) { System.out.println("0"); return 0; @@ -17,9 +18,30 @@ public class TestClassSimpleBytecodeMapping { } } + public void test2(String var1) { + try { + Integer.parseInt(var1); + } catch (Exception var3) { + System.out.println(var3); + } + + } + void run(Runnable var1) { var1.run(); } + + public class InnerClass2 { + public void print() { + System.out.println("Inner2"); + } + } + + public class InnerClass { + public void print() { + System.out.println("Inner"); + } + } } class 'pkg/TestClassSimpleBytecodeMapping$1' { @@ -36,24 +58,46 @@ class 'pkg/TestClassSimpleBytecodeMapping' { 3 4 5 4 11 5 - 14 10 + 15 10 17 10 - 18 10 - 19 10 - 1c 11 + 1a 11 + 1d 11 + 1e 11 1f 11 - 21 11 - 24 12 + 22 12 25 12 - 26 14 - 29 14 - 2b 14 - 2e 15 + 27 12 + 2a 13 + 2b 13 + 2c 15 2f 15 + 31 15 + 34 16 + 35 16 + } + + method 'test2 (Ljava/lang/String;)V' { + 1 22 } method 'run (Ljava/lang/Runnable;)V' { - 1 20 + 1 30 + } +} + +class 'pkg/TestClassSimpleBytecodeMapping$InnerClass2' { + method 'print ()V' { + 0 35 + 3 35 + 5 35 + } +} + +class 'pkg/TestClassSimpleBytecodeMapping$InnerClass' { + method 'print ()V' { + 0 41 + 3 41 + 5 41 } } @@ -62,8 +106,12 @@ Lines mapping: 14 <-> 6 17 <-> 8 21 <-> 11 -22 <-> 12 -23 <-> 13 -25 <-> 15 -26 <-> 16 -31 <-> 21 +23 <-> 12 +24 <-> 13 +25 <-> 14 +27 <-> 16 +28 <-> 17 +34 <-> 23 +42 <-> 42 +47 <-> 31 +52 <-> 36 diff --git a/testData/src/pkg/TestClassSimpleBytecodeMapping.java b/testData/src/pkg/TestClassSimpleBytecodeMapping.java index 0e9ecc2..bc07e46 100644 --- a/testData/src/pkg/TestClassSimpleBytecodeMapping.java +++ b/testData/src/pkg/TestClassSimpleBytecodeMapping.java @@ -18,6 +18,8 @@ public class TestClassSimpleBytecodeMapping { } }); + test2("1"); + if(Math.random() > 0) { System.out.println("0"); return 0; @@ -27,7 +29,27 @@ public class TestClassSimpleBytecodeMapping { } } + public void test2(String a) { + try { + Integer.parseInt(a); + } catch (Exception e) { + System.out.println(e); + } + } + + public class InnerClass { + public void print() { + System.out.println("Inner"); + } + } + void run(Runnable r) { r.run(); } + + public class InnerClass2 { + public void print() { + System.out.println("Inner2"); + } + } }