From 7034451a770133fd534b2a3511b38939dd78f117 Mon Sep 17 00:00:00 2001 From: Snjezana Peco Date: Mon, 11 Apr 2022 23:34:46 +0200 Subject: [PATCH] Cannot refactor in static block Signed-off-by: Snjezana Peco --- .../code/ExtractFieldRefactoring.java | 6 ++- .../refactoring/ExtractMethodTest.java | 38 +++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/code/ExtractFieldRefactoring.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/code/ExtractFieldRefactoring.java index 546b0b1f84..e6de206b2a 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/code/ExtractFieldRefactoring.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/code/ExtractFieldRefactoring.java @@ -255,7 +255,6 @@ public RefactoringStatus checkInitialConditions(IProgressMonitor pm) throws Core if (fCompilationUnitNode == null) { fCompilationUnitNode = RefactoringASTParser.parseWithASTProvider(fCu, true, new SubProgressMonitor(pm, 3)); } - pm.worked(1); if (fCURewrite == null) { fCURewrite = new CompilationUnitRewrite(fCu, fCompilationUnitNode); @@ -272,6 +271,11 @@ public RefactoringStatus checkInitialConditions(IProgressMonitor pm) throws Core } pm.worked(1); + if (getMethodDeclaration() == null) { + return RefactoringStatus.createFatalErrorStatus(RefactoringCoreMessages.ExtractFieldRefactoring_cannot_extract); + } + pm.worked(1); + if (isUsedInExplicitConstructorCall()) { return RefactoringStatus.createFatalErrorStatus(RefactoringCoreMessages.ExtractTempRefactoring_explicit_constructor); } diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/refactoring/ExtractMethodTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/refactoring/ExtractMethodTest.java index f71039facb..b33600164d 100644 --- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/refactoring/ExtractMethodTest.java +++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/refactoring/ExtractMethodTest.java @@ -13,9 +13,12 @@ package org.eclipse.jdt.ls.core.internal.refactoring; +import static org.junit.Assert.assertEquals; + import java.util.Hashtable; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaProject; @@ -414,6 +417,41 @@ public void testExtractLambdaBodyToMethod() throws Exception { assertCodeActions(codeActions, e1); } + // https://github.com/redhat-developer/vscode-java/issues/2370 + @Test + public void testExtractMethodInStaticBlock() throws Exception { + IPackageFragment pack1 = fSourceFolder.createPackageFragment("test1", false, null); + setOnly(CodeActionKind.Refactor); + //@formatter:off + String contents = "package test1;\r\n" + + "public class E {\r\n" + + " public static String STR;\r\n" + + " static {\r\n" + + " STR = new String(\"test\").strip();\r\n" + + " }\r\n" + + "}"; + //@formatter:on + ICompilationUnit cu = pack1.createCompilationUnit("E.java", contents, false, null); + //@formatter:off + String expected = "package test1;\r\n" + + "public class E {\r\n" + + " public static String STR;\r\n" + + " static {\r\n" + + " STR = extracted().strip();\r\n" + + " }\r\n" + + " private static String extracted() {\r\n" + + " return new String(\"test\");\r\n" + + " }\r\n" + + "}"; + //@formatter:on + Range range = new Range(new Position(4, 14), new Position(4, 32)); + List> codeActions = evaluateCodeActions(cu, range); + assertEquals(4, codeActions.size()); + List> extractMethod = codeActions.stream().filter((c) -> c.getRight().getTitle().equals("Extract to method")).collect(Collectors.toList()); + Expected e1 = new Expected("Extract to method", expected, JavaCodeActionKind.REFACTOR_EXTRACT_METHOD); + assertCodeActions(extractMethod, e1); + } + @Test public void testExtractMethodGeneric() throws Exception { IPackageFragment pack1 = fSourceFolder.createPackageFragment("test1", false, null);