inline method: avoid another cases where invalidated this expr is used

EA-103338 - PIEAE: PsiUtilCore.ensureValid
This commit is contained in:
Anna Kozlova
2017-06-16 17:51:50 +03:00
parent 52b2493e19
commit f85e37b1c8
4 changed files with 42 additions and 2 deletions

View File

@@ -19,9 +19,9 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Key;
import com.intellij.psi.*;
import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.MethodSignatureUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.refactoring.util.RefactoringChangeUtil;
import com.intellij.util.ArrayUtil;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -217,7 +217,8 @@ public class ChangeContextUtil {
boolean needQualifier = true;
PsiElement refElement = refExpr.resolve();
if (refMember.equals(refElement) ||
(refElement instanceof PsiMethod && refMember instanceof PsiMethod && ArrayUtil.find(((PsiMethod)refElement).findSuperMethods(), refMember) > -1)){
(refElement instanceof PsiMethod && refMember instanceof PsiMethod &&
MethodSignatureUtil.isSuperMethod((PsiMethod)refMember, (PsiMethod)refElement))) {
if (thisAccessExpr instanceof PsiThisExpression && ((PsiThisExpression)thisAccessExpr).getQualifier() == null) {
//Trivial qualifier
needQualifier = false;

View File

@@ -0,0 +1,17 @@
class A {
void m() {
class Local {}
n();
}
void n() {}
}
class B extends A {
void n() {}
}
class C extends B {
{
<caret>m();
}
}

View File

@@ -0,0 +1,18 @@
class A {
void m() {
class Local {}
n();
}
void n() {}
}
class B extends A {
void n() {}
}
class C extends B {
{
class Local {}
n();
}
}

View File

@@ -367,6 +367,10 @@ public class InlineMethodTest extends LightRefactoringTestCase {
doTestInlineThisOnly();
}
public void testThisExpressionValidationForLocalClasses() throws Exception {
doTestInlineThisOnly();
}
@Override
protected Sdk getProjectJDK() {
return getTestName(false).contains("Src") ? IdeaTestUtil.getMockJdk17() : super.getProjectJDK();