extract method: do not fold when write access was used inside common expressions (IDEA-70376)

This commit is contained in:
anna
2011-06-01 13:36:22 +04:00
parent 6be3a5a1e0
commit e7262d47ea
4 changed files with 50 additions and 3 deletions
@@ -183,7 +183,7 @@ public class ParametersFolder {
if (expressions == null) {
expressions = new ArrayList<PsiExpression>();
while (expression != null) {
if (PsiUtil.isAccessedForWriting((PsiExpression)expression)) return null;
if (isAccessedForWriting((PsiExpression)expression)) return null;
for (PsiElement scopeElement : scopeElements) {
if (PsiTreeUtil.isAncestor(expression, scopeElement, true)) {
expression = null;
@@ -214,6 +214,26 @@ public class ParametersFolder {
return expressions;
}
private static boolean isAccessedForWriting(PsiExpression expression) {
final PsiExpression[] exprWithWriteAccessInside = new PsiExpression[1];
expression.accept(new JavaRecursiveElementWalkingVisitor() {
@Override
public void visitElement(PsiElement element) {
if (exprWithWriteAccessInside[0] != null) return;
super.visitElement(element);
}
@Override
public void visitExpression(PsiExpression expression) {
if (PsiUtil.isAccessedForWriting(expression)) {
exprWithWriteAccessInside[0] = expression;
}
super.visitExpression(expression);
}
});
return exprWithWriteAccessInside[0] != null;
}
private static boolean dependsOnLocals(final PsiElement expression, final List<? extends PsiVariable> inputVariables) {
final boolean[] localVarsUsed = new boolean[]{false};
expression.accept(new JavaRecursiveElementWalkingVisitor(){
@@ -0,0 +1,10 @@
public class Devk {
void fr(String... params ) {
int idx = 0;
<selection>System.out.println(params[idx++]);
System.out.println(params[idx++]);
System.out.println(params[idx++]);
System.out.println(params[idx++]);</selection>
}
}
@@ -0,0 +1,14 @@
public class Devk {
void fr(String... params ) {
int idx = 0;
newMethod(idx, params);
}
private void newMethod(int idx, String[] params) {
System.out.println(params[idx++]);
System.out.println(params[idx++]);
System.out.println(params[idx++]);
System.out.println(params[idx++]);
}
}
@@ -4,8 +4,6 @@ import com.intellij.JavaTestUtil;
import com.intellij.codeInsight.CodeInsightUtil;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.impl.JavaSdkImpl;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiExpression;
import com.intellij.psi.PsiFile;
@@ -304,6 +302,11 @@ public class ExtractMethodTest extends LightCodeInsightTestCase {
doTest();
}
public void testStopFoldingPostfixInside() throws Exception {
doTest();
}
public void testIDEADEV11748() throws Exception {
doTest();
}