Skip to content

Commit

Permalink
Automatically rename file to type name on save
Browse files Browse the repository at this point in the history
Signed-off-by: Hope Hadfield <[email protected]>
  • Loading branch information
hopehadfield committed Mar 6, 2024
1 parent 4b2b504 commit f45557c
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,22 +20,37 @@
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaModelMarker;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.compiler.IProblem;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.manipulation.CoreASTProvider;
import org.eclipse.jdt.internal.corext.fix.CleanUpConstants;
import org.eclipse.jdt.internal.ui.text.correction.IInvocationContextCore;
import org.eclipse.jdt.internal.ui.text.correction.ProblemLocationCore;
import org.eclipse.jdt.ls.core.internal.ChangeUtil;
import org.eclipse.jdt.ls.core.internal.JDTUtils;
import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin;
import org.eclipse.jdt.ls.core.internal.ResourceUtils;
import org.eclipse.jdt.ls.core.internal.cleanup.CleanUpRegistry;
import org.eclipse.jdt.ls.core.internal.commands.OrganizeImportsCommand;
import org.eclipse.jdt.ls.core.internal.corrections.DiagnosticsHelper;
import org.eclipse.jdt.ls.core.internal.corrections.InnovationContext;
import org.eclipse.jdt.ls.core.internal.corrections.ProposalKindWrapper;
import org.eclipse.jdt.ls.core.internal.corrections.proposals.ReorgCorrectionsSubProcessor;
import org.eclipse.jdt.ls.core.internal.preferences.PreferenceManager;
import org.eclipse.jdt.ls.core.internal.preferences.Preferences;
import org.eclipse.lsp4j.Position;
import org.eclipse.lsp4j.Range;
import org.eclipse.lsp4j.TextDocumentIdentifier;
import org.eclipse.lsp4j.TextEdit;
import org.eclipse.lsp4j.WillSaveTextDocumentParams;
Expand Down Expand Up @@ -71,6 +86,10 @@ public List<TextEdit> willSaveWaitUntil(WillSaveTextDocumentParams params, IProg
edit.addAll(handleSaveActionOrganizeImports(documentUri, monitor));
}

if (preferences.isJavaSaveActionsRenameFileEnabled()) {
handleSaveActionRenameFile(documentUri, monitor);
}

LinkedHashSet<String> cleanUpIds = new LinkedHashSet<>();

List<String> lspCleanups = Collections.emptyList();
Expand Down Expand Up @@ -155,4 +174,42 @@ private List<TextEdit> handleSaveActionOrganizeImports(String documentUri, IProg
return edit;
}

private void handleSaveActionRenameFile(String documentUri, IProgressMonitor monitor) {
ICompilationUnit cu = JDTUtils.resolveCompilationUnit(documentUri);
CompilationUnit astRoot = CoreASTProvider.getInstance().getAST(cu, CoreASTProvider.WAIT_YES, null);
IProblem[] problems = astRoot.getProblems();
Optional<IProblem> desiredProblem = Arrays.stream(problems).filter(p -> p.getID() == IProblem.PublicClassMustMatchFileName).findFirst();
if (desiredProblem.isPresent()) {
IProblem renameProblem = desiredProblem.get();
Collection<ProposalKindWrapper> proposals = new ArrayList<>();
int start = renameProblem.getSourceStart();
int end = renameProblem.getSourceEnd();
Position startPosition = new Position(astRoot.getLineNumber(start) - 1, astRoot.getColumnNumber(start));
Position endPosition = new Position(astRoot.getLineNumber(end) - 1, astRoot.getColumnNumber(end));
Range range = new Range(startPosition, endPosition);
IInvocationContextCore context = CodeActionHandler.getContext(cu, astRoot, range);
ProblemLocationCore problem = new ProblemLocationCore(start, end - start + 1, renameProblem.getID(), renameProblem.getArguments(), true, IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER);
ReorgCorrectionsSubProcessor.getWrongTypeNameProposals(context, problem, proposals);
try {
Optional<ProposalKindWrapper> proposal = proposals.stream().filter(p -> p.getProposal().getName().contains("Rename file")).findFirst();
WorkspaceEdit workspaceEdit = proposal.isPresent() ? ChangeUtil.convertToWorkspaceEdit(proposal.get().getProposal().getChange()) : null;
final boolean applyNow = JavaLanguageServerPlugin.getPreferencesManager().getClientPreferences().isWorkspaceApplyEditSupported();
if (applyNow && workspaceEdit != null) {
JavaLanguageServerPlugin.getInstance().getClientConnection().applyWorkspaceEdit(workspaceEdit);
return;
}
} catch (CoreException e) {
// do nothing
}
}
}

