Atomic conversion: support in void lambdas

This commit is contained in:
Tagir Valeev
2017-08-22 10:14:43 +07:00
parent dc36051a43
commit 80e9c0f026
3 changed files with 30 additions and 1 deletions
@@ -206,7 +206,10 @@ public class AtomicConversionRule extends TypeConversionRule {
final PsiJavaToken signToken = ((PsiAssignmentExpression)context).getOperationSign();
final IElementType operationSign = signToken.getTokenType();
final String sign = signToken.getText();
if (parent instanceof PsiExpressionStatement) {
boolean voidContext = parent instanceof PsiExpressionStatement ||
(parent instanceof PsiLambdaExpression && PsiType.VOID.equals(LambdaUtil.getFunctionalInterfaceReturnType(
(PsiFunctionalExpression)parent)));
if (voidContext) {
if (operationSign == JavaTokenType.EQ) {
final PsiExpression lExpression = ((PsiAssignmentExpression)context).getLExpression();
if (lExpression instanceof PsiReferenceExpression) {
@@ -0,0 +1,14 @@
import java.util.concurrent.atomic.AtomicInteger;
// "Convert to atomic" "true"
public class InLambdas
{
public void test()
{
AtomicInteger x = new AtomicInteger(0);
Runnable r1 = () -> x.getAndIncrement();
Runnable r2 = () -> x.addAndGet(2);
Runnable r3 = () -> x.updateAndGet(v -> v * 2);
Runnable r4 = () -> x.set(5);
}
}
@@ -0,0 +1,12 @@
// "Convert to atomic" "true"
public class InLambdas
{
public void test()
{
int <caret>x = 0;
Runnable r1 = () -> x++;
Runnable r2 = () -> x+=2;
Runnable r3 = () -> x*=2;
Runnable r4 = () -> x = 5;
}
}