From ff0cc376cbe24bfd8b3c77a352d9a9da7a6f2b97 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 19 Aug 2014 11:00:46 +0400 Subject: [PATCH] convert to atomic/thread local: array initializer aware (IDEA-128625) --- .../intentions/ConvertFieldToAtomicIntention.java | 10 ++++++++-- .../intentions/ConvertFieldToThreadLocalIntention.java | 8 +++++++- .../intentions/atomic/afterArrayInitializer.java | 6 ++++++ .../intentions/atomic/beforeArrayInitializer.java | 4 ++++ .../intentions/threadLocal/afterArrayInitializer.java | 9 +++++++++ .../intentions/threadLocal/beforeArrayInitializer.java | 4 ++++ 6 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 java/typeMigration/testData/intentions/atomic/afterArrayInitializer.java create mode 100644 java/typeMigration/testData/intentions/atomic/beforeArrayInitializer.java create mode 100644 java/typeMigration/testData/intentions/threadLocal/afterArrayInitializer.java create mode 100644 java/typeMigration/testData/intentions/threadLocal/beforeArrayInitializer.java diff --git a/java/typeMigration/src/com/intellij/refactoring/typeMigration/intentions/ConvertFieldToAtomicIntention.java b/java/typeMigration/src/com/intellij/refactoring/typeMigration/intentions/ConvertFieldToAtomicIntention.java index e983453a11c6..430f2182e516 100644 --- a/java/typeMigration/src/com/intellij/refactoring/typeMigration/intentions/ConvertFieldToAtomicIntention.java +++ b/java/typeMigration/src/com/intellij/refactoring/typeMigration/intentions/ConvertFieldToAtomicIntention.java @@ -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); } diff --git a/java/typeMigration/src/com/intellij/refactoring/typeMigration/intentions/ConvertFieldToThreadLocalIntention.java b/java/typeMigration/src/com/intellij/refactoring/typeMigration/intentions/ConvertFieldToThreadLocalIntention.java index 38ff0ef466ae..8bdce8435be8 100644 --- a/java/typeMigration/src/com/intellij/refactoring/typeMigration/intentions/ConvertFieldToThreadLocalIntention.java +++ b/java/typeMigration/src/com/intellij/refactoring/typeMigration/intentions/ConvertFieldToThreadLocalIntention.java @@ -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); diff --git a/java/typeMigration/testData/intentions/atomic/afterArrayInitializer.java b/java/typeMigration/testData/intentions/atomic/afterArrayInitializer.java new file mode 100644 index 000000000000..f2b51fa36440 --- /dev/null +++ b/java/typeMigration/testData/intentions/atomic/afterArrayInitializer.java @@ -0,0 +1,6 @@ +import java.util.concurrent.atomic.AtomicReferenceArray; + +// "Convert to atomic" "true" +class Test { + final AtomicReferenceArray field= new AtomicReferenceArray<>(new String[]{}); +} \ No newline at end of file diff --git a/java/typeMigration/testData/intentions/atomic/beforeArrayInitializer.java b/java/typeMigration/testData/intentions/atomic/beforeArrayInitializer.java new file mode 100644 index 000000000000..6ef272b130e7 --- /dev/null +++ b/java/typeMigration/testData/intentions/atomic/beforeArrayInitializer.java @@ -0,0 +1,4 @@ +// "Convert to atomic" "true" +class Test { + String[] field={}; +} \ No newline at end of file diff --git a/java/typeMigration/testData/intentions/threadLocal/afterArrayInitializer.java b/java/typeMigration/testData/intentions/threadLocal/afterArrayInitializer.java new file mode 100644 index 000000000000..59323f18e0e5 --- /dev/null +++ b/java/typeMigration/testData/intentions/threadLocal/afterArrayInitializer.java @@ -0,0 +1,9 @@ +// "Convert to ThreadLocal" "true" +class Test { + final ThreadLocal field = new ThreadLocal() { + @Override + protected String[] initialValue() { + return new String[]{}; + } + }; +} \ No newline at end of file diff --git a/java/typeMigration/testData/intentions/threadLocal/beforeArrayInitializer.java b/java/typeMigration/testData/intentions/threadLocal/beforeArrayInitializer.java new file mode 100644 index 000000000000..c2564a9cf266 --- /dev/null +++ b/java/typeMigration/testData/intentions/threadLocal/beforeArrayInitializer.java @@ -0,0 +1,4 @@ +// "Convert to ThreadLocal" "true" +class Test { + String[] field={}; +} \ No newline at end of file