mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-13 09:19:13 +07:00
extract light method object: complete array initializer with first element type (IDEA-131435)
(cherry picked from commit 2b66700cb40889d0578426a0ddca6fb0b02f2718)
This commit is contained in:
+26
-5
@@ -73,12 +73,9 @@ public class ExtractLightMethodObjectHandler {
|
||||
final PsiFile file,
|
||||
@NotNull final PsiCodeFragment fragment,
|
||||
final String methodName) throws PrepareFailedException {
|
||||
PsiExpression expression = CodeInsightUtil.findExpressionInRange(fragment, 0, fragment.getTextLength());
|
||||
final PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(project);
|
||||
final PsiElement[] elements;
|
||||
if (expression != null) {
|
||||
elements = new PsiElement[] {elementFactory.createStatementFromText(expression.getText() + ";", expression)};
|
||||
} else {
|
||||
PsiElement[] elements = completeToStatementArray(fragment, elementFactory);
|
||||
if (elements == null) {
|
||||
elements = CodeInsightUtil.findStatementsInRange(fragment, 0, fragment.getTextLength());
|
||||
}
|
||||
if (elements.length == 0) {
|
||||
@@ -213,6 +210,30 @@ public class ExtractLightMethodObjectHandler {
|
||||
originalAnchor);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static PsiElement[] completeToStatementArray(PsiCodeFragment fragment, PsiElementFactory elementFactory) {
|
||||
PsiExpression expression = CodeInsightUtil.findExpressionInRange(fragment, 0, fragment.getTextLength());
|
||||
if (expression != null) {
|
||||
String completeExpressionText = null;
|
||||
if (expression instanceof PsiArrayInitializerExpression) {
|
||||
final PsiExpression[] initializers = ((PsiArrayInitializerExpression)expression).getInitializers();
|
||||
if (initializers.length > 0) {
|
||||
final PsiType type = initializers[0].getType();
|
||||
if (type != null) {
|
||||
completeExpressionText = "new " + type.getCanonicalText() + "[]" + expression.getText();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
completeExpressionText = expression.getText();
|
||||
}
|
||||
|
||||
if (completeExpressionText != null) {
|
||||
return new PsiElement[] {elementFactory.createStatementFromText(completeExpressionText + ";", expression)};
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static boolean isValidVariableType(PsiType type) {
|
||||
if (type instanceof PsiClassType ||
|
||||
type instanceof PsiArrayType ||
|
||||
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
class Sample {
|
||||
void foo() {
|
||||
Runnable[] runs = {<caret>};
|
||||
}
|
||||
}
|
||||
+22
-1
@@ -38,11 +38,19 @@ public class ExtractMethodObject4DebuggerTest extends LightRefactoringTestCase {
|
||||
}
|
||||
|
||||
private void doTest(String evaluatedText, String expectedCallSite, String expectedClass) throws Exception {
|
||||
doTest(evaluatedText, expectedCallSite, expectedClass, true);
|
||||
}
|
||||
|
||||
private void doTest(String evaluatedText,
|
||||
String expectedCallSite,
|
||||
String expectedClass,
|
||||
boolean codeBlock) throws Exception {
|
||||
final String testName = getTestName(false);
|
||||
configureByFile("/refactoring/extractMethodObject4Debugger/" + testName + ".java");
|
||||
final int offset = getEditor().getCaretModel().getOffset();
|
||||
final PsiElement context = getFile().findElementAt(offset);
|
||||
final JavaCodeFragment fragment = JavaCodeFragmentFactory.getInstance(getProject()).createCodeBlockCodeFragment(evaluatedText, context, false);
|
||||
final JavaCodeFragmentFactory fragmentFactory = JavaCodeFragmentFactory.getInstance(getProject());
|
||||
final JavaCodeFragment fragment = codeBlock ? fragmentFactory.createCodeBlockCodeFragment(evaluatedText, context, false) : fragmentFactory.createExpressionCodeFragment(evaluatedText, context, null, false);
|
||||
final ExtractLightMethodObjectHandler.ExtractedData extractedData =
|
||||
ExtractLightMethodObjectHandler.extractLightMethodObject(getProject(), getFile(), fragment, "test");
|
||||
assertNotNull(extractedData);
|
||||
@@ -180,6 +188,19 @@ public class ExtractMethodObject4DebuggerTest extends LightRefactoringTestCase {
|
||||
" }");
|
||||
}
|
||||
|
||||
public void testArrayInitializer() throws Exception {
|
||||
doTest("{new Runnable() {public void run(){} } }",
|
||||
"Runnable[] result = new Test().invoke();",
|
||||
"public class Test {\n" +
|
||||
" public Runnable[] invoke() {\n" +
|
||||
" return new Runnable[]{new Runnable() {\n" +
|
||||
" public void run() {\n" +
|
||||
" }\n" +
|
||||
" }};\n" +
|
||||
" }\n" +
|
||||
" }", false);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Sdk getProjectJDK() {
|
||||
return IdeaTestUtil.getMockJdk18();
|
||||
|
||||
Reference in New Issue
Block a user