IDEA-97460 (Java intention 'Replace for-each with iterator 'for' loop' generates red code)

This commit is contained in:
Bas Leijdekkers
2012-12-14 12:16:49 +01:00
parent 75bed907a4
commit 2f0df90725
4 changed files with 52 additions and 46 deletions
@@ -41,59 +41,43 @@ public class ReplaceForEachLoopWithIteratorForLoopIntention extends Intention {
if (statement == null) {
return;
}
final Project project = statement.getProject();
final JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(project);
final PsiExpression iteratedValue = statement.getIteratedValue();
if (iteratedValue == null) {
return;
}
@NonNls final StringBuilder newStatement = new StringBuilder();
final PsiType iteratedValueType = iteratedValue.getType();
if (!(iteratedValueType instanceof PsiClassType)) {
return;
}
final PsiClassType classType = (PsiClassType)iteratedValueType;
final PsiParameter iterationParameter = statement.getIterationParameter();
final PsiType parameterType = iterationParameter.getType();
final String iterator = codeStyleManager.suggestUniqueVariableName("iterator", statement, true);
final String typeText = parameterType.getCanonicalText();
newStatement.append("for(java.util.Iterator");
if (classType.hasParameters()) {
newStatement.append('<');
final PsiType[] parameters = classType.getParameters();
if (parameters.length == 1) {
newStatement.append(parameters[0].getCanonicalText());
} else {
newStatement.append(typeText);
}
newStatement.append("> ");
} else {
newStatement.append(' ');
}
newStatement.append(iterator);
newStatement.append(" = ");
@NonNls final StringBuilder methodCall = new StringBuilder();
if (ParenthesesUtils.getPrecedence(iteratedValue) > ParenthesesUtils.METHOD_CALL_PRECEDENCE) {
newStatement.append('(');
newStatement.append(iteratedValue.getText());
newStatement.append(')');
methodCall.append('(').append(iteratedValue.getText()).append(')');
}
else {
newStatement.append(iteratedValue.getText());
methodCall.append(iteratedValue.getText());
}
newStatement.append(".iterator();");
newStatement.append(iterator);
newStatement.append(".hasNext();) {");
final CodeStyleSettings codeStyleSettings =
CodeStyleSettingsManager.getSettings(project);
methodCall.append(".iterator()");
final Project project = statement.getProject();
final PsiElementFactory factory = JavaPsiFacade.getInstance(project).getElementFactory();
final PsiExpression iteratorCall = factory.createExpressionFromText(methodCall.toString(), iteratedValue);
final PsiType variableType = GenericsUtil.getVariableTypeByExpressionType(iteratorCall.getType());
if (variableType == null) {
return;
}
@NonNls final StringBuilder newStatement = new StringBuilder();
newStatement.append("for(").append(variableType.getCanonicalText()).append(' ');
final JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(project);
final String iterator = codeStyleManager.suggestUniqueVariableName("iterator", statement, true);
newStatement.append(iterator).append("=").append(iteratorCall.getText()).append(';');
newStatement.append(iterator).append(".hasNext();) {");
final CodeStyleSettings codeStyleSettings = CodeStyleSettingsManager.getSettings(project);
if (codeStyleSettings.GENERATE_FINAL_LOCALS) {
newStatement.append("final ");
}
newStatement.append(typeText);
newStatement.append(' ');
newStatement.append(iterationParameter.getName());
newStatement.append(" = ");
newStatement.append(iterator);
newStatement.append(".next();");
final PsiParameter iterationParameter = statement.getIterationParameter();
final PsiType parameterType = iterationParameter.getType();
final String typeText = parameterType.getCanonicalText();
newStatement.append(typeText).append(' ').append(iterationParameter.getName()).append(" = ").append(iterator).append(".next();");
final PsiStatement body = statement.getBody();
if (body == null) {
return;
@@ -0,0 +1,12 @@
package com.siyeh.ipp.forloop.iterator;
import java.util.List;
import java.util.Map;
class Wildcards {
void renames(Map<? extends List, String> allRenames) {
for<caret> (Map.Entry<? extends List, String> entry : allRenames.entrySet()) {
}
}
}
@@ -0,0 +1,14 @@
package com.siyeh.ipp.forloop.iterator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
class Wildcards {
void renames(Map<? extends List, String> allRenames) {
for (Iterator<? extends Map.Entry<? extends List, String>> iterator = allRenames.entrySet().iterator(); iterator.hasNext(); ) {
Map.Entry<? extends List, String> entry = iterator.next();
}
}
}
@@ -18,13 +18,15 @@ package com.siyeh.ipp.forloop;
import com.siyeh.IntentionPowerPackBundle;
import com.siyeh.ipp.IPPTestCase;
import java.util.Collection;
/**
* @see com.siyeh.ipp.forloop.ReplaceForEachLoopWithIteratorForLoopIntention
*/
public class ReplaceForEachLoopWithIteratorForLoopIntentionTest extends IPPTestCase {
public void testBareCollectionLoop() { doTest(); }
public void testGenericTypes() { doTest(); }
public void testBoundedTypes() { doTest(); }
public void testPrecedence() { doTest(); }
public void testWildcards() { doTest(); }
@Override
protected String getIntentionName() {
@@ -35,10 +37,4 @@ public class ReplaceForEachLoopWithIteratorForLoopIntentionTest extends IPPTestC
protected String getRelativePath() {
return "forloop/iterator";
}
void x(Collection c) {
for (Object n : c) {
}
}
}