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 49047421571e..86be70f05ee9 100644 --- a/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/AtomicConversionRule.java +++ b/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/AtomicConversionRule.java @@ -12,6 +12,8 @@ import com.intellij.refactoring.typeMigration.TypeConversionDescriptor; import com.intellij.refactoring.typeMigration.TypeConversionDescriptorBase; import com.intellij.refactoring.typeMigration.TypeEvaluator; import com.intellij.refactoring.typeMigration.TypeMigrationLabeler; +import com.intellij.util.ObjectUtils; +import com.siyeh.HardcodedMethodConstants; import com.siyeh.ig.psiutils.ParenthesesUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -342,6 +344,9 @@ public class AtomicConversionRule extends TypeConversionRule { if (context instanceof PsiArrayAccessExpression) { return new TypeConversionDescriptor("$qualifier$[$idx$]", "$qualifier$.get($idx$)", (PsiExpression)context); } + if (parent instanceof PsiReferenceExpression && isReferenceToLengthField((PsiReferenceExpression)parent)) { + return new TypeConversionDescriptor("$qualifier$.length", "$qualifier$.length()", (PsiExpression)parent); + } return null; } @@ -438,4 +443,13 @@ public class AtomicConversionRule extends TypeConversionRule { return null; } + private static boolean isReferenceToLengthField(@NotNull PsiReferenceExpression refExpr) { + if (!"length".equals(refExpr.getReferenceName())) { + return false; + } + PsiClass aClass = JavaPsiFacade.getElementFactory(refExpr.getProject()).getArrayClass(PsiUtil.getLanguageLevel(refExpr)); + PsiField lengthField = ObjectUtils.notNull(aClass.findFieldByName(HardcodedMethodConstants.LENGTH, false)); + return refExpr.isReferenceTo(lengthField); + } + } diff --git a/java/typeMigration/testData/intentions/atomic/afterAtomicArrayLength.java b/java/typeMigration/testData/intentions/atomic/afterAtomicArrayLength.java new file mode 100644 index 000000000000..76bd5940cb3a --- /dev/null +++ b/java/typeMigration/testData/intentions/atomic/afterAtomicArrayLength.java @@ -0,0 +1,10 @@ +import java.util.concurrent.atomic.AtomicIntegerArray; + +// "Convert to atomic" "true" +class Test { + final AtomicIntegerArray ii = new AtomicIntegerArray(new int[12]); + + void m() { + int k = ii.length(); + } +} diff --git a/java/typeMigration/testData/intentions/atomic/beforeAtomicArrayLength.java b/java/typeMigration/testData/intentions/atomic/beforeAtomicArrayLength.java new file mode 100644 index 000000000000..01fa0f5b0866 --- /dev/null +++ b/java/typeMigration/testData/intentions/atomic/beforeAtomicArrayLength.java @@ -0,0 +1,8 @@ +// "Convert to atomic" "true" +class Test { + int[] ii = new int[12]; + + void m() { + int k = ii.length; + } +}