injections: switch from injections to top level editor if extracted expression contains the whole injected fragment (IDEA-148471)

This commit is contained in:
Anna Kozlova
2015-11-27 16:11:29 +01:00
parent 06e3b55e89
commit 4eb00b634a
4 changed files with 33 additions and 1 deletions

View File

@@ -38,10 +38,16 @@ public abstract class AbstractJavaInplaceIntroducer extends AbstractInplaceIntro
PsiVariable localVariable,
PsiExpression[] occurrences,
TypeSelectorManagerImpl typeSelectorManager, String title) {
super(project, editor, expr, localVariable, occurrences, title, StdFileTypes.JAVA);
super(project, getEditor(editor, expr), expr, localVariable, occurrences, title, StdFileTypes.JAVA);
myTypeSelectorManager = typeSelectorManager;
}
private static Editor getEditor(Editor editor, PsiExpression expr) {
return expr != null && Comparing.equal(InjectedLanguageUtil.getTopLevelFile(expr), expr.getContainingFile())
? InjectedLanguageUtil.getTopLevelEditor(editor)
: editor;
}
protected abstract PsiVariable createFieldToStartTemplateOn(String[] names, PsiType psiType);
protected abstract String[] suggestNames(PsiType defaultType, String propName);
protected abstract VariableKind getVariableKind();

View File

@@ -0,0 +1,5 @@
class C {
{
String java = "cla<caret>ss ABC { {new ABC();}}";
}
}

View File

@@ -0,0 +1,6 @@
class C {
{
String expr = "class ABC { {new ABC();}}";
String java = expr;
}
}

View File

@@ -17,6 +17,7 @@ package com.intellij.refactoring;
import com.intellij.codeInsight.template.impl.TemplateManagerImpl;
import com.intellij.codeInsight.template.impl.TemplateState;
import com.intellij.lang.injection.InjectedLanguageManager;
import com.intellij.openapi.actionSystem.IdeActions;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorActionManager;
@@ -25,6 +26,7 @@ import com.intellij.openapi.util.Pass;
import com.intellij.psi.PsiExpression;
import com.intellij.psi.PsiLiteralExpression;
import com.intellij.psi.PsiLocalVariable;
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.refactoring.introduce.inplace.AbstractInplaceIntroducer;
import com.intellij.refactoring.introduce.inplace.OccurrencesChooser;
@@ -43,6 +45,9 @@ public class InplaceIntroduceVariableTest extends AbstractJavaInplaceIntroduceTe
return expression;
}
final PsiExpression expr = PsiTreeUtil.getParentOfType(getFile().findElementAt(getEditor().getCaretModel().getOffset()), PsiExpression.class);
if (expr == null && InjectedLanguageManager.getInstance(getProject()).isInjectedFragment(getFile())) {
return PsiTreeUtil.getParentOfType(InjectedLanguageUtil.getTopLevelFile(getFile()).findElementAt(InjectedLanguageUtil.getTopLevelEditor(getEditor()).getCaretModel().getOffset()), PsiExpression.class);
}
return expr instanceof PsiLiteralExpression ? expr : null;
}
@@ -64,6 +69,16 @@ public class InplaceIntroduceVariableTest extends AbstractJavaInplaceIntroduceTe
});
}
public void testInjectedString() throws Exception {
doTestInsideInjection(new Pass<AbstractInplaceIntroducer>() {
@Override
public void pass(AbstractInplaceIntroducer inplaceIntroduceFieldPopup) {
bringRealEditorBack();
type("expr");
}
});
}
public void testPlaceInsideLoopAndRename() throws Exception {
doTest(new Pass<AbstractInplaceIntroducer>() {
@Override