diff --git a/java/java-impl/src/com/intellij/refactoring/typeMigration/TypeMigrationStatementProcessor.java b/java/java-impl/src/com/intellij/refactoring/typeMigration/TypeMigrationStatementProcessor.java index 704902183060..0989cd042582 100644 --- a/java/java-impl/src/com/intellij/refactoring/typeMigration/TypeMigrationStatementProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/typeMigration/TypeMigrationStatementProcessor.java @@ -1,4 +1,4 @@ -// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.refactoring.typeMigration; import com.intellij.codeInsight.generation.GetterSetterPrototypeProvider; @@ -427,17 +427,19 @@ class TypeMigrationStatementProcessor extends JavaRecursiveElementVisitor { } @Override - public void visitMethodCallExpression(final PsiMethodCallExpression methodCallExpression) { - super.visitMethodCallExpression(methodCallExpression); - final JavaResolveResult resolveResult = methodCallExpression.resolveMethodGenerics(); + public void visitCallExpression(PsiCallExpression callExpression) { + super.visitCallExpression(callExpression); + final JavaResolveResult resolveResult = callExpression.resolveMethodGenerics(); final PsiElement method = resolveResult.getElement(); if (method instanceof PsiMethod) { - if (migrateEqualsMethod(methodCallExpression, (PsiMethod)method)) { + if (callExpression instanceof PsiMethodCallExpression && migrateEqualsMethod((PsiMethodCallExpression)callExpression, (PsiMethod)method)) { return; } - final PsiExpression[] psiExpressions = methodCallExpression.getArgumentList().getExpressions(); + PsiExpressionList argumentList = callExpression.getArgumentList(); + if (argumentList == null) return; + final PsiExpression[] psiExpressions = argumentList.getExpressions(); final PsiParameter[] originalParams = ((PsiMethod)method).getParameterList().getParameters(); - final PsiSubstitutor evalSubstitutor = myTypeEvaluator.createMethodSubstitution(originalParams, psiExpressions, (PsiMethod)method, methodCallExpression); + final PsiSubstitutor evalSubstitutor = myTypeEvaluator.createMethodSubstitution(originalParams, psiExpressions, (PsiMethod)method, callExpression); for (int i = 0; i < psiExpressions.length; i++) { PsiParameter originalParameter; if (originalParams.length <= i) { @@ -452,7 +454,7 @@ class TypeMigrationStatementProcessor extends JavaRecursiveElementVisitor { } processVariable(originalParameter, psiExpressions[i], null, resolveResult.getSubstitutor(), evalSubstitutor, true); } - final PsiExpression qualifier = methodCallExpression.getMethodExpression().getQualifierExpression(); + final PsiExpression qualifier = callExpression instanceof PsiMethodCallExpression ? ((PsiMethodCallExpression)callExpression).getMethodExpression().getQualifierExpression() : null; if (qualifier != null && qualifier.isPhysical() && !new TypeView(qualifier).isChanged()) { //substitute property otherwise final PsiType qualifierType = qualifier.getType(); if (qualifierType instanceof PsiClassType) { diff --git a/java/typeMigration/testData/intentions/atomic/afterConstructor.java b/java/typeMigration/testData/intentions/atomic/afterConstructor.java new file mode 100644 index 000000000000..c5895b74742b --- /dev/null +++ b/java/typeMigration/testData/intentions/atomic/afterConstructor.java @@ -0,0 +1,11 @@ +import java.util.concurrent.atomic.AtomicReference; + +// "Convert to atomic" "true" +class Test { + static final AtomicReference field = new AtomicReference<>("br"); + { + new Test(field.get()); + } + + Test(String field) { } +} \ No newline at end of file diff --git a/java/typeMigration/testData/intentions/atomic/beforeConstructor.java b/java/typeMigration/testData/intentions/atomic/beforeConstructor.java new file mode 100644 index 000000000000..e505aadd456f --- /dev/null +++ b/java/typeMigration/testData/intentions/atomic/beforeConstructor.java @@ -0,0 +1,9 @@ +// "Convert to atomic" "true" +class Test { + static final String field="br"; + { + new Test(field); + } + + Test(String field) { } +} \ No newline at end of file