public static IInvocationContextCore getContext(ICompilationUnit unit, CompilationUnit astRoot, Range range) {
int start = DiagnosticsHelper.getStartOffset(unit, range);
int end = DiagnosticsHelper.getEndOffset(unit, range);
InnovationContext context = new InnovationContext(unit, start, end - start);
context.setASTRoot(astRoot);
return context;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,11 @@ public class Preferences {
*/
public static final String JAVA_SAVE_ACTIONS_ORGANIZE_IMPORTS_KEY = "java.saveActions.organizeImports";

/**
* Preference key to enable/disable rename file on save
*/
public static final String JAVA_SAVE_ACTIONS_RENAME_FILE_ENABLED = "java.saveActions.renameFile";

/**
* Preference key to enable/disable signature help.
*/
Expand Down Expand Up @@ -611,6 +616,7 @@ public class Preferences {
private String javaQuickFixShowAt;
private boolean javaFormatOnTypeEnabled;
private boolean javaSaveActionsOrganizeImportsEnabled;
private boolean javaSaveActionsRenameFileEnabled;
private boolean signatureHelpEnabled;
private boolean signatureHelpDescriptionEnabled;
private boolean renameEnabled;
Expand Down Expand Up @@ -869,6 +875,7 @@ public Preferences() {
javaQuickFixShowAt = LINE;
javaFormatOnTypeEnabled = false;
javaSaveActionsOrganizeImportsEnabled = false;
javaSaveActionsRenameFileEnabled = true;
signatureHelpEnabled = false;
signatureHelpDescriptionEnabled = false;
renameEnabled = true;
Expand Down Expand Up @@ -1041,6 +1048,9 @@ public static Preferences createFrom(Map<String, Object> configuration) {
boolean javaSaveActionAutoOrganizeImportsEnabled = getBoolean(configuration, JAVA_SAVE_ACTIONS_ORGANIZE_IMPORTS_KEY, false);
prefs.setJavaSaveActionAutoOrganizeImportsEnabled(javaSaveActionAutoOrganizeImportsEnabled);

boolean javaSaveActionRenameFileEnabled = getBoolean(configuration, JAVA_SAVE_ACTIONS_RENAME_FILE_ENABLED, true);
prefs.setJavaSaveActionRenameFileEnabled(javaSaveActionRenameFileEnabled);

boolean signatureHelpEnabled = getBoolean(configuration, SIGNATURE_HELP_ENABLED_KEY, true);
prefs.setSignatureHelpEnabled(signatureHelpEnabled);

Expand Down Expand Up @@ -1584,6 +1594,11 @@ public Preferences setJavaSaveActionAutoOrganizeImportsEnabled(boolean javaSaveA
return this;
}

public Preferences setJavaSaveActionRenameFileEnabled(boolean javaSaveActionsRenameFileEnabled) {
this.javaSaveActionsRenameFileEnabled = javaSaveActionsRenameFileEnabled;
return this;
}

public Preferences setHashCodeEqualsTemplateUseJava7Objects(boolean hashCodeEqualsTemplateUseJ7Objects) {
this.hashCodeEqualsTemplateUseJava7Objects = hashCodeEqualsTemplateUseJ7Objects;
return this;
Expand Down Expand Up @@ -1849,6 +1864,10 @@ public boolean isJavaSaveActionsOrganizeImportsEnabled() {
return javaSaveActionsOrganizeImportsEnabled;
}

public boolean isJavaSaveActionsRenameFileEnabled() {
return javaSaveActionsRenameFileEnabled;
}

public boolean isSignatureHelpEnabled() {
return signatureHelpEnabled;
}
Expand Down

0 comments on commit f45557c

Please sign in to comment.