From b14582004064e0d73e750d70babdff461d0017c8 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov <БAlexey.Sedunov@jetbrains.comЮ> Date: Fri, 8 Aug 2014 15:09:59 +0400 Subject: [PATCH] preprocessor for move inner class --- .../MoveInnerClassJavaUsagesHandler.java | 58 +++++++++++++++++++ .../MoveInnerClassUsagesHandler.java | 28 +++++++++ .../move/moveInner/MoveInnerProcessor.java | 34 ++--------- resources/src/META-INF/IdeaPlugin.xml | 5 ++ 4 files changed, 96 insertions(+), 29 deletions(-) create mode 100644 java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerClassJavaUsagesHandler.java create mode 100644 java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerClassUsagesHandler.java diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerClassJavaUsagesHandler.java b/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerClassJavaUsagesHandler.java new file mode 100644 index 000000000000..0589e6d8e187 --- /dev/null +++ b/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerClassJavaUsagesHandler.java @@ -0,0 +1,58 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.refactoring.move.moveInner; + +import com.intellij.psi.*; +import com.intellij.refactoring.util.RefactoringChangeUtil; +import com.intellij.usageView.UsageInfo; +import org.jetbrains.annotations.NotNull; + +public class MoveInnerClassJavaUsagesHandler implements MoveInnerClassUsagesHandler { + @Override + public void correctInnerClassUsage(@NotNull UsageInfo usage, @NotNull PsiClass outerClass) { + PsiElement refElement = usage.getElement(); + if (refElement == null) return; + + PsiManager manager = refElement.getManager(); + + PsiElement refParent = refElement.getParent(); + if (refParent instanceof PsiNewExpression || refParent instanceof PsiAnonymousClass) { + PsiNewExpression newExpr = refParent instanceof PsiNewExpression + ? (PsiNewExpression)refParent + : (PsiNewExpression)refParent.getParent(); + + PsiExpressionList argList = newExpr.getArgumentList(); + + if (argList != null) { // can happen in incomplete code + if (newExpr.getQualifier() == null) { + PsiThisExpression thisExpr; + PsiClass parentClass = RefactoringChangeUtil.getThisClass(newExpr); + if (outerClass.equals(parentClass)) { + thisExpr = RefactoringChangeUtil.createThisExpression(manager, null); + } + else { + thisExpr = RefactoringChangeUtil.createThisExpression(manager, outerClass); + } + argList.addAfter(thisExpr, null); + } + else { + argList.addAfter(newExpr.getQualifier(), null); + newExpr.getQualifier().delete(); + } + } + } + } +} \ No newline at end of file diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerClassUsagesHandler.java b/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerClassUsagesHandler.java new file mode 100644 index 000000000000..97946456d6fb --- /dev/null +++ b/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerClassUsagesHandler.java @@ -0,0 +1,28 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.refactoring.move.moveInner; + +import com.intellij.lang.LanguageExtension; +import com.intellij.psi.PsiClass; +import com.intellij.usageView.UsageInfo; +import org.jetbrains.annotations.NotNull; + +public interface MoveInnerClassUsagesHandler { + LanguageExtension EP_NAME = + new LanguageExtension("com.intellij.refactoring.moveInnerClassUsagesHandler"); + + void correctInnerClassUsage(@NotNull UsageInfo usage, @NotNull PsiClass outerClass); +} \ No newline at end of file diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerProcessor.java b/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerProcessor.java index d4239e578016..d56b8c02844e 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerProcessor.java @@ -214,35 +214,11 @@ public class MoveInnerProcessor extends BaseRefactoringProcessor { // correct references in usages for (UsageInfo usage : usages) { - if (usage.isNonCodeUsage) continue; - PsiElement refElement = usage.getElement(); - if (myParameterNameOuterClass != null) { // should pass outer as parameter - PsiElement refParent = refElement.getParent(); - if (refParent instanceof PsiNewExpression || refParent instanceof PsiAnonymousClass) { - PsiNewExpression newExpr = refParent instanceof PsiNewExpression - ? (PsiNewExpression)refParent - : (PsiNewExpression)refParent.getParent(); + if (usage.isNonCodeUsage || myParameterNameOuterClass == null) continue; // should pass outer as parameter - PsiExpressionList argList = newExpr.getArgumentList(); - - if (argList != null) { // can happen in incomplete code - if (newExpr.getQualifier() == null) { - PsiThisExpression thisExpr; - PsiClass parentClass = RefactoringChangeUtil.getThisClass(newExpr); - if (myOuterClass.equals(parentClass)) { - thisExpr = RefactoringChangeUtil.createThisExpression(manager, null); - } - else { - thisExpr = RefactoringChangeUtil.createThisExpression(manager, myOuterClass); - } - argList.addAfter(thisExpr, null); - } - else { - argList.addAfter(newExpr.getQualifier(), null); - newExpr.getQualifier().delete(); - } - } - } + MoveInnerClassUsagesHandler usagesHandler = MoveInnerClassUsagesHandler.EP_NAME.forLanguage(usage.getElement().getLanguage()); + if (usagesHandler != null) { + usagesHandler.correctInnerClassUsage(usage, myOuterClass); } } @@ -554,4 +530,4 @@ public class MoveInnerProcessor extends BaseRefactoringProcessor { public String getParameterName() { return myParameterNameOuterClass; } -} +} \ No newline at end of file diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index 726049771790..fe9c310d4ad7 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -241,6 +241,10 @@ + + + + @@ -1536,6 +1540,7 @@ +