decompiler: fixed line mapping in try-catch block
authorEgor.Ushakov <egor.ushakov@jetbrains.com>
Tue, 21 Oct 2014 15:10:42 +0000 (19:10 +0400)
committerEgor.Ushakov <egor.ushakov@jetbrains.com>
Tue, 21 Oct 2014 15:11:17 +0000 (19:11 +0400)
plugins/java-decompiler/engine/src/org/jetbrains/java/decompiler/modules/decompiler/stats/CatchAllStatement.java
plugins/java-decompiler/engine/testData/classes/pkg/TestClassSimpleBytecodeMapping$InnerClass.class
plugins/java-decompiler/engine/testData/classes/pkg/TestClassSimpleBytecodeMapping$InnerClass2.class
plugins/java-decompiler/engine/testData/classes/pkg/TestClassSimpleBytecodeMapping.class
plugins/java-decompiler/engine/testData/classes/pkg/TestTryCatchFinally.class
plugins/java-decompiler/engine/testData/results/TestClassSimpleBytecodeMapping.dec
plugins/java-decompiler/engine/testData/results/TestTryCatchFinally.dec
plugins/java-decompiler/engine/testData/src/pkg/TestClassSimpleBytecodeMapping.java
plugins/java-decompiler/engine/testData/src/pkg/TestTryCatchFinally.java

index f2321ac47bfb32346fa8b17f9b7030479651e51b..a3d597d8bc6914107f0c197d33e32e43a2142a8f 100644 (file)
@@ -26,7 +26,6 @@ import org.jetbrains.java.decompiler.modules.decompiler.StatEdge;
 import org.jetbrains.java.decompiler.modules.decompiler.exps.VarExprent;
 import org.jetbrains.java.decompiler.modules.decompiler.vars.VarProcessor;
 import org.jetbrains.java.decompiler.struct.gen.VarType;
 import org.jetbrains.java.decompiler.modules.decompiler.exps.VarExprent;
 import org.jetbrains.java.decompiler.modules.decompiler.vars.VarProcessor;
 import org.jetbrains.java.decompiler.struct.gen.VarType;
-import org.jetbrains.java.decompiler.util.InterpreterUtil;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -113,9 +112,6 @@ public class CatchAllStatement extends Statement {
   }
 
   public TextBuffer toJava(int indent, BytecodeMappingTracer tracer) {
   }
 
   public TextBuffer toJava(int indent, BytecodeMappingTracer tracer) {
-    String indstr = InterpreterUtil.getIndentString(indent);
-    String indstr1 = null;
-
     String new_line_separator = DecompilerContext.getNewLineSeparator();
 
     TextBuffer buf = new TextBuffer();
     String new_line_separator = DecompilerContext.getNewLineSeparator();
 
     TextBuffer buf = new TextBuffer();
@@ -124,7 +120,7 @@ public class CatchAllStatement extends Statement {
 
     boolean labeled = isLabeled();
     if (labeled) {
 
     boolean labeled = isLabeled();
     if (labeled) {
-      buf.append(indstr).append("label").append(this.id.toString()).append(":").append(new_line_separator);
+      buf.appendIndent(indent).append("label").append(this.id.toString()).append(":").appendLineSeparator();
       tracer.incrementCurrentSourceLine();
     }
 
       tracer.incrementCurrentSourceLine();
     }
 
@@ -133,33 +129,33 @@ public class CatchAllStatement extends Statement {
         !labeled && !first.isLabeled() && (lstSuccs.isEmpty() || !lstSuccs.get(0).explicit)) {
       TextBuffer content = ExprProcessor.jmpWrapper(first, indent, true, tracer);
       content.setLength(content.length() - new_line_separator.length());
         !labeled && !first.isLabeled() && (lstSuccs.isEmpty() || !lstSuccs.get(0).explicit)) {
       TextBuffer content = ExprProcessor.jmpWrapper(first, indent, true, tracer);
       content.setLength(content.length() - new_line_separator.length());
+      tracer.incrementCurrentSourceLine(-1);
       buf.append(content);
     }
     else {
       buf.append(content);
     }
     else {
-      buf.append(indstr).append("try {").append(new_line_separator);
+      buf.appendIndent(indent).append("try {").appendLineSeparator();
       tracer.incrementCurrentSourceLine();
       buf.append(ExprProcessor.jmpWrapper(first, indent + 1, true, tracer));
       tracer.incrementCurrentSourceLine();
       buf.append(ExprProcessor.jmpWrapper(first, indent + 1, true, tracer));
-      buf.append(indstr).append("}");
+      buf.appendIndent(indent).append("}");
     }
 
     buf.append(isFinally ? " finally" :
     }
 
     buf.append(isFinally ? " finally" :
-               " catch (" + vars.get(0).toJava(indent, tracer) + ")").append(" {").append(new_line_separator);
+               " catch (" + vars.get(0).toJava(indent, tracer) + ")").append(" {").appendLineSeparator();
     tracer.incrementCurrentSourceLine();
 
     if (monitor != null) {
     tracer.incrementCurrentSourceLine();
 
     if (monitor != null) {
-      indstr1 = InterpreterUtil.getIndentString(indent + 1);
-      buf.append(indstr1).append("if(").append(monitor.toJava(indent, tracer)).append(") {").append(new_line_separator);
+      buf.appendIndent(indent+1).append("if(").append(monitor.toJava(indent, tracer)).append(") {").appendLineSeparator();
       tracer.incrementCurrentSourceLine();
     }
 
     buf.append(ExprProcessor.jmpWrapper(handler, indent + 1 + (monitor != null ? 1 : 0), true, tracer));
 
     if (monitor != null) {
       tracer.incrementCurrentSourceLine();
     }
 
     buf.append(ExprProcessor.jmpWrapper(handler, indent + 1 + (monitor != null ? 1 : 0), true, tracer));
 
     if (monitor != null) {
-      buf.append(indstr1).append("}").append(new_line_separator);
+      buf.appendIndent(indent + 1).append("}").appendLineSeparator();
       tracer.incrementCurrentSourceLine();
     }
 
       tracer.incrementCurrentSourceLine();
     }
 
-    buf.append(indstr).append("}").append(new_line_separator);
+    buf.appendIndent(indent).append("}").appendLineSeparator();
     tracer.incrementCurrentSourceLine();
 
     return buf;
     tracer.incrementCurrentSourceLine();
 
     return buf;
index bd3481b595d2962323804b5798c3af2f8536d2af..7c87161ed506b83d595000fb4e80ac07b527bb4e 100644 (file)
Binary files a/plugins/java-decompiler/engine/testData/classes/pkg/TestClassSimpleBytecodeMapping$InnerClass.class and b/plugins/java-decompiler/engine/testData/classes/pkg/TestClassSimpleBytecodeMapping$InnerClass.class differ
index b28c357352dddde5e162f26a2954c2098c9371a0..64638d907d634d5735c4c6dbabe5313df6a5567f 100644 (file)
Binary files a/plugins/java-decompiler/engine/testData/classes/pkg/TestClassSimpleBytecodeMapping$InnerClass2.class and b/plugins/java-decompiler/engine/testData/classes/pkg/TestClassSimpleBytecodeMapping$InnerClass2.class differ
index 010c748a4b0e901939b82ec4ac0a9fd151508f08..2d9a8beca899d1c4d239c59b703dae9264fea809 100644 (file)
Binary files a/plugins/java-decompiler/engine/testData/classes/pkg/TestClassSimpleBytecodeMapping.class and b/plugins/java-decompiler/engine/testData/classes/pkg/TestClassSimpleBytecodeMapping.class differ
index 16dc30dc15fb6b2ac725db6c2c0b506e0cbf9540..244dfad62acaff777b67a3cdb983b0607dfb458a 100644 (file)
Binary files a/plugins/java-decompiler/engine/testData/classes/pkg/TestTryCatchFinally.class and b/plugins/java-decompiler/engine/testData/classes/pkg/TestTryCatchFinally.class differ
index 5647f76f5f96637278c4bdabedcbf70f5b287f7d..e284fa5b7947f95816c87d5022eb4aed0800eca4 100644 (file)
@@ -21,8 +21,10 @@ public class TestClassSimpleBytecodeMapping {
    public void test2(String var1) {
       try {
          Integer.parseInt(var1);
    public void test2(String var1) {
       try {
          Integer.parseInt(var1);
-      } catch (Exception var3) {
-         System.out.println(var3);
+      } catch (Exception var6) {
+         System.out.println(var6);
+      } finally {
+         System.out.println("Finally");
       }
 
    }
       }
 
    }
@@ -81,23 +83,23 @@ class 'pkg/TestClassSimpleBytecodeMapping' {
    }
 
    method 'run (Ljava/lang/Runnable;)V' {
    }
 
    method 'run (Ljava/lang/Runnable;)V' {
-      1      30
+      1      32
    }
 }
 
 class 'pkg/TestClassSimpleBytecodeMapping$InnerClass2' {
    method 'print ()V' {
    }
 }
 
 class 'pkg/TestClassSimpleBytecodeMapping$InnerClass2' {
    method 'print ()V' {
-      0      35
-      3      35
-      5      35
+      0      37
+      3      37
+      5      37
    }
 }
 
 class 'pkg/TestClassSimpleBytecodeMapping$InnerClass' {
    method 'print ()V' {
    }
 }
 
 class 'pkg/TestClassSimpleBytecodeMapping$InnerClass' {
    method 'print ()V' {
-      0      41
-      3      41
-      5      41
+      0      43
+      3      43
+      5      43
    }
 }
 
    }
 }
 
@@ -112,6 +114,6 @@ Lines mapping:
 27 <-> 16
 28 <-> 17
 34 <-> 23
 27 <-> 16
 28 <-> 17
 34 <-> 23
-42 <-> 42
-47 <-> 31
-52 <-> 36
+44 <-> 44
+49 <-> 33
+54 <-> 38
index 1524da8403792dc234e3ed9be550fd7890ecf683..9840bfccb2850d33ef6611df1393e512545799af 100644 (file)
@@ -1,6 +1,21 @@
 package pkg;
 
 public class TestTryCatchFinally {
 package pkg;
 
 public class TestTryCatchFinally {
+   public void test1(String var1) {
+      try {
+         System.out.println("sout1");
+      } catch (Exception var9) {
+         try {
+            System.out.println("sout2");
+         } catch (Exception var8) {
+            ;
+         }
+      } finally {
+         System.out.println("finally");
+      }
+
+   }
+
    public int test(String var1) {
       try {
          int var2 = Integer.parseInt(var1);
    public int test(String var1) {
       try {
          int var2 = Integer.parseInt(var1);
index bc07e46bcaa8a724a589fee48c5b1408b9f7efc8..0b9df2e79252519ccce7e5be8676659b0c2abd87 100644 (file)
@@ -34,6 +34,8 @@ public class TestClassSimpleBytecodeMapping {
       Integer.parseInt(a);
     } catch (Exception e) {
       System.out.println(e);
       Integer.parseInt(a);
     } catch (Exception e) {
       System.out.println(e);
+    } finally {
+      System.out.println("Finally");
     }
   }
 
     }
   }
 
index 2e244be22e8ae8db6729bebbdecb75ba3b1a05fe..da3588a3eb5082bd8172d7b5263796e6444821f0 100644 (file)
 package pkg;
 
 public class TestTryCatchFinally {
 package pkg;
 
 public class TestTryCatchFinally {
+  public void test1(String x) {
+    try {
+      System.out.println("sout1");
+    } catch (Exception e) {
+      try {
+        System.out.println("sout2");
+      } catch (Exception e2) {
+        // Empty
+        // Empty
+        // Empty
+      }
+    } finally {
+      System.out.println("finally");
+    }
+  }
+
   public int test(String a) {
     try {
       return Integer.parseInt(a);
   public int test(String a) {
     try {
       return Integer.parseInt(a);