extract light method object: complete array initializer with first element type (IDEA-131435)

(cherry picked from commit 2b66700cb40889d0578426a0ddca6fb0b02f2718)
This commit is contained in:
Anna Kozlova
2014-10-17 21:08:46 +02:00
parent f90c603a81
commit cd2d76587a
3 changed files with 53 additions and 6 deletions
@@ -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 ||
@@ -0,0 +1,5 @@
class Sample {
void foo() {
Runnable[] runs = {<caret>};
}
}
@@ -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();