Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@
import net.java.html.json.Model;
import net.java.html.json.ModelOperation;
import net.java.html.json.Property;
import org.eclipse.lsp4j.ApplyWorkspaceEditParams;
import org.eclipse.lsp4j.CodeAction;
import org.eclipse.lsp4j.CodeActionKind;
import org.eclipse.lsp4j.CodeActionParams;
Expand Down Expand Up @@ -281,7 +280,7 @@ void doRefactoring(ChangeMethodParameterUI ui) {
}
refactoring.setParameterInfo(params);
refactoring.getContext().add(JavaRefactoringUtils.getClasspathInfoFor(file));
client.applyEdit(new ApplyWorkspaceEditParams(perform(refactoring, "ChangeMethodParameters")));
sendRefactoringChanges(client, refactoring, "ChangeMethodParameters");
} catch (Exception ex) {
if (client == null) {
Exceptions.printStackTrace(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,24 @@
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import org.eclipse.lsp4j.ApplyWorkspaceEditParams;
import org.eclipse.lsp4j.CreateFile;
import org.eclipse.lsp4j.DeleteFile;
import org.eclipse.lsp4j.MessageActionItem;
import org.eclipse.lsp4j.MessageParams;
import org.eclipse.lsp4j.MessageType;
import org.eclipse.lsp4j.Position;
import org.eclipse.lsp4j.Range;
import org.eclipse.lsp4j.RenameFile;
import org.eclipse.lsp4j.ResourceOperation;
import org.eclipse.lsp4j.ShowMessageRequestParams;
import org.eclipse.lsp4j.TextDocumentEdit;
import org.eclipse.lsp4j.TextEdit;
import org.eclipse.lsp4j.VersionedTextDocumentIdentifier;
Expand All @@ -40,38 +47,28 @@
import org.netbeans.api.java.source.ModificationResult;
import org.netbeans.modules.java.lsp.server.Utils;
import org.netbeans.modules.java.lsp.server.protocol.CodeActionsProvider;
import org.netbeans.modules.java.lsp.server.protocol.NbCodeLanguageClient;
import org.netbeans.modules.refactoring.api.AbstractRefactoring;
import org.netbeans.modules.refactoring.api.Problem;
import org.netbeans.modules.refactoring.api.RefactoringSession;
import org.netbeans.modules.refactoring.api.impl.APIAccessor;
import org.netbeans.modules.refactoring.api.impl.SPIAccessor;
import org.netbeans.modules.refactoring.java.plugins.JavaPluginUtils;
import org.netbeans.modules.refactoring.java.spi.hooks.JavaModificationResult;
import org.netbeans.modules.refactoring.plugins.FileMovePlugin;
import org.netbeans.modules.refactoring.spi.RefactoringCommit;
import org.netbeans.modules.refactoring.spi.RefactoringElementImplementation;
import org.netbeans.modules.refactoring.spi.Transaction;
import org.openide.filesystems.FileObject;
import org.openide.util.Exceptions;

/**
*
* @author Dusan Balek
*/
public abstract class CodeRefactoring extends CodeActionsProvider {

protected static final WorkspaceEdit perform(AbstractRefactoring refactoring, String name) throws Exception {
RefactoringSession session = RefactoringSession.create(name);
Problem p = refactoring.checkParameters();
if (p != null && p.isFatal()) {
throw new IllegalStateException(p.getMessage());
}
p = refactoring.preCheck();
if (p != null && p.isFatal()) {
throw new IllegalStateException(p.getMessage());
}
p = refactoring.prepare(session);
if (p != null && p.isFatal()) {
throw new IllegalStateException(p.getMessage());
}
private static WorkspaceEdit perform(AbstractRefactoring refactoring, RefactoringSession session) throws Exception {
List<Either<TextDocumentEdit, ResourceOperation>> resultChanges = new ArrayList<>();
Map<String, String> renames = new HashMap<>();
List<RefactoringElementImplementation> fileChanges = APIAccessor.DEFAULT.getFileChanges(session);
Expand Down Expand Up @@ -136,4 +133,57 @@ protected static final WorkspaceEdit perform(AbstractRefactoring refactoring, St
session.finished();
return new WorkspaceEdit(resultChanges);
}

private static Problem prepare(AbstractRefactoring refactoring, RefactoringSession session) {
Problem p = refactoring.checkParameters();
p = JavaPluginUtils.chainProblems(p, refactoring.preCheck());
p = JavaPluginUtils.chainProblems(p, refactoring.prepare(session));
return p;
}

private static ShowMessageRequestParams warningsMessageParams(
Problem p) {
final MessageActionItem yes = new MessageActionItem("Yes");
final MessageActionItem no = new MessageActionItem("No");
ShowMessageRequestParams smrp = new ShowMessageRequestParams(Arrays.asList(yes, no));
StringBuilder msgs = new StringBuilder();
while (p != null) {
msgs.append(p.getMessage());
msgs.append('\n');
p = p.getNext();
}
smrp.setMessage(String.format("Refactoring will lead to following problems \n %s ,"
+ "Do you want to proceed with the problems ?", msgs.toString()));
smrp.setType(MessageType.Warning);
return smrp;
}

private static void showRefactoringWarnings(NbCodeLanguageClient client,AbstractRefactoring refactoring,RefactoringSession session,Problem p) {
ShowMessageRequestParams smrp = warningsMessageParams(p);
client.showMessageRequest(smrp).thenAccept(ai -> {
if (ai.getTitle().equalsIgnoreCase("Yes")) {
try {
client.applyEdit(new ApplyWorkspaceEditParams(perform(refactoring, session)));
} catch (Exception ex) {
if (client == null) {
Exceptions.printStackTrace(Exceptions.attachSeverity(ex, Level.SEVERE));
} else {
client.showMessage(new MessageParams(MessageType.Error, ex.getLocalizedMessage()));
}
}
}
});
}

protected static void sendRefactoringChanges(NbCodeLanguageClient client, AbstractRefactoring refactoring, String name) throws Exception {
RefactoringSession session = RefactoringSession.create(name);
Problem p = prepare(refactoring, session);
if (p == null) {
client.applyEdit(new ApplyWorkspaceEditParams(perform(refactoring, session)));
} else if (p.isFatal()) {
throw new IllegalStateException(p.getMessage());
} else {
showRefactoringWarnings(client, refactoring, session, p);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@
import javax.lang.model.element.Modifier;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import org.eclipse.lsp4j.ApplyWorkspaceEditParams;
import org.eclipse.lsp4j.CodeAction;
import org.eclipse.lsp4j.CodeActionKind;
import org.eclipse.lsp4j.CodeActionParams;
Expand Down Expand Up @@ -244,7 +243,7 @@ private void extract(NbCodeLanguageClient client, String uri, String command, Qu
refactoring = r;
}
refactoring.getContext().add(JavaRefactoringUtils.getClasspathInfoFor(file));
client.applyEdit(new ApplyWorkspaceEditParams(perform(refactoring, EXTRACT_SUPERCLASS_REFACTORING_COMMAND.equals(command) ? "Extract Superclass" : "Extract Interface")));
sendRefactoringChanges(client, refactoring, EXTRACT_SUPERCLASS_REFACTORING_COMMAND.equals(command) ? "Extract Superclass" : "Extract Interface");
} catch (Exception ex) {
client.showMessage(new MessageParams(MessageType.Error, ex.getLocalizedMessage()));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@
import net.java.html.json.Model;
import net.java.html.json.ModelOperation;
import net.java.html.json.Property;
import org.eclipse.lsp4j.ApplyWorkspaceEditParams;
import org.eclipse.lsp4j.CodeAction;
import org.eclipse.lsp4j.CodeActionKind;
import org.eclipse.lsp4j.CodeActionParams;
Expand Down Expand Up @@ -407,7 +406,7 @@ void doRefactoring(MoveElementUI ui) {
} else {
refactoring.setTarget(Lookup.EMPTY);
}
client.applyEdit(new ApplyWorkspaceEditParams(perform(refactoring, "Move")));
sendRefactoringChanges(client, refactoring, "Move");
} catch (Exception ex) {
if (client == null) {
Exceptions.printStackTrace(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@
import javax.lang.model.type.ExecutableType;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.Types;
import org.eclipse.lsp4j.ApplyWorkspaceEditParams;
import org.eclipse.lsp4j.CodeAction;
import org.eclipse.lsp4j.CodeActionKind;
import org.eclipse.lsp4j.CodeActionParams;
Expand Down Expand Up @@ -246,7 +245,7 @@ private void pullUp(NbCodeLanguageClient client, String uri, QuickPickItem sourc
refactoring.setTargetType(targetHandle);
refactoring.setMembers(memberHandles.toArray(new MemberInfo[0]));
refactoring.getContext().add(JavaRefactoringUtils.getClasspathInfoFor(file));
client.applyEdit(new ApplyWorkspaceEditParams(perform(refactoring, "PullUp")));
sendRefactoringChanges(client, refactoring, "PullUp");
} catch (Exception ex) {
client.showMessage(new MessageParams(MessageType.Error, ex.getLocalizedMessage()));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.TypeElement;
import javax.lang.model.util.Types;
import org.eclipse.lsp4j.ApplyWorkspaceEditParams;
import org.eclipse.lsp4j.CodeAction;
import org.eclipse.lsp4j.CodeActionKind;
import org.eclipse.lsp4j.CodeActionParams;
Expand Down Expand Up @@ -189,7 +188,7 @@ private void pushDown(NbCodeLanguageClient client, String uri, QuickPickItem sou
org.netbeans.modules.refactoring.java.api.PushDownRefactoring refactoring = new org.netbeans.modules.refactoring.java.api.PushDownRefactoring(TreePathHandle.from(sourceHandle, info));
refactoring.setMembers(memberHandles.toArray(new MemberInfo[0]));
refactoring.getContext().add(JavaRefactoringUtils.getClasspathInfoFor(file));
client.applyEdit(new ApplyWorkspaceEditParams(perform(refactoring, "PushDown")));
sendRefactoringChanges(client, refactoring, "PushDown");
} catch (Exception ex) {
client.showMessage(new MessageParams(MessageType.Error, ex.getLocalizedMessage()));
}
Expand Down
Loading