convert to atomic/thread local: array initializer aware (IDEA-128625)

This commit is contained in:
Anna Kozlova
2014-08-19 11:05:58 +04:00
parent fe4cee6e89
commit ff0cc376cb
6 changed files with 38 additions and 3 deletions
@@ -19,6 +19,7 @@ import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.refactoring.typeMigration.TypeConversionDescriptor;
import com.intellij.refactoring.typeMigration.TypeMigrationReplacementUtil;
import com.intellij.refactoring.typeMigration.rules.AtomicConversionRule;
import com.intellij.refactoring.util.RefactoringUtil;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.Query;
import com.intellij.util.containers.ContainerUtil;
@@ -180,9 +181,14 @@ public class ConvertFieldToAtomicIntention extends PsiElementBaseIntentionAction
}
}
final PsiExpression initializer = psiVariable.getInitializer();
PsiExpression initializer = psiVariable.getInitializer();
if (initializer != null) {
final TypeConversionDescriptor directConversion = AtomicConversionRule.wrapWithNewExpression(toType, fromType, null, element);
if (initializer instanceof PsiArrayInitializerExpression) {
PsiExpression normalizedExpr =
RefactoringUtil.createNewExpressionFromArrayInitializer((PsiArrayInitializerExpression)initializer, psiVariable.getType());
initializer = (PsiExpression)initializer.replace(normalizedExpr);
}
final TypeConversionDescriptor directConversion = AtomicConversionRule.wrapWithNewExpression(toType, fromType, initializer, element);
if (directConversion != null) {
TypeMigrationReplacementUtil.replaceExpression(initializer, project, directConversion);
}
@@ -25,6 +25,7 @@ import com.intellij.refactoring.typeMigration.TypeMigrationLabeler;
import com.intellij.refactoring.typeMigration.TypeMigrationReplacementUtil;
import com.intellij.refactoring.typeMigration.TypeMigrationRules;
import com.intellij.refactoring.typeMigration.rules.ThreadLocalConversionRule;
import com.intellij.refactoring.util.RefactoringUtil;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.Query;
import com.intellij.util.containers.ContainerUtil;
@@ -116,8 +117,13 @@ public class ConvertFieldToThreadLocalIntention extends PsiElementBaseIntentionA
}
}
final PsiExpression initializer = psiField.getInitializer();
PsiExpression initializer = psiField.getInitializer();
if (initializer != null) {
if (initializer instanceof PsiArrayInitializerExpression) {
PsiExpression normalizedExpr =
RefactoringUtil.createNewExpressionFromArrayInitializer((PsiArrayInitializerExpression)initializer, psiField.getType());
initializer = (PsiExpression)initializer.replace(normalizedExpr);
}
final TypeConversionDescriptor conversion = ThreadLocalConversionRule.wrapWithNewExpression(toType, fromType, initializer);
TypeMigrationReplacementUtil.replaceExpression(initializer, project, conversion);
CodeStyleManager.getInstance(project).reformat(psiField);
@@ -0,0 +1,6 @@
import java.util.concurrent.atomic.AtomicReferenceArray;
// "Convert to atomic" "true"
class Test {
final AtomicReferenceArray<String> field= new AtomicReferenceArray<>(new String[]{});
}
@@ -0,0 +1,4 @@
// "Convert to atomic" "true"
class Test {
String[] <caret>field={};
}
@@ -0,0 +1,9 @@
// "Convert to ThreadLocal" "true"
class Test {
final ThreadLocal<String[]> field = new ThreadLocal<String[]>() {
@Override
protected String[] initialValue() {
return new String[]{};
}
};
}
@@ -0,0 +1,4 @@
// "Convert to ThreadLocal" "true"
class Test {
String[] <caret>field={};
}