mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[java-refactorings] IDEA-372592 Fix anonymous to inner class conversion incorrectly converting already-qualified this expressions
#IDEA-372592 fixed closes https://github.com/JetBrains/intellij-community/pull/3048 Merge-request: IJ-MR-162908 Merged-by: Bartek Pacia <bartek.pacia@jetbrains.com> GitOrigin-RevId: 0ad34047e08bde4a4689e992768832863036fca0
This commit is contained in:
committed by
intellij-monorepo-bot
parent
35fb7482d4
commit
5f10f7a6a5
+9
-35
@@ -688,43 +688,17 @@ public class AnonymousToInnerHandler implements RefactoringActionHandlerOnPsiEle
|
||||
PsiMethodCallExpression methodCall = (PsiMethodCallExpression) ((PsiExpressionStatement) statement).getExpression();
|
||||
PsiExpressionList exprList = methodCall.getArgumentList();
|
||||
|
||||
final PsiThisExpression qualifiedThis = (PsiThisExpression) factory.createExpressionFromText("A.this", null);
|
||||
final PsiJavaCodeReferenceElement targetClassRef = factory.createClassReferenceElement(myTargetClass);
|
||||
PsiJavaCodeReferenceElement thisQualifier = qualifiedThis.getQualifier();
|
||||
assert thisQualifier != null;
|
||||
thisQualifier.replace(targetClassRef);
|
||||
|
||||
{
|
||||
final PsiThisExpression qualifiedThis =
|
||||
(PsiThisExpression) factory.createExpressionFromText("A.this", null);
|
||||
final PsiJavaCodeReferenceElement targetClassRef = factory.createClassReferenceElement(myTargetClass);
|
||||
PsiJavaCodeReferenceElement thisQualifier = qualifiedThis.getQualifier();
|
||||
assert thisQualifier != null;
|
||||
thisQualifier.replace(targetClassRef);
|
||||
|
||||
for (PsiExpression expr : paramExpressions) {
|
||||
ChangeContextUtil.encodeContextInfo(expr, true);
|
||||
final PsiElement newExpr = exprList.add(expr);
|
||||
ChangeContextUtil.decodeContextInfo(newExpr, myTargetClass, qualifiedThis);
|
||||
}
|
||||
for (PsiExpression expr : paramExpressions) {
|
||||
ChangeContextUtil.encodeContextInfo(expr, true);
|
||||
final PsiElement newExpr = exprList.add(expr);
|
||||
ChangeContextUtil.decodeContextInfo(newExpr, myTargetClass, qualifiedThis);
|
||||
}
|
||||
|
||||
class SupersConvertor extends JavaRecursiveElementVisitor {
|
||||
@Override public void visitThisExpression(@NotNull PsiThisExpression expression) {
|
||||
try {
|
||||
final PsiThisExpression qualifiedThis =
|
||||
(PsiThisExpression) factory.createExpressionFromText("A.this", null);
|
||||
final PsiJavaCodeReferenceElement targetClassRef = factory.createClassReferenceElement(myTargetClass);
|
||||
PsiJavaCodeReferenceElement thisQualifier = qualifiedThis.getQualifier();
|
||||
assert thisQualifier != null;
|
||||
thisQualifier.replace(targetClassRef);
|
||||
expression.replace(qualifiedThis);
|
||||
} catch (IncorrectOperationException e) {
|
||||
LOG.error(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override public void visitReferenceExpression(@NotNull PsiReferenceExpression expression) {
|
||||
}
|
||||
}
|
||||
|
||||
final SupersConvertor supersConvertor = new SupersConvertor();
|
||||
methodCall.getArgumentList().accept(supersConvertor);
|
||||
}
|
||||
|
||||
private void calculateTypeParametersToCreate () {
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
public class LocalClass {
|
||||
public LocalClass(LocalClass o) {
|
||||
}
|
||||
|
||||
void test() {
|
||||
new <caret>LocalClass(this) {
|
||||
};
|
||||
}
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
public class LocalClass {
|
||||
LocalClass field;
|
||||
|
||||
public LocalClass(LocalClass o) {
|
||||
}
|
||||
|
||||
void test() {
|
||||
new <caret>LocalClass(field) {
|
||||
};
|
||||
}
|
||||
}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
public class LocalClass {
|
||||
LocalClass field;
|
||||
|
||||
public LocalClass(LocalClass o) {
|
||||
}
|
||||
|
||||
void test() {
|
||||
new MyClass();
|
||||
}
|
||||
|
||||
private static class MyClass extends LocalClass {
|
||||
public MyClass() {
|
||||
super(LocalClass.this.field);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
public class LocalClass {
|
||||
public LocalClass(LocalClass o) {
|
||||
}
|
||||
|
||||
void test() {
|
||||
new MyClass();
|
||||
}
|
||||
|
||||
private static class MyClass extends LocalClass {
|
||||
public MyClass() {
|
||||
super(LocalClass.this);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
public class Test {
|
||||
public Test(Test test) {
|
||||
}
|
||||
|
||||
private class Inner {
|
||||
public void x() {
|
||||
new <caret>Test(Test.this) {
|
||||
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
public class Test {
|
||||
public Test(Test test) {
|
||||
}
|
||||
|
||||
private class Inner {
|
||||
public void x() {
|
||||
new MyClass();
|
||||
}
|
||||
|
||||
private static class MyClass extends Test {
|
||||
public MyClass() {
|
||||
super(Test.this);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -133,7 +133,18 @@ public class AnonymousToInnerTest extends LightJavaCodeInsightTestCase {
|
||||
public void testTypeParameterNotMentioned() {
|
||||
doTest("MyClass", true);
|
||||
}
|
||||
|
||||
|
||||
public void testAddThisQualifier() {
|
||||
doTest("MyClass", true);
|
||||
}
|
||||
|
||||
public void testAddThisQualifierWithImplicitThis() {
|
||||
doTest("MyClass", true);
|
||||
}
|
||||
|
||||
public void testOuterThisQualifier() {
|
||||
doTest("MyClass", true);
|
||||
}
|
||||
|
||||
private void doTest(final String newClassName, final boolean makeStatic) {
|
||||
configureByFile(TEST_ROOT + getTestName(true) + ".java");
|
||||
|
||||
Reference in New Issue
Block a user