diff --git a/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/AtomicConversionRule.java b/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/AtomicConversionRule.java index 6c97be17157f..3d9c9cdc2943 100644 --- a/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/AtomicConversionRule.java +++ b/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/AtomicConversionRule.java @@ -178,7 +178,9 @@ public class AtomicConversionRule extends TypeConversionRule { if (parent instanceof PsiAssignmentExpression) { final IElementType operationSign = ((PsiAssignmentExpression)parent).getOperationTokenType(); if (operationSign == JavaTokenType.EQ) { - return new TypeConversionDescriptor("$qualifier$ = $val$", "$qualifier$.set($val$)", (PsiAssignmentExpression)parent); + boolean rightInfected = ((PsiAssignmentExpression)parent).getLExpression() == context; + String replacement = rightInfected ? "$qualifier$ = $val$.get()" : "$qualifier$.set($val$)"; + return new TypeConversionDescriptor("$qualifier$ = $val$", replacement, (PsiAssignmentExpression)parent); } } diff --git a/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/ThreadLocalConversionRule.java b/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/ThreadLocalConversionRule.java index 8b8bd25ee0d7..8e471c44b495 100644 --- a/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/ThreadLocalConversionRule.java +++ b/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/ThreadLocalConversionRule.java @@ -89,7 +89,9 @@ public class ThreadLocalConversionRule extends TypeConversionRule { if (parent instanceof PsiAssignmentExpression) { final IElementType operationSign = ((PsiAssignmentExpression)parent).getOperationTokenType(); if (operationSign == JavaTokenType.EQ) { - return new TypeConversionDescriptor("$qualifier$ = $val$", "$qualifier$.set(" + toBoxed("$val$", from, context)+")", (PsiAssignmentExpression)parent); + boolean rightInfected = ((PsiAssignmentExpression)parent).getLExpression() == context; + String replacement = rightInfected ? "$qualifier$ = $val$.get()" : "$qualifier$.set(" + toBoxed("$val$", from, context) + ")"; + return new TypeConversionDescriptor("$qualifier$ = $val$", replacement, (PsiAssignmentExpression)parent); } } diff --git a/java/typeMigration/testData/intentions/atomic/afterAssignment.java b/java/typeMigration/testData/intentions/atomic/afterAssignment.java new file mode 100644 index 000000000000..e519cad3fe50 --- /dev/null +++ b/java/typeMigration/testData/intentions/atomic/afterAssignment.java @@ -0,0 +1,12 @@ +import java.util.concurrent.atomic.AtomicInteger; + +// "Convert to atomic" "true" +class X { + private static final AtomicInteger count = new AtomicInteger(); // convert me + private final int index; + + X() { + count.getAndIncrement(); + index = count.get(); + } +} \ No newline at end of file diff --git a/java/typeMigration/testData/intentions/atomic/beforeAssignment.java b/java/typeMigration/testData/intentions/atomic/beforeAssignment.java new file mode 100644 index 000000000000..d76f0f2a467e --- /dev/null +++ b/java/typeMigration/testData/intentions/atomic/beforeAssignment.java @@ -0,0 +1,10 @@ +// "Convert to atomic" "true" +class X { + private static int count = 0; // convert me + private final int index; + + X() { + count++; + index = count; + } +} \ No newline at end of file diff --git a/java/typeMigration/testData/intentions/threadLocal/afterAssignment.java b/java/typeMigration/testData/intentions/threadLocal/afterAssignment.java new file mode 100644 index 000000000000..c64a159c5b3e --- /dev/null +++ b/java/typeMigration/testData/intentions/threadLocal/afterAssignment.java @@ -0,0 +1,10 @@ +// "Convert to ThreadLocal" "true" +class X { + private static final ThreadLocal count = ThreadLocal.withInitial(() -> 0); // convert me + private final int index; + + X() { + count.set(count.get() + 1); + index = count.get(); + } +} \ No newline at end of file diff --git a/java/typeMigration/testData/intentions/threadLocal/beforeAssignment.java b/java/typeMigration/testData/intentions/threadLocal/beforeAssignment.java new file mode 100644 index 000000000000..613e853c2278 --- /dev/null +++ b/java/typeMigration/testData/intentions/threadLocal/beforeAssignment.java @@ -0,0 +1,10 @@ +// "Convert to ThreadLocal" "true" +class X { + private static int count = 0; // convert me + private final int index; + + X() { + count++; + index = count; + } +} \ No newline at end of file