mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-08 15:09:39 +07:00
injections: switch from injections to top level editor if extracted expression contains the whole injected fragment (IDEA-148471)
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
class C {
|
||||
{
|
||||
String java = "cla<caret>ss ABC { {new ABC();}}";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
class C {
|
||||
{
|
||||
String expr = "class ABC { {new ABC();}}";
|
||||
String java = expr;
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user