From f3631279a7765ae035d754c819e6e6a41f57e967 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 7 Jul 2011 14:44:27 +0400 Subject: [PATCH] moved to community --- .../testData/psi/controlFlow/flow0.java | 5 + .../testData/psi/controlFlow/flow0.txt | 1 + .../testData/psi/controlFlow/flow1.java | 10 ++ .../testData/psi/controlFlow/flow1.txt | 5 + .../testData/psi/controlFlow/flow10.java | 17 ++++ .../testData/psi/controlFlow/flow10.txt | 11 +++ .../testData/psi/controlFlow/flow11.java | 11 +++ .../testData/psi/controlFlow/flow11.txt | 7 ++ .../testData/psi/controlFlow/flow12.java | 11 +++ .../testData/psi/controlFlow/flow12.txt | 6 ++ .../testData/psi/controlFlow/flow13.java | 22 +++++ .../testData/psi/controlFlow/flow13.txt | 15 +++ .../testData/psi/controlFlow/flow14.java | 20 ++++ .../testData/psi/controlFlow/flow14.txt | 30 ++++++ .../testData/psi/controlFlow/flow15.java | 37 ++++++++ .../testData/psi/controlFlow/flow15.txt | 27 ++++++ .../testData/psi/controlFlow/flow16.java | 20 ++++ .../testData/psi/controlFlow/flow16.txt | 28 ++++++ .../testData/psi/controlFlow/flow17.java | 10 ++ .../testData/psi/controlFlow/flow17.txt | 8 ++ .../testData/psi/controlFlow/flow18.java | 17 ++++ .../testData/psi/controlFlow/flow18.txt | 28 ++++++ .../testData/psi/controlFlow/flow2.java | 9 ++ .../testData/psi/controlFlow/flow2.txt | 7 ++ .../testData/psi/controlFlow/flow3.java | 17 ++++ .../testData/psi/controlFlow/flow3.txt | 30 ++++++ .../testData/psi/controlFlow/flow4.java | 11 +++ .../testData/psi/controlFlow/flow4.txt | 4 + .../testData/psi/controlFlow/flow5.java | 13 +++ .../testData/psi/controlFlow/flow5.txt | 12 +++ .../testData/psi/controlFlow/flow6.java | 13 +++ .../testData/psi/controlFlow/flow6.txt | 15 +++ .../testData/psi/controlFlow/flow7.java | 11 +++ .../testData/psi/controlFlow/flow7.txt | 5 + .../testData/psi/controlFlow/flow8.java | 12 +++ .../testData/psi/controlFlow/flow8.txt | 10 ++ .../testData/psi/controlFlow/flow9.java | 20 ++++ .../testData/psi/controlFlow/flow9.txt | 27 ++++++ .../testData/psi/controlFlow/flowAnd.java | 12 +++ .../testData/psi/controlFlow/flowAnd.txt | 7 ++ .../testData/psi/controlFlow/flowAnd2.java | 15 +++ .../testData/psi/controlFlow/flowAnd2.txt | 12 +++ .../testData/psi/controlFlow/flowAnd3.java | 9 ++ .../testData/psi/controlFlow/flowAnd3.txt | 8 ++ .../psi/controlFlow/flowConditional.java | 10 ++ .../psi/controlFlow/flowConditional.txt | 9 ++ .../controlFlow/flowNestedConditional.java | 15 +++ .../psi/controlFlow/flowNestedConditional.txt | 13 +++ .../codeInsight/psi/ControlFlowTest.java | 94 +++++++++++++++++++ 49 files changed, 766 insertions(+) create mode 100644 java/java-tests/testData/psi/controlFlow/flow0.java create mode 100644 java/java-tests/testData/psi/controlFlow/flow0.txt create mode 100644 java/java-tests/testData/psi/controlFlow/flow1.java create mode 100644 java/java-tests/testData/psi/controlFlow/flow1.txt create mode 100644 java/java-tests/testData/psi/controlFlow/flow10.java create mode 100644 java/java-tests/testData/psi/controlFlow/flow10.txt create mode 100644 java/java-tests/testData/psi/controlFlow/flow11.java create mode 100644 java/java-tests/testData/psi/controlFlow/flow11.txt create mode 100644 java/java-tests/testData/psi/controlFlow/flow12.java create mode 100644 java/java-tests/testData/psi/controlFlow/flow12.txt create mode 100644 java/java-tests/testData/psi/controlFlow/flow13.java create mode 100644 java/java-tests/testData/psi/controlFlow/flow13.txt create mode 100644 java/java-tests/testData/psi/controlFlow/flow14.java create mode 100644 java/java-tests/testData/psi/controlFlow/flow14.txt create mode 100644 java/java-tests/testData/psi/controlFlow/flow15.java create mode 100644 java/java-tests/testData/psi/controlFlow/flow15.txt create mode 100644 java/java-tests/testData/psi/controlFlow/flow16.java create mode 100644 java/java-tests/testData/psi/controlFlow/flow16.txt create mode 100644 java/java-tests/testData/psi/controlFlow/flow17.java create mode 100644 java/java-tests/testData/psi/controlFlow/flow17.txt create mode 100644 java/java-tests/testData/psi/controlFlow/flow18.java create mode 100644 java/java-tests/testData/psi/controlFlow/flow18.txt create mode 100644 java/java-tests/testData/psi/controlFlow/flow2.java create mode 100644 java/java-tests/testData/psi/controlFlow/flow2.txt create mode 100644 java/java-tests/testData/psi/controlFlow/flow3.java create mode 100644 java/java-tests/testData/psi/controlFlow/flow3.txt create mode 100644 java/java-tests/testData/psi/controlFlow/flow4.java create mode 100644 java/java-tests/testData/psi/controlFlow/flow4.txt create mode 100644 java/java-tests/testData/psi/controlFlow/flow5.java create mode 100644 java/java-tests/testData/psi/controlFlow/flow5.txt create mode 100644 java/java-tests/testData/psi/controlFlow/flow6.java create mode 100644 java/java-tests/testData/psi/controlFlow/flow6.txt create mode 100644 java/java-tests/testData/psi/controlFlow/flow7.java create mode 100644 java/java-tests/testData/psi/controlFlow/flow7.txt create mode 100644 java/java-tests/testData/psi/controlFlow/flow8.java create mode 100644 java/java-tests/testData/psi/controlFlow/flow8.txt create mode 100644 java/java-tests/testData/psi/controlFlow/flow9.java create mode 100644 java/java-tests/testData/psi/controlFlow/flow9.txt create mode 100644 java/java-tests/testData/psi/controlFlow/flowAnd.java create mode 100644 java/java-tests/testData/psi/controlFlow/flowAnd.txt create mode 100644 java/java-tests/testData/psi/controlFlow/flowAnd2.java create mode 100644 java/java-tests/testData/psi/controlFlow/flowAnd2.txt create mode 100644 java/java-tests/testData/psi/controlFlow/flowAnd3.java create mode 100644 java/java-tests/testData/psi/controlFlow/flowAnd3.txt create mode 100644 java/java-tests/testData/psi/controlFlow/flowConditional.java create mode 100644 java/java-tests/testData/psi/controlFlow/flowConditional.txt create mode 100644 java/java-tests/testData/psi/controlFlow/flowNestedConditional.java create mode 100644 java/java-tests/testData/psi/controlFlow/flowNestedConditional.txt create mode 100644 java/java-tests/testSrc/com/intellij/codeInsight/psi/ControlFlowTest.java diff --git a/java/java-tests/testData/psi/controlFlow/flow0.java b/java/java-tests/testData/psi/controlFlow/flow0.java new file mode 100644 index 000000000000..8255213af8cd --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow0.java @@ -0,0 +1,5 @@ +// LocalsOrMyInstanceFieldsControlFlowPolicy +public class a { + void f() { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flow0.txt b/java/java-tests/testData/psi/controlFlow/flow0.txt new file mode 100644 index 000000000000..7a91a25822f1 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow0.txt @@ -0,0 +1 @@ +0: EMPTY \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flow1.java b/java/java-tests/testData/psi/controlFlow/flow1.java new file mode 100644 index 000000000000..8288e7725a2b --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow1.java @@ -0,0 +1,10 @@ +// LocalsOrMyInstanceFieldsControlFlowPolicy +public class a { + void f() { + int i = 0; + if (i==0) { + i = 5; + i = 9; + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flow1.txt b/java/java-tests/testData/psi/controlFlow/flow1.txt new file mode 100644 index 000000000000..f29710d0c09e --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow1.txt @@ -0,0 +1,5 @@ +0: WRITE i +1: READ i +2: COND_GOTO [END] 5 +3: WRITE i +4: WRITE i diff --git a/java/java-tests/testData/psi/controlFlow/flow10.java b/java/java-tests/testData/psi/controlFlow/flow10.java new file mode 100644 index 000000000000..0c20afef5117 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow10.java @@ -0,0 +1,17 @@ +// LocalsOrMyInstanceFieldsControlFlowPolicy + + +public class d { + void f(d[] aspects) { + for (int i = 0; i < aspects.length; i++) { + final int line; + try { + line = Integer.parseInt("2"); // / + } + catch (Exception e) { + continue; + } + } + } + +} diff --git a/java/java-tests/testData/psi/controlFlow/flow10.txt b/java/java-tests/testData/psi/controlFlow/flow10.txt new file mode 100644 index 000000000000..daee929757ae --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow10.txt @@ -0,0 +1,11 @@ +0: EMPTY +1: COND_THROW_TO 8 +2: EMPTY +3: WRITE line +4: COND_THROW_TO 8 +5: COND_THROW_TO 8 +6: COND_THROW_TO 8 +7: GOTO [END] 11 +8: WRITE e +9: GOTO [END] 11 +10: GOTO [END] 11 \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flow11.java b/java/java-tests/testData/psi/controlFlow/flow11.java new file mode 100644 index 000000000000..ecaa0ba1f45d --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow11.java @@ -0,0 +1,11 @@ +// LocalsOrMyInstanceFieldsControlFlowPolicy + + +public class a { + int f(boolean b1, boolean b2) { + while (b1 || b2) { + } + return 0; + } + +} diff --git a/java/java-tests/testData/psi/controlFlow/flow11.txt b/java/java-tests/testData/psi/controlFlow/flow11.txt new file mode 100644 index 000000000000..3042062e034a --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow11.txt @@ -0,0 +1,7 @@ +0: READ b1 +1: COND_GOTO [END] 4 +2: READ b2 +3: COND_GOTO [END] 6 +4: EMPTY +5: GOTO [END] 0 +6: GOTO [END] 7 RETURN diff --git a/java/java-tests/testData/psi/controlFlow/flow12.java b/java/java-tests/testData/psi/controlFlow/flow12.java new file mode 100644 index 000000000000..0f2991938bc8 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow12.java @@ -0,0 +1,11 @@ +// LocalsOrMyInstanceFieldsControlFlowPolicy + + +public class a { + int f(boolean b1, boolean b2) { + do { + } while (b1 || b2); + return 0; + } + +} diff --git a/java/java-tests/testData/psi/controlFlow/flow12.txt b/java/java-tests/testData/psi/controlFlow/flow12.txt new file mode 100644 index 000000000000..84ebf6b9ee59 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow12.txt @@ -0,0 +1,6 @@ +0: EMPTY +1: READ b1 +2: COND_GOTO [END] 0 +3: READ b2 +4: COND_GOTO [END] 0 +5: GOTO [END] 6 RETURN diff --git a/java/java-tests/testData/psi/controlFlow/flow13.java b/java/java-tests/testData/psi/controlFlow/flow13.java new file mode 100644 index 000000000000..ab5a7d9226e2 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow13.java @@ -0,0 +1,22 @@ +// LocalsOrMyInstanceFieldsControlFlowPolicy + +import java.io.IOException; + +import java.io.EOFException; + +public class a { + + int f(boolean b1, boolean b2) { + + try { + throw new IOException(); + } catch (EOFException eof) { + eof.printStackTrace(); + } catch (IOException io) { + io.printStackTrace(); + } + + return 0; + } + +} diff --git a/java/java-tests/testData/psi/controlFlow/flow13.txt b/java/java-tests/testData/psi/controlFlow/flow13.txt new file mode 100644 index 000000000000..9b908b4db751 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow13.txt @@ -0,0 +1,15 @@ +0: COND_THROW_TO 10 +1: COND_THROW_TO 6 +2: EMPTY +3: COND_THROW_TO 10 +4: THROW_TO 6 +5: GOTO [END] 14 +6: WRITE io +7: READ io +8: EMPTY +9: GOTO [END] 14 +10: WRITE eof +11: READ eof +12: EMPTY +13: GOTO [END] 14 +14: GOTO [END] 15 RETURN \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flow14.java b/java/java-tests/testData/psi/controlFlow/flow14.java new file mode 100644 index 000000000000..eac657f2252c --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow14.java @@ -0,0 +1,20 @@ +// LocalsOrMyInstanceFieldsControlFlowPolicy + + + +public class B { + protected Object invokeNext(Object mi) + throws Exception + { + try { + return this; + } finally { + try { + } finally { + return null; + } + } + } + + +} diff --git a/java/java-tests/testData/psi/controlFlow/flow14.txt b/java/java-tests/testData/psi/controlFlow/flow14.txt new file mode 100644 index 000000000000..88a23d8739e6 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow14.txt @@ -0,0 +1,30 @@ +0: COND_THROW_TO 9 +1: GOTO [END] 7 RETURN +2: COND_THROW_TO 9 +3: COND_THROW_TO 9 +4: GOTO [END] 5 +5: CALL 11 +6: GOTO [END] 30 +7: CALL 11 +8: GOTO [END] 30 RETURN +9: CALL 11 +10: GOTO [END] 29 +11: COND_THROW_TO 19 +12: EMPTY +13: COND_THROW_TO 19 +14: GOTO [END] 15 +15: CALL 21 +16: GOTO [END] 26 +17: CALL 21 +18: GOTO [END] 27 RETURN +19: CALL 21 +20: GOTO [END] 25 +21: GOTO [END] 23 RETURN +22: RETURN FROM 21 +23: RETURN FROM 21 TO 18 +24: RETURN FROM 21 TO 20 +25: THROW_TO 30 +26: RETURN FROM 11 +27: RETURN FROM 11 TO 8 +28: RETURN FROM 11 TO 10 +29: THROW_TO 30 \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flow15.java b/java/java-tests/testData/psi/controlFlow/flow15.java new file mode 100644 index 000000000000..710f44d955dc --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow15.java @@ -0,0 +1,37 @@ +// LocalsOrMyInstanceFieldsControlFlowPolicy +// SCR 12926 + +import java.rmi.RemoteException; + +public class B { + public Object show(Object obj) + { + try + { + throw new NullPointerException(); + } + catch ( NullPointerException npe ) + { + } + finally + { + if ( obj != null ) + { + try + { + throw new RemoteException(); + } + catch ( RemoteException re ) + { + System.out.println( re ); + } + finally + { + obj = null; + } + } + } + return null; + } + +} diff --git a/java/java-tests/testData/psi/controlFlow/flow15.txt b/java/java-tests/testData/psi/controlFlow/flow15.txt new file mode 100644 index 000000000000..11aaeb74f8ef --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow15.txt @@ -0,0 +1,27 @@ +0: READ obj +1: COND_GOTO [END] 27 +2: COND_THROW_TO 9 +3: COND_THROW_TO 20 +4: EMPTY +5: THROW_TO 9 +6: COND_THROW_TO 20 +7: COND_THROW_TO 20 +8: GOTO [END] 16 +9: WRITE re +10: COND_THROW_TO 20 +11: READ re +12: EMPTY +13: COND_THROW_TO 20 +14: COND_THROW_TO 20 +15: GOTO [END] 16 +16: CALL 22 +17: GOTO [END] 27 +18: CALL 22 +19: GOTO [END] 27 RETURN +20: CALL 22 +21: GOTO [END] 26 +22: WRITE obj +23: RETURN FROM 22 +24: RETURN FROM 22 TO 19 +25: RETURN FROM 22 TO 21 +26: THROW_TO 27 \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flow16.java b/java/java-tests/testData/psi/controlFlow/flow16.java new file mode 100644 index 000000000000..9c5a8cae8915 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow16.java @@ -0,0 +1,20 @@ +// LocalsOrMyInstanceFieldsControlFlowPolicy +import java.io.IOException; + +class TestIdea939 { + public boolean test() throws IOException { + try { + return geta(); + } catch (IOException e) { + throw new RuntimeException(); + } finally { + geta(); + } + } + + private boolean geta() throws IOException { + return true; + } + +} + diff --git a/java/java-tests/testData/psi/controlFlow/flow16.txt b/java/java-tests/testData/psi/controlFlow/flow16.txt new file mode 100644 index 000000000000..41d81dc179ae --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow16.txt @@ -0,0 +1,28 @@ +0: COND_THROW_TO 8 +1: COND_THROW_TO 19 +2: EMPTY +3: COND_THROW_TO 8 +4: GOTO [END] 17 RETURN +5: COND_THROW_TO 19 +6: COND_THROW_TO 19 +7: GOTO [END] 15 +8: WRITE e +9: COND_THROW_TO 19 +10: EMPTY +11: THROW_TO 19 +12: COND_THROW_TO 19 +13: COND_THROW_TO 19 +14: GOTO [END] 15 +15: CALL 21 +16: GOTO [END] 28 +17: CALL 21 +18: GOTO [END] 28 RETURN +19: CALL 21 +20: GOTO [END] 27 +21: EMPTY +22: COND_THROW_TO 26 +23: RETURN FROM 21 +24: RETURN FROM 21 TO 18 +25: RETURN FROM 21 TO 20 +26: RETURN FROM 21 TO 20 +27: THROW_TO 28 \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flow17.java b/java/java-tests/testData/psi/controlFlow/flow17.java new file mode 100644 index 000000000000..29b9f0a66dff --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow17.java @@ -0,0 +1,10 @@ +// LocalsOrMyInstanceFieldsControlFlowPolicy +class TestForeach { + { + String[] args = new String[256]; + + for(String s : args) { + foo(s); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flow17.txt b/java/java-tests/testData/psi/controlFlow/flow17.txt new file mode 100644 index 000000000000..8c6dc0e07011 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow17.txt @@ -0,0 +1,8 @@ +0: EMPTY +1: WRITE args +2: READ args +3: COND_GOTO [END] 8 +4: WRITE s +5: READ s +6: EMPTY +7: GOTO [END] 3 \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flow18.java b/java/java-tests/testData/psi/controlFlow/flow18.java new file mode 100644 index 000000000000..f9aee731683c --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow18.java @@ -0,0 +1,17 @@ +// LocalsOrMyInstanceFieldsControlFlowPolicy +import java.io.IOException; +import java.io.OutputStream; +public class Outer { + void f(OutputStream writer) { + try { + try { + throw new IOException(); + } finally { + writer.close(); + } + } + catch (IOException e) { + e.hashCode(); + } + } +} diff --git a/java/java-tests/testData/psi/controlFlow/flow18.txt b/java/java-tests/testData/psi/controlFlow/flow18.txt new file mode 100644 index 000000000000..dcaf7868b101 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow18.txt @@ -0,0 +1,28 @@ +0: COND_THROW_TO 24 +1: COND_THROW_TO 24 +2: COND_THROW_TO 12 +3: EMPTY +4: THROW_TO 24 +5: COND_THROW_TO 12 +6: COND_THROW_TO 12 +7: GOTO [END] 8 +8: CALL 14 +9: GOTO [END] 23 +10: CALL 14 +11: GOTO [END] 28 RETURN +12: CALL 14 +13: GOTO [END] 22 +14: READ writer +15: EMPTY +16: COND_THROW_TO 21 +17: COND_THROW_TO 21 +18: RETURN FROM 14 +19: RETURN FROM 14 TO 11 +20: RETURN FROM 14 TO 13 +21: RETURN FROM 14 TO 24 +22: THROW_TO 28 +23: GOTO [END] 28 +24: WRITE e +25: READ e +26: EMPTY +27: GOTO [END] 28 \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flow2.java b/java/java-tests/testData/psi/controlFlow/flow2.java new file mode 100644 index 000000000000..580cb3e80f99 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow2.java @@ -0,0 +1,9 @@ +// LocalsOrMyInstanceFieldsControlFlowPolicy +public class a { + void f(int i) { + while (i==0) { + i = 5; + if (i==3) break; + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flow2.txt b/java/java-tests/testData/psi/controlFlow/flow2.txt new file mode 100644 index 000000000000..9fc6bda5df9b --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow2.txt @@ -0,0 +1,7 @@ +0: READ i +1: COND_GOTO [END] 7 +2: WRITE i +3: READ i +4: COND_GOTO [END] 6 +5: GOTO [END] 7 +6: GOTO [END] 0 diff --git a/java/java-tests/testData/psi/controlFlow/flow3.java b/java/java-tests/testData/psi/controlFlow/flow3.java new file mode 100644 index 000000000000..7016e675b61c --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow3.java @@ -0,0 +1,17 @@ +// LocalsOrMyInstanceFieldsControlFlowPolicy + +public class a { + void f(int i) throws Exception { + i = 5; + try { + f(i); + } catch (Exception e) { + i = 0; + } + finally { + i = 9; + } + + + } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flow3.txt b/java/java-tests/testData/psi/controlFlow/flow3.txt new file mode 100644 index 000000000000..1ccbde91e574 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow3.txt @@ -0,0 +1,30 @@ +0: WRITE i +1: COND_THROW_TO 13 +2: COND_THROW_TO 13 +3: COND_THROW_TO 23 +4: READ i +5: EMPTY +6: COND_THROW_TO 13 +7: COND_THROW_TO 13 +8: COND_THROW_TO 13 +9: COND_THROW_TO 23 +10: COND_THROW_TO 13 +11: COND_THROW_TO 23 +12: GOTO [END] 19 +13: WRITE e +14: COND_THROW_TO 23 +15: WRITE i +16: COND_THROW_TO 23 +17: COND_THROW_TO 23 +18: GOTO [END] 19 +19: CALL 25 +20: GOTO [END] 30 +21: CALL 25 +22: GOTO [END] 30 RETURN +23: CALL 25 +24: GOTO [END] 29 +25: WRITE i +26: RETURN FROM 25 +27: RETURN FROM 25 TO 22 +28: RETURN FROM 25 TO 24 +29: THROW_TO 30 \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flow4.java b/java/java-tests/testData/psi/controlFlow/flow4.java new file mode 100644 index 000000000000..9b38faf49ab6 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow4.java @@ -0,0 +1,11 @@ +// LocalsOrMyInstanceFieldsControlFlowPolicy + +public class a { + void f(int i) throws Exception { + int k =0; + switch (k) { + //case 0: + } + + } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flow4.txt b/java/java-tests/testData/psi/controlFlow/flow4.txt new file mode 100644 index 000000000000..88dfcc650894 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow4.txt @@ -0,0 +1,4 @@ +0: WRITE k +1: READ k +2: GOTO [END] 3 + diff --git a/java/java-tests/testData/psi/controlFlow/flow5.java b/java/java-tests/testData/psi/controlFlow/flow5.java new file mode 100644 index 000000000000..7680ae3e9a82 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow5.java @@ -0,0 +1,13 @@ +// LocalsOrMyInstanceFieldsControlFlowPolicy + +public class a { + void f(int i) throws Exception { + int k =0; + switch (k) { + case 0: k=0; break; + case 1: k=1; break; + default: k=9; break; + } + + } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flow5.txt b/java/java-tests/testData/psi/controlFlow/flow5.txt new file mode 100644 index 000000000000..d688ce48cf8c --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow5.txt @@ -0,0 +1,12 @@ +0: WRITE k +1: READ k +2: COND_GOTO [END] 5 +3: COND_GOTO [END] 7 +4: COND_GOTO [END] 9 +5: WRITE k +6: GOTO [END] 11 +7: WRITE k +8: GOTO [END] 11 +9: WRITE k +10: GOTO [END] 11 + diff --git a/java/java-tests/testData/psi/controlFlow/flow6.java b/java/java-tests/testData/psi/controlFlow/flow6.java new file mode 100644 index 000000000000..b33fb3b9e630 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow6.java @@ -0,0 +1,13 @@ +// LocalsOrMyInstanceFieldsControlFlowPolicy + +public class a { + boolean c; + void f(int i) throws Exception { + for (int i=0; i<100; i++) { + if (i==0) break; + if (i==1) continue; + c = !c; + } + + } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flow6.txt b/java/java-tests/testData/psi/controlFlow/flow6.txt new file mode 100644 index 000000000000..012f67a7e1f3 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow6.txt @@ -0,0 +1,15 @@ +0: WRITE i +1: READ i +2: COND_GOTO [END] 14 +3: READ i +4: COND_GOTO [END] 6 +5: GOTO [END] 14 +6: READ i +7: COND_GOTO [END] 9 +8: GOTO [END] 11 +9: READ c +10: WRITE c +11: READ i +12: WRITE i +13: GOTO [END] 1 + diff --git a/java/java-tests/testData/psi/controlFlow/flow7.java b/java/java-tests/testData/psi/controlFlow/flow7.java new file mode 100644 index 000000000000..74942361c206 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow7.java @@ -0,0 +1,11 @@ +// LocalsOrMyInstanceFieldsControlFlowPolicy + +public class a { + boolean c; + void f(int i) throws Exception { + do { + c=!c; + } while (!c); + + } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flow7.txt b/java/java-tests/testData/psi/controlFlow/flow7.txt new file mode 100644 index 000000000000..dc7ba9b263e3 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow7.txt @@ -0,0 +1,5 @@ +0: READ c +1: WRITE c +2: READ c +3: COND_GOTO [END] 0 + diff --git a/java/java-tests/testData/psi/controlFlow/flow8.java b/java/java-tests/testData/psi/controlFlow/flow8.java new file mode 100644 index 000000000000..d205258958a8 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow8.java @@ -0,0 +1,12 @@ +// LocalsOrMyInstanceFieldsControlFlowPolicy + +public class a { + boolean c; + void f(int i) throws Exception { + do { + if (c) break; + c=!c; + if (c) continue; + } while (!c); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flow8.txt b/java/java-tests/testData/psi/controlFlow/flow8.txt new file mode 100644 index 000000000000..ae4fa30b7a40 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow8.txt @@ -0,0 +1,10 @@ +0: READ c +1: COND_GOTO [END] 3 +2: GOTO [END] 10 +3: READ c +4: WRITE c +5: READ c +6: COND_GOTO [END] 8 +7: GOTO [END] 8 +8: READ c +9: COND_GOTO [END] 0 diff --git a/java/java-tests/testData/psi/controlFlow/flow9.java b/java/java-tests/testData/psi/controlFlow/flow9.java new file mode 100644 index 000000000000..6e24d2e3f080 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow9.java @@ -0,0 +1,20 @@ +// LocalsOrMyInstanceFieldsControlFlowPolicy + + +import java.io.FileNotFoundException; +import java.io.FileReader; + +class ExceptionTestCase { + + void cf1(int i) { + Object o; + try { + o = new FileReader(""); // + } + catch (FileNotFoundException e) { // + } + finally { + if (i==1) return; + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flow9.txt b/java/java-tests/testData/psi/controlFlow/flow9.txt new file mode 100644 index 000000000000..b764d8d36660 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flow9.txt @@ -0,0 +1,27 @@ +0: EMPTY +1: COND_THROW_TO 9 +2: COND_THROW_TO 18 +3: COND_THROW_TO 9 +4: WRITE o +5: COND_THROW_TO 9 +6: COND_THROW_TO 18 +7: COND_THROW_TO 18 +8: GOTO [END] 14 +9: WRITE e +10: COND_THROW_TO 18 +11: EMPTY +12: COND_THROW_TO 18 +13: GOTO [END] 14 +14: CALL 20 +15: GOTO [END] 27 +16: CALL 20 +17: GOTO [END] 27 RETURN +18: CALL 20 +19: GOTO [END] 26 +20: READ i +21: COND_GOTO [END] 23 +22: GOTO [END] 24 RETURN +23: RETURN FROM 20 +24: RETURN FROM 20 TO 17 +25: RETURN FROM 20 TO 19 +26: THROW_TO 27 \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flowAnd.java b/java/java-tests/testData/psi/controlFlow/flowAnd.java new file mode 100644 index 000000000000..ff52046d0e34 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flowAnd.java @@ -0,0 +1,12 @@ +// LocalsOrMyInstanceFieldsControlFlowPolicy + +import java.io.FileNotFoundException; +import java.io.FileReader; + +class ExceptionTestCase { + + public void ensureAllInvalidateTasksCompleted(boolean a, boolean b, boolean c) { + final boolean doProgressThing; + doProgressThing = c && a && b; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flowAnd.txt b/java/java-tests/testData/psi/controlFlow/flowAnd.txt new file mode 100644 index 000000000000..f5ae0473219a --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flowAnd.txt @@ -0,0 +1,7 @@ +0: EMPTY +1: READ c +2: COND_GOTO [END] 6 +3: READ a +4: COND_GOTO [END] 6 +5: READ b +6: WRITE doProgressThing \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flowAnd2.java b/java/java-tests/testData/psi/controlFlow/flowAnd2.java new file mode 100644 index 000000000000..6a30f525b2f1 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flowAnd2.java @@ -0,0 +1,15 @@ +// LocalsOrMyInstanceFieldsControlFlowPolicy + +class ExceptionTestCase { + public String getIndexingLexer(final boolean file, boolean b1, boolean b2) { + String highlighter; + + if (file && b1 && b2) { + highlighter = "then"; + } + else { + highlighter = "else"; + } + return highlighter; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flowAnd2.txt b/java/java-tests/testData/psi/controlFlow/flowAnd2.txt new file mode 100644 index 000000000000..3e23cd10adf3 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flowAnd2.txt @@ -0,0 +1,12 @@ +0: EMPTY +1: READ file +2: COND_GOTO [END] 9 +3: READ b1 +4: COND_GOTO [ELSE] 9 +5: READ b2 +6: COND_GOTO [ELSE] 9 +7: WRITE highlighter +8: GOTO [END] 10 +9: WRITE highlighter +10: READ highlighter +11: GOTO [END] 12 RETURN \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flowAnd3.java b/java/java-tests/testData/psi/controlFlow/flowAnd3.java new file mode 100644 index 000000000000..9b7ac0fbbef1 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flowAnd3.java @@ -0,0 +1,9 @@ +// LocalsOrMyInstanceFieldsControlFlowPolicy + +class c { + String container; + void f() { + String parent; + if (container == null && (parent = null) != null && parent != null) {} + } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flowAnd3.txt b/java/java-tests/testData/psi/controlFlow/flowAnd3.txt new file mode 100644 index 000000000000..b9e8391cc639 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flowAnd3.txt @@ -0,0 +1,8 @@ +0: EMPTY +1: READ container +2: COND_GOTO [END] 8 +3: WRITE parent +4: COND_GOTO [END] 8 +5: READ parent +6: COND_GOTO [END] 8 +7: EMPTY \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flowConditional.java b/java/java-tests/testData/psi/controlFlow/flowConditional.java new file mode 100644 index 000000000000..fb9fd916dc2b --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flowConditional.java @@ -0,0 +1,10 @@ +// LocalsOrMyInstanceFieldsControlFlowPolicy + +class ExceptionTestCase { + void f(boolean a, boolean b) { + int n; + if ((a || a) && (n = 0) >= 2) { + n++; // + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/psi/controlFlow/flowConditional.txt b/java/java-tests/testData/psi/controlFlow/flowConditional.txt new file mode 100644 index 000000000000..f3e7a88388e3 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flowConditional.txt @@ -0,0 +1,9 @@ +0: EMPTY +1: READ a +2: COND_GOTO [END] 5 +3: READ a +4: COND_GOTO [END] 9 +5: WRITE n +6: COND_GOTO [END] 9 +7: READ n +8: WRITE n diff --git a/java/java-tests/testData/psi/controlFlow/flowNestedConditional.java b/java/java-tests/testData/psi/controlFlow/flowNestedConditional.java new file mode 100644 index 000000000000..1098e2e07fd3 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flowNestedConditional.java @@ -0,0 +1,15 @@ +// LocalsOrMyInstanceFieldsControlFlowPolicy + +class MyTest { + void f(Object o, long childrenStamp, Object o2) { + long currentStamp; + if ((o instanceof String && childrenStamp != (currentStamp = 0)) + || + (o2 instanceof Integer && childrenStamp != (currentStamp = 1)) + ) + { + childrenStamp = currentStamp; + } + } + +} diff --git a/java/java-tests/testData/psi/controlFlow/flowNestedConditional.txt b/java/java-tests/testData/psi/controlFlow/flowNestedConditional.txt new file mode 100644 index 000000000000..dce8abfef512 --- /dev/null +++ b/java/java-tests/testData/psi/controlFlow/flowNestedConditional.txt @@ -0,0 +1,13 @@ +0: EMPTY +1: READ o +2: COND_GOTO [END] 6 +3: READ childrenStamp +4: WRITE currentStamp +5: COND_GOTO [THEN] 11 +6: READ o2 +7: COND_GOTO [END] 13 +8: READ childrenStamp +9: WRITE currentStamp +10: COND_GOTO [END] 13 +11: READ currentStamp +12: WRITE childrenStamp \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/psi/ControlFlowTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/psi/ControlFlowTest.java new file mode 100644 index 000000000000..8d7588783c74 --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/codeInsight/psi/ControlFlowTest.java @@ -0,0 +1,94 @@ +package com.intellij.codeInsight.psi; + +import com.intellij.openapi.application.ex.PathManagerEx; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiCodeBlock; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiJavaFile; +import com.intellij.psi.controlFlow.*; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.testFramework.LightCodeInsightTestCase; +import com.intellij.util.containers.IntArrayList; +import org.jetbrains.annotations.NonNls; + +import java.io.File; +import java.io.FilenameFilter; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author cdr + * Date: Nov 25, 2002 + */ +public class ControlFlowTest extends LightCodeInsightTestCase { + @NonNls private static final String BASE_PATH = "/psi/controlFlow"; + + private static void doTestFor(final File file) throws Exception { + String contents = StringUtil.convertLineSeparators(FileUtil.loadFile(file)); + configureFromFileText(file.getName(), contents); + // extract factory policy class name + Pattern pattern = Pattern.compile("^// (\\S*).*", Pattern.DOTALL); + Matcher matcher = pattern.matcher(contents); + assertTrue(matcher.matches()); + final String policyClassName = matcher.group(1); + final ControlFlowPolicy policy; + if ("LocalsOrMyInstanceFieldsControlFlowPolicy".equals(policyClassName)) { + policy = LocalsOrMyInstanceFieldsControlFlowPolicy.getInstance(); + } + else { + policy = null; + } + + final int offset = getEditor().getCaretModel().getOffset(); + PsiElement element = getFile().findElementAt(offset); + element = PsiTreeUtil.getParentOfType(element, PsiCodeBlock.class, false); + assertTrue("Selected element: "+element, element instanceof PsiCodeBlock); + + ControlFlow controlFlow = ControlFlowFactory.getInstance(getProject()).getControlFlow(element, policy); + String result = controlFlow.toString().trim(); + + final String expectedFullPath = StringUtil.trimEnd(file.getPath(),".java") + ".txt"; + VirtualFile expectedFile = LocalFileSystem.getInstance().findFileByPath(expectedFullPath); + String expected = new String(expectedFile.contentsToByteArray()).trim(); + expected = expected.replaceAll("\r",""); + assertEquals("Text mismatch (in file "+expectedFullPath+"):\n",expected, result); + } + + private static void doAllTests() throws Exception { + final String testDirPath = PathManagerEx.getTestDataPath().replace(File.separatorChar, '/') + BASE_PATH; + File testDir = new File(testDirPath); + final File[] files = testDir.listFiles(new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + return name.endsWith(".java"); + } + }); + for (int i = 0; i < files.length; i++) { + File file = files[i]; + doTestFor(file); + + System.out.print((i+1)+" "); + } + } + + public void test() throws Exception { doAllTests(); } + + public void testMethodWithOnlyDoWhileStatementHasExitPoints() throws Exception { + configureFromFileText("a.java", "public class Foo {\n" + + " public void foo() {\n" + + " boolean f;\n" + + " do {\n" + + " f = something();\n" + + " } while (f);\n" + + " }\n" + + "}"); + final PsiCodeBlock body = ((PsiJavaFile)getFile()).getClasses()[0].getMethods()[0].getBody(); + ControlFlow flow = ControlFlowFactory.getInstance(getProject()).getControlFlow(body, new LocalsControlFlowPolicy(body), false); + IntArrayList exitPoints = new IntArrayList(); + ControlFlowUtil.findExitPointsAndStatements(flow, 0, flow.getSize() -1 , exitPoints, ControlFlowUtil.DEFAULT_EXIT_STATEMENTS_CLASSES); + assertEquals(1, exitPoints.size()); + } +}