From 38f29c5389a48335e34a1974e51795b145af542f Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 15 Jun 2017 16:57:57 +0300 Subject: [PATCH] restore class by index in target file for top level classes EA-36372 - assert: CreateSubclassAction$.templateFinished --- .../intention/impl/CreateSubclassAction.java | 20 +++++++++++++------ .../imports/after/Subclass.java | 4 ++++ .../imports/after/Superclass.java | 2 ++ .../imports/before/Superclass.java | 2 ++ .../intention/CreateSubclassTest.java | 4 ++++ 5 files changed, 26 insertions(+), 6 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/createSubclass/imports/after/Subclass.java create mode 100644 java/java-tests/testData/codeInsight/createSubclass/imports/after/Superclass.java create mode 100644 java/java-tests/testData/codeInsight/createSubclass/imports/before/Superclass.java diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateSubclassAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateSubclassAction.java index a785934fbfd1..5dc93389a049 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateSubclassAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateSubclassAction.java @@ -52,6 +52,7 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.PsiUtilCore; import com.intellij.psi.util.TypeConversionUtil; +import com.intellij.util.ArrayUtil; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -280,23 +281,30 @@ public class CreateSubclassAction extends BaseIntentionAction { final Template template = templateBuilder.buildTemplate(); template.addEndVariable(); - final PsiFile containingFile = targetClass.getContainingFile(); + PsiClassOwner containingFile = (PsiClassOwner)targetClass.getContainingFile(); + int idxInFile = ArrayUtil.find(containingFile.getClasses(), targetClass); PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(editor.getDocument()); final TextRange textRange = targetClass.getTextRange(); final RangeMarker startClassOffset = editor.getDocument().createRangeMarker(textRange.getStartOffset(), textRange.getEndOffset()); - startClassOffset.setGreedyToLeft(true); - startClassOffset.setGreedyToRight(true); editor.getDocument().deleteString(textRange.getStartOffset(), textRange.getEndOffset()); CreateFromUsageBaseFix.startTemplate(editor, template, project, new TemplateEditingAdapter() { @Override public void templateFinished(Template template, boolean brokenOff) { try { LOG.assertTrue(startClassOffset.isValid(), startClassOffset); - final PsiElement psiElement = containingFile.findElementAt(startClassOffset.getStartOffset()); - final PsiClass aTargetClass = PsiTreeUtil.getParentOfType(psiElement, PsiClass.class); - LOG.assertTrue(aTargetClass != null, psiElement); + final PsiClass aTargetClass; + if (idxInFile >= 0) { + PsiClass[] classes = containingFile.getClasses(); + LOG.assertTrue(idxInFile < classes.length, "idx: " + idxInFile + "; len: " + classes.length); + aTargetClass = classes[idxInFile]; + } + else { + final PsiElement psiElement = containingFile.findElementAt(startClassOffset.getStartOffset()); + aTargetClass = PsiTreeUtil.getParentOfType(psiElement, PsiClass.class); + LOG.assertTrue(aTargetClass != null, psiElement); + } if (!brokenOff) { TransactionGuard.getInstance().submitTransactionAndWait(() -> chooseAndImplement(psiClass, project, aTargetClass, editor)); } diff --git a/java/java-tests/testData/codeInsight/createSubclass/imports/after/Subclass.java b/java/java-tests/testData/codeInsight/createSubclass/imports/after/Subclass.java new file mode 100644 index 000000000000..a68cc32bf08b --- /dev/null +++ b/java/java-tests/testData/codeInsight/createSubclass/imports/after/Subclass.java @@ -0,0 +1,4 @@ +import java.util.List; + +public class Subclass> extends Superclass { +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/createSubclass/imports/after/Superclass.java b/java/java-tests/testData/codeInsight/createSubclass/imports/after/Superclass.java new file mode 100644 index 000000000000..046c4f514a32 --- /dev/null +++ b/java/java-tests/testData/codeInsight/createSubclass/imports/after/Superclass.java @@ -0,0 +1,2 @@ +class Superclass> { +} diff --git a/java/java-tests/testData/codeInsight/createSubclass/imports/before/Superclass.java b/java/java-tests/testData/codeInsight/createSubclass/imports/before/Superclass.java new file mode 100644 index 000000000000..046c4f514a32 --- /dev/null +++ b/java/java-tests/testData/codeInsight/createSubclass/imports/before/Superclass.java @@ -0,0 +1,2 @@ +class Superclass> { +} diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/CreateSubclassTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/CreateSubclassTest.java index e22462acc509..f2251ccb099f 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/CreateSubclassTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/intention/CreateSubclassTest.java @@ -33,6 +33,10 @@ public class CreateSubclassTest extends MultiFileTestCase { doTest(); } + public void testImports() throws Exception { + doTest(); + } + public void testInnerClassImplement() throws Exception { doTestInner(); }