Skip to content

Commit 7c4bdd5

Browse files
committed
Add Assign statement to new variable/field quick action
Signed-off-by: Snjezana Peco <snjezana.peco@redhat.com>
1 parent e9f78a4 commit 7c4bdd5

File tree

9 files changed

+354
-22
lines changed

9 files changed

+354
-22
lines changed

org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/JavaCodeActionKind.java

+10
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,16 @@ public interface JavaCodeActionKind {
8383
*/
8484
public static final String REFACTOR_MOVE = CodeActionKind.Refactor + ".move";
8585

86+
/**
87+
* Assign statement to new local variable
88+
*/
89+
public static final String REFACTOR_ASSIGN_VARIABLE = CodeActionKind.Refactor + ".assign.variable";
90+
91+
/**
92+
* Assign statement to new field
93+
*/
94+
public static final String REFACTOR_ASSIGN_FIELD = CodeActionKind.Refactor + ".assign.field";
95+
8696
/**
8797
* Base kind for "quickassist" code actions
8898
*/

org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/RefactorProcessor.java

+21
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ public List<ChangeCorrectionProposal> getProposals(CodeActionParams params, IInv
152152
getAddStaticImportProposals(context, coveringNode, proposals);
153153

154154
getConvertForLoopProposal(context, coveringNode, proposals);
155+
getAssignToVariableProposals(context, coveringNode, locations, proposals, params);
155156
}
156157
return proposals;
157158
}
@@ -232,6 +233,26 @@ private boolean getExtractVariableProposal(CodeActionParams params, IInvocationC
232233
return true;
233234
}
234235

236+
private boolean getAssignToVariableProposals(IInvocationContext context, ASTNode node, IProblemLocationCore[] locations, Collection<ChangeCorrectionProposal> resultingCollections, CodeActionParams params) {
237+
try {
238+
Map formatterOptions = null;
239+
CUCorrectionProposal proposal = RefactorProposalUtility.getAssignVariableProposal(params, context, locations != null && locations.length != 0, formatterOptions,
240+
this.preferenceManager.getClientPreferences().isAdvancedExtractRefactoringSupported(), locations);
241+
if (proposal != null) {
242+
resultingCollections.add(proposal);
243+
}
244+
String initializeIn = null;
245+
proposal = RefactorProposalUtility.getAssignFieldProposal(params, context, locations != null && locations.length != 0, formatterOptions, initializeIn,
246+
this.preferenceManager.getClientPreferences().isAdvancedExtractRefactoringSupported(), locations);
247+
if (proposal != null) {
248+
resultingCollections.add(proposal);
249+
}
250+
} catch (CoreException e) {
251+
JavaLanguageServerPlugin.logException(e);
252+
}
253+
return true;
254+
}
255+
235256
private boolean getExtractMethodProposal(CodeActionParams params, IInvocationContext context, ASTNode coveringNode, boolean problemsAtLocation, Collection<ChangeCorrectionProposal> proposals) throws CoreException {
236257
if (proposals == null) {
237258
return false;

org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/AssignToVariableAssistProposal.java

+16
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,22 @@ public AssignToVariableAssistProposal(ICompilationUnit cu, int variableKind, Exp
104104
createImportRewrite((CompilationUnit) node.getRoot());
105105
}
106106

107+
public AssignToVariableAssistProposal(ICompilationUnit cu, String kind, int variableKind, ExpressionStatement node, ITypeBinding typeBinding, int relevance) {
108+
super("", kind, cu, null, relevance); //$NON-NLS-1$
109+
110+
fVariableKind = variableKind;
111+
fNodesToAssign = new ArrayList<>();
112+
fNodesToAssign.add(node);
113+
114+
fTypeBinding = Bindings.normalizeForDeclarationUse(typeBinding, node.getAST());
115+
if (variableKind == LOCAL) {
116+
setDisplayName(CorrectionMessages.AssignToVariableAssistProposal_assigntolocal_description);
117+
} else {
118+
setDisplayName(CorrectionMessages.AssignToVariableAssistProposal_assigntofield_description);
119+
}
120+
createImportRewrite((CompilationUnit) node.getRoot());
121+
}
122+
107123
public AssignToVariableAssistProposal(ICompilationUnit cu, SingleVariableDeclaration parameter, VariableDeclarationFragment existingFragment, ITypeBinding typeBinding, int relevance) {
108124
super("", JavaCodeActionKind.QUICK_ASSIST, cu, null, relevance); //$NON-NLS-1$
109125

org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/CodeActionHandler.java

+4
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.eclipse.jdt.ls.core.internal.corrections.RefactorProcessor;
4040
import org.eclipse.jdt.ls.core.internal.corrections.proposals.ChangeCorrectionProposal;
4141
import org.eclipse.jdt.ls.core.internal.preferences.PreferenceManager;
42+
import org.eclipse.jdt.ls.core.internal.text.correction.AssignToVariableAssistCommandProposal;
4243
import org.eclipse.jdt.ls.core.internal.text.correction.CUCorrectionCommandProposal;
4344
import org.eclipse.jdt.ls.core.internal.text.correction.QuickAssistProcessor;
4445
import org.eclipse.jdt.ls.core.internal.text.correction.RefactoringCorrectionCommandProposal;
@@ -158,6 +159,9 @@ private Optional<Either<Command, CodeAction>> getCodeActionFromProposal(ChangeCo
158159
} else if (proposal instanceof RefactoringCorrectionCommandProposal) {
159160
RefactoringCorrectionCommandProposal commandProposal = (RefactoringCorrectionCommandProposal) proposal;
160161
command = new Command(name, commandProposal.getCommand(), commandProposal.getCommandArguments());
162+
} else if (proposal instanceof AssignToVariableAssistCommandProposal) {
163+
AssignToVariableAssistCommandProposal commandProposal = (AssignToVariableAssistCommandProposal) proposal;
164+
command = new Command(name, commandProposal.getCommand(), commandProposal.getCommandArguments());
161165
} else {
162166
WorkspaceEdit edit = ChangeUtil.convertToWorkspaceEdit(proposal.getChange());
163167
if (!ChangeUtil.hasChanges(edit)) {

org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/GetRefactorEditHandler.java

+17-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
import org.eclipse.jdt.ls.core.internal.corrections.RefactorProcessor;
3535
import org.eclipse.jdt.ls.core.internal.corrections.proposals.CUCorrectionProposal;
3636
import org.eclipse.jdt.ls.core.internal.corrections.proposals.LinkedCorrectionProposal;
37-
import org.eclipse.jdt.ls.core.internal.text.correction.QuickAssistProcessor;
3837
import org.eclipse.jdt.ls.core.internal.text.correction.RefactorProposalUtility;
3938
import org.eclipse.lsp4j.CodeActionParams;
4039
import org.eclipse.lsp4j.Command;
@@ -65,6 +64,11 @@ public static RefactorWorkspaceEdit getEditsForRefactor(GetRefactorEditParams pa
6564
if (RefactorProposalUtility.EXTRACT_VARIABLE_COMMAND.equals(params.command) || RefactorProposalUtility.EXTRACT_VARIABLE_ALL_OCCURRENCE_COMMAND.equals(params.command)
6665
|| RefactorProposalUtility.EXTRACT_CONSTANT_COMMAND.equals(params.command)) {
6766
proposal = (LinkedCorrectionProposal) getExtractVariableProposal(params.context, context, problemsAtLocation, params.command, formatterOptions);
67+
} else if (RefactorProposalUtility.ASSIGN_VARIABLE_COMMAND.equals(params.command)) {
68+
proposal = (LinkedCorrectionProposal) getAssignVariableProposal(params, context, problemsAtLocation, params.command, formatterOptions, locations);
69+
} else if (RefactorProposalUtility.ASSIGN_FIELD_COMMAND.equals(params.command)) {
70+
String initializeIn = (params.commandArguments != null && !params.commandArguments.isEmpty()) ? JSONUtility.toModel(params.commandArguments.get(0), String.class) : null;
71+
proposal = (LinkedCorrectionProposal) RefactorProposalUtility.getAssignFieldProposal(params.context, context, problemsAtLocation, formatterOptions, initializeIn, false, locations);
6872
} else if (RefactorProposalUtility.EXTRACT_METHOD_COMMAND.equals(params.command)) {
6973
proposal = (LinkedCorrectionProposal) getExtractMethodProposal(params.context, context, context.getCoveringNode(), problemsAtLocation, formatterOptions);
7074
} else if (RefactorProposalUtility.CONVERT_VARIABLE_TO_FIELD_COMMAND.equals(params.command)) {
@@ -143,6 +147,18 @@ private static CUCorrectionProposal getExtractVariableProposal(CodeActionParams
143147
return null;
144148
}
145149

150+
private static CUCorrectionProposal getAssignVariableProposal(GetRefactorEditParams params, IInvocationContext context, boolean problemsAtLocation, String refactorType, Map formatterOptions, IProblemLocationCore[] locations)
151+
throws CoreException {
152+
if (RefactorProposalUtility.ASSIGN_VARIABLE_COMMAND.equals(refactorType)) {
153+
return RefactorProposalUtility.getAssignVariableProposal(params.context, context, problemsAtLocation, formatterOptions, false, locations);
154+
}
155+
if (RefactorProposalUtility.ASSIGN_FIELD_COMMAND.equals(refactorType)) {
156+
String initializeIn = (params.commandArguments != null && !params.commandArguments.isEmpty()) ? JSONUtility.toModel(params.commandArguments.get(0), String.class) : null;
157+
return RefactorProposalUtility.getAssignFieldProposal(params.context, context, problemsAtLocation, formatterOptions, initializeIn, false, locations);
158+
}
159+
return null;
160+
}
161+
146162
private static CUCorrectionProposal getExtractMethodProposal(CodeActionParams params, IInvocationContext context, ASTNode coveringNode, boolean problemsAtLocation, Map formatterOptions) throws CoreException {
147163
return RefactorProposalUtility.getExtractMethodProposal(params, context, coveringNode, problemsAtLocation, formatterOptions, false);
148164
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2016-2017 Red Hat Inc. and others.
3+
* All rights reserved. This program and the accompanying materials
4+
* are made available under the terms of the Eclipse Public License 2.0
5+
* which accompanies this distribution, and is available at
6+
* https://www.eclipse.org/legal/epl-2.0/
7+
*
8+
* SPDX-License-Identifier: EPL-2.0
9+
*
10+
* Contributors:
11+
* Red Hat Inc. - initial API and implementation
12+
*******************************************************************************/
13+
package org.eclipse.jdt.ls.core.internal.text.correction;
14+
15+
import java.util.List;
16+
17+
import org.eclipse.jdt.core.ICompilationUnit;
18+
import org.eclipse.jdt.core.dom.ExpressionStatement;
19+
import org.eclipse.jdt.core.dom.ITypeBinding;
20+
import org.eclipse.jdt.ls.core.internal.corrections.proposals.AssignToVariableAssistProposal;
21+
22+
public class AssignToVariableAssistCommandProposal extends AssignToVariableAssistProposal {
23+
24+
private String command;
25+
private List<Object> commandArguments;
26+
27+
public AssignToVariableAssistCommandProposal(ICompilationUnit cu, String kind, int variableKind, ExpressionStatement node, ITypeBinding typeBinding, int relevance, String command, List<Object> commandArguments) {
28+
super(cu, kind, variableKind, node, typeBinding, relevance);
29+
this.command = command;
30+
this.commandArguments = commandArguments;
31+
}
32+
33+
public String getCommand() {
34+
return command;
35+
}
36+
37+
public List<Object> getCommandArguments() {
38+
return commandArguments;
39+
}
40+
}

org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/text/correction/QuickAssistProcessor.java

-21
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,6 @@
3434
import org.eclipse.jdt.core.JavaModelException;
3535
import org.eclipse.jdt.core.dom.AST;
3636
import org.eclipse.jdt.core.dom.ASTNode;
37-
import org.eclipse.jdt.core.dom.ASTVisitor;
38-
import org.eclipse.jdt.core.dom.AbstractTypeDeclaration;
39-
import org.eclipse.jdt.core.dom.AnonymousClassDeclaration;
4037
import org.eclipse.jdt.core.dom.ArrayCreation;
4138
import org.eclipse.jdt.core.dom.ArrayType;
4239
import org.eclipse.jdt.core.dom.Block;
@@ -52,7 +49,6 @@
5249
import org.eclipse.jdt.core.dom.IMethodBinding;
5350
import org.eclipse.jdt.core.dom.ITypeBinding;
5451
import org.eclipse.jdt.core.dom.IVariableBinding;
55-
import org.eclipse.jdt.core.dom.ImportDeclaration;
5652
import org.eclipse.jdt.core.dom.Initializer;
5753
import org.eclipse.jdt.core.dom.LambdaExpression;
5854
import org.eclipse.jdt.core.dom.MethodDeclaration;
@@ -62,7 +58,6 @@
6258
import org.eclipse.jdt.core.dom.Name;
6359
import org.eclipse.jdt.core.dom.NameQualifiedType;
6460
import org.eclipse.jdt.core.dom.ParameterizedType;
65-
import org.eclipse.jdt.core.dom.QualifiedName;
6661
import org.eclipse.jdt.core.dom.ReturnStatement;
6762
import org.eclipse.jdt.core.dom.SimpleName;
6863
import org.eclipse.jdt.core.dom.SimpleType;
@@ -81,34 +76,18 @@
8176
import org.eclipse.jdt.core.dom.rewrite.ImportRewrite;
8277
import org.eclipse.jdt.core.dom.rewrite.ListRewrite;
8378
import org.eclipse.jdt.core.manipulation.CodeStyleConfiguration;
84-
import org.eclipse.jdt.internal.core.manipulation.StubUtility;
8579
import org.eclipse.jdt.internal.core.manipulation.dom.ASTResolving;
86-
import org.eclipse.jdt.internal.corext.dom.ASTNodeFactory;
8780
import org.eclipse.jdt.internal.corext.dom.ASTNodes;
8881
import org.eclipse.jdt.internal.corext.dom.Bindings;
8982
import org.eclipse.jdt.internal.corext.dom.GenericVisitor;
9083
import org.eclipse.jdt.internal.corext.dom.ScopeAnalyzer;
91-
import org.eclipse.jdt.internal.corext.fix.IProposableFix;
9284
import org.eclipse.jdt.internal.corext.fix.LinkedProposalModelCore;
93-
import org.eclipse.jdt.internal.corext.fix.VariableDeclarationFixCore;
94-
import org.eclipse.jdt.internal.corext.refactoring.RefactoringAvailabilityTesterCore;
95-
import org.eclipse.jdt.internal.corext.refactoring.code.ConvertAnonymousToNestedRefactoring;
96-
import org.eclipse.jdt.internal.corext.refactoring.code.InlineConstantRefactoring;
97-
import org.eclipse.jdt.internal.corext.refactoring.code.InlineMethodRefactoring;
98-
import org.eclipse.jdt.internal.corext.refactoring.code.InlineTempRefactoring;
99-
import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
100-
import org.eclipse.jdt.internal.corext.util.Messages;
101-
import org.eclipse.jdt.internal.ui.fix.AbstractCleanUpCore;
102-
import org.eclipse.jdt.internal.ui.fix.LambdaExpressionsCleanUpCore;
103-
import org.eclipse.jdt.internal.ui.fix.MultiFixMessages;
10485
import org.eclipse.jdt.internal.ui.text.correction.IProblemLocationCore;
105-
import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin;
10686
import org.eclipse.jdt.ls.core.internal.corrections.CorrectionMessages;
10787
import org.eclipse.jdt.ls.core.internal.corrections.IInvocationContext;
10888
import org.eclipse.jdt.ls.core.internal.corrections.proposals.ASTRewriteCorrectionProposal;
10989
import org.eclipse.jdt.ls.core.internal.corrections.proposals.AssignToVariableAssistProposal;
11090
import org.eclipse.jdt.ls.core.internal.corrections.proposals.ChangeCorrectionProposal;
111-
import org.eclipse.jdt.ls.core.internal.corrections.proposals.FixCorrectionProposal;
11291
import org.eclipse.jdt.ls.core.internal.corrections.proposals.IProposalRelevance;
11392
import org.eclipse.jdt.ls.core.internal.preferences.PreferenceManager;
11493
import org.eclipse.jface.text.link.LinkedPositionGroup;

0 commit comments

Comments
 (0)