mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-13 21:55:01 +07:00
extract method: do not fold when write access was used inside common expressions (IDEA-70376)
This commit is contained in:
@@ -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>
|
||||
}
|
||||
}
|
||||
+14
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user