moved to community

This commit is contained in:
Alexey Kudravtsev
2011-07-07 14:49:20 +04:00
parent 23d1e25d34
commit f3631279a7
49 changed files with 766 additions and 0 deletions
@@ -0,0 +1,5 @@
// LocalsOrMyInstanceFieldsControlFlowPolicy
public class a {
void f() {<caret>
}
}
@@ -0,0 +1 @@
0: EMPTY
@@ -0,0 +1,10 @@
// LocalsOrMyInstanceFieldsControlFlowPolicy
public class a {
void f() {<caret>
int i = 0;
if (i==0) {
i = 5;
i = 9;
}
}
}
@@ -0,0 +1,5 @@
0: WRITE i
1: READ i
2: COND_GOTO [END] 5
3: WRITE i
4: WRITE i
@@ -0,0 +1,17 @@
// LocalsOrMyInstanceFieldsControlFlowPolicy
public class d {
void f(d[] aspects) {
for (int i = 0; i < aspects.length; i++) {<caret>
final int line;
try {
line = Integer.parseInt("2"); // /
}
catch (Exception e) {
continue;
}
}
}
}
@@ -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
@@ -0,0 +1,11 @@
// LocalsOrMyInstanceFieldsControlFlowPolicy
public class a {
int f(boolean b1, boolean b2) {<caret>
while (b1 || b2) {
}
return 0;
}
}
@@ -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
@@ -0,0 +1,11 @@
// LocalsOrMyInstanceFieldsControlFlowPolicy
public class a {
int f(boolean b1, boolean b2) {<caret>
do {
} while (b1 || b2);
return 0;
}
}
@@ -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
@@ -0,0 +1,22 @@
// LocalsOrMyInstanceFieldsControlFlowPolicy
import java.io.IOException;
import java.io.EOFException;
public class a {
int f(boolean b1, boolean b2) {<caret>
try {
throw new IOException();
} catch (EOFException eof) {
eof.printStackTrace();
} catch (IOException io) {
io.printStackTrace();
}
return 0;
}
}
@@ -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
@@ -0,0 +1,20 @@
// LocalsOrMyInstanceFieldsControlFlowPolicy
public class B {
protected Object invokeNext(Object mi)
throws Exception
{<caret>
try {
return this;
} finally {
try {
} finally {
return null;
}
}
}
}
@@ -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
@@ -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
{<caret>
if ( obj != null )
{
try
{
throw new RemoteException();
}
catch ( RemoteException re )
{
System.out.println( re );
}
finally
{
obj = null;
}
}
}
return null;
}
}
@@ -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
@@ -0,0 +1,20 @@
// LocalsOrMyInstanceFieldsControlFlowPolicy
import java.io.IOException;
class TestIdea939 {
public boolean test() throws IOException {<caret>
try {
return geta();
} catch (IOException e) {
throw new RuntimeException();
} finally {
geta();
}
}
private boolean geta() throws IOException {
return true;
}
}
@@ -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
@@ -0,0 +1,10 @@
// LocalsOrMyInstanceFieldsControlFlowPolicy
class TestForeach {
{<caret>
String[] args = new String[256];
for(String s : args) {
foo(s);
}
}
}
@@ -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
@@ -0,0 +1,17 @@
// LocalsOrMyInstanceFieldsControlFlowPolicy
import java.io.IOException;
import java.io.OutputStream;
public class Outer {
void f(OutputStream writer) { <caret>
try {
try {
throw new IOException();
} finally {
writer.close();
}
}
catch (IOException e) {
e.hashCode();
}
}
}
@@ -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
@@ -0,0 +1,9 @@
// LocalsOrMyInstanceFieldsControlFlowPolicy
public class a {
void f(int i) {<caret>
while (i==0) {
i = 5;
if (i==3) break;
}
}
}
@@ -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
@@ -0,0 +1,17 @@
// LocalsOrMyInstanceFieldsControlFlowPolicy
public class a {
void f(int i) throws Exception {<caret>
i = 5;
try {
f(i);
} catch (Exception e) {
i = 0;
}
finally {
i = 9;
}
}
}
@@ -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
@@ -0,0 +1,11 @@
// LocalsOrMyInstanceFieldsControlFlowPolicy
public class a {
void f(int i) throws Exception {<caret>
int k =0;
switch (k) {
//case 0:
}
}
}
@@ -0,0 +1,4 @@
0: WRITE k
1: READ k
2: GOTO [END] 3
@@ -0,0 +1,13 @@
// LocalsOrMyInstanceFieldsControlFlowPolicy
public class a {
void f(int i) throws Exception {<caret>
int k =0;
switch (k) {
case 0: k=0; break;
case 1: k=1; break;
default: k=9; break;
}
}
}
@@ -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
@@ -0,0 +1,13 @@
// LocalsOrMyInstanceFieldsControlFlowPolicy
public class a {
boolean c;
void f(int i) throws Exception {<caret>
for (int i=0; i<100; i++) {
if (i==0) break;
if (i==1) continue;
c = !c;
}
}
}
@@ -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
@@ -0,0 +1,11 @@
// LocalsOrMyInstanceFieldsControlFlowPolicy
public class a {
boolean c;
void f(int i) throws Exception {<caret>
do {
c=!c;
} while (!c);
}
}
@@ -0,0 +1,5 @@
0: READ c
1: WRITE c
2: READ c
3: COND_GOTO [END] 0
@@ -0,0 +1,12 @@
// LocalsOrMyInstanceFieldsControlFlowPolicy
public class a {
boolean c;
void f(int i) throws Exception {<caret>
do {
if (c) break;
c=!c;
if (c) continue;
} while (!c);
}
}
@@ -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
@@ -0,0 +1,20 @@
// LocalsOrMyInstanceFieldsControlFlowPolicy
import java.io.FileNotFoundException;
import java.io.FileReader;
class ExceptionTestCase {
void cf1(int i) {<caret>
Object o;
try {
o = new FileReader(""); //
}
catch (FileNotFoundException e) { //
}
finally {
if (i==1) return;
}
}
}
@@ -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
@@ -0,0 +1,12 @@
// LocalsOrMyInstanceFieldsControlFlowPolicy
import java.io.FileNotFoundException;
import java.io.FileReader;
class ExceptionTestCase {
public void ensureAllInvalidateTasksCompleted(boolean a, boolean b, boolean c) {<caret>
final boolean doProgressThing;
doProgressThing = c && a && b;
}
}
@@ -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
@@ -0,0 +1,15 @@
// LocalsOrMyInstanceFieldsControlFlowPolicy
class ExceptionTestCase {
public String getIndexingLexer(final boolean file, boolean b1, boolean b2) {<caret>
String highlighter;
if (file && b1 && b2) {
highlighter = "then";
}
else {
highlighter = "else";
}
return highlighter;
}
}
@@ -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
@@ -0,0 +1,9 @@
// LocalsOrMyInstanceFieldsControlFlowPolicy
class c {
String container;
void f() {<caret>
String parent;
if (container == null && (parent = null) != null && parent != null) {}
}
}
@@ -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
@@ -0,0 +1,10 @@
// LocalsOrMyInstanceFieldsControlFlowPolicy
class ExceptionTestCase {
void f(boolean a, boolean b) {<caret>
int n;
if ((a || a) && (n = 0) >= 2) {
n++; //
}
}
}
@@ -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
@@ -0,0 +1,15 @@
// LocalsOrMyInstanceFieldsControlFlowPolicy
class MyTest {
void f(Object o, long childrenStamp, Object o2) {<caret>
long currentStamp;
if ((o instanceof String && childrenStamp != (currentStamp = 0))
||
(o2 instanceof Integer && childrenStamp != (currentStamp = 1))
)
{
childrenStamp = currentStamp;
}
}
}
@@ -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
@@ -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());
}
}