Skip to content

Commit 4b44180

Browse files
committed
Performance improvement when lombok is present
Signed-off-by: Snjezana Peco <[email protected]>
1 parent 1226891 commit 4b44180

File tree

11 files changed

+292
-87
lines changed

11 files changed

+292
-87
lines changed

org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/contentassist/CompletionProposalReplacementProvider.java

+18-15
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public CompletionProposalReplacementProvider(ICompilationUnit compilationUnit, C
110110

111111
/**
112112
* Update the replacement.
113-
*
113+
*
114114
* When {@link #isResolvingRequest} is <code>true</code>, additionalTextEdits will also be resolved.
115115
* @param proposal
116116
* @param item
@@ -663,19 +663,22 @@ private org.eclipse.lsp4j.TextEdit toRequiredTypeEdit(CompletionProposal typePro
663663
/*
664664
* Add parameter types
665665
*/
666-
boolean onlyAppendArguments;
667-
try {
668-
onlyAppendArguments= typeProposal.getCompletion().length == 0 && offset > 0 && compilationUnit.getBuffer().getChar(offset - 1) == '<';
669-
} catch (JavaModelException e) {
670-
onlyAppendArguments= false;
671-
}
672-
if (onlyAppendArguments || shouldAppendArguments(typeProposal, trigger)) {
673-
String[] typeArguments = computeTypeArgumentProposals(typeProposal);
674-
if(typeArguments.length > 0){
675-
if (canUseDiamond){
676-
buffer.append("<>"); //$NON-NLS-1$
677-
} else {
678-
appendParameterList(buffer,typeArguments, onlyAppendArguments);
666+
// see https://github.com/redhat-developer/vscode-java/issues/2982
667+
if (this.isResolvingRequest) {
668+
boolean onlyAppendArguments;
669+
try {
670+
onlyAppendArguments = typeProposal.getCompletion().length == 0 && offset > 0 && compilationUnit.getBuffer().getChar(offset - 1) == '<';
671+
} catch (JavaModelException e) {
672+
onlyAppendArguments = false;
673+
}
674+
if (onlyAppendArguments || shouldAppendArguments(typeProposal, trigger)) {
675+
String[] typeArguments = computeTypeArgumentProposals(typeProposal);
676+
if (typeArguments.length > 0) {
677+
if (canUseDiamond) {
678+
buffer.append("<>"); //$NON-NLS-1$
679+
} else {
680+
appendParameterList(buffer, typeArguments, onlyAppendArguments);
681+
}
679682
}
680683
}
681684
}
@@ -1038,7 +1041,7 @@ private String computeJavaTypeReplacementString(CompletionProposal proposal) {
10381041
context = new ContextSensitiveImportRewriteContext(cu, this.offset, this.importRewrite);
10391042
}
10401043
}
1041-
1044+
10421045
return importRewrite.addImport(qualifiedTypeName, context);
10431046
}
10441047

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

+18-14
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import java.util.Set;
3434

3535
import org.eclipse.core.runtime.CoreException;
36+
import org.eclipse.core.runtime.IProgressMonitor;
3637
import org.eclipse.jdt.core.IBuffer;
3738
import org.eclipse.jdt.core.ICompilationUnit;
3839
import org.eclipse.jdt.core.JavaModelException;
@@ -75,24 +76,27 @@ private static int moveBack(int offset, int start, String ignoreCharacters, ICom
7576
return start;
7677
}
7778

78-
public List<ChangeCorrectionProposal> getCorrections(CodeActionParams params, IInvocationContext context, IProblemLocationCore[] locations) throws CoreException {
79+
public List<ChangeCorrectionProposal> getCorrections(CodeActionParams params, IInvocationContext context, IProblemLocationCore[] locations, IProgressMonitor monitor) throws CoreException {
7980
if (locations == null || locations.length == 0) {
8081
return Collections.emptyList();
8182
}
8283
ArrayList<ChangeCorrectionProposal> resultingCollections = new ArrayList<>();
8384
Set<Integer> handledProblems = new HashSet<>(locations.length);
8485
for (int i = 0; i < locations.length; i++) {
86+
if (monitor.isCanceled()) {
87+
return Collections.emptyList();
88+
}
8589
IProblemLocationCore curr = locations[i];
86-
if (handledProblems(curr, locations, handledProblems)) {
87-
process(params, context, curr, resultingCollections);
90+
if (handledProblems(curr, locations, handledProblems, monitor)) {
91+
process(params, context, curr, resultingCollections, monitor);
8892
}
8993
}
9094
return resultingCollections;
9195
}
9296

93-
private static boolean handledProblems(IProblemLocationCore location, IProblemLocationCore[] locations, Set<Integer> handledProblems) {
97+
private static boolean handledProblems(IProblemLocationCore location, IProblemLocationCore[] locations, Set<Integer> handledProblems, IProgressMonitor monitor) {
9498
int problemId = location.getProblemId();
95-
if (handledProblems.contains(problemId)) {
99+
if (monitor.isCanceled() || handledProblems.contains(problemId)) {
96100
return false;
97101
}
98102
if (problemId == IProblem.UndefinedName) {
@@ -107,7 +111,7 @@ private static boolean handledProblems(IProblemLocationCore location, IProblemLo
107111
return handledProblems.add(problemId);
108112
}
109113

110-
private void process(CodeActionParams params, IInvocationContext context, IProblemLocationCore problem, Collection<ChangeCorrectionProposal> proposals) throws CoreException {
114+
private void process(CodeActionParams params, IInvocationContext context, IProblemLocationCore problem, Collection<ChangeCorrectionProposal> proposals, IProgressMonitor monitor) throws CoreException {
111115
int id = problem.getProblemId();
112116
if (id == 0) { // no proposals for none-problem locations
113117
return;
@@ -135,7 +139,7 @@ private void process(CodeActionParams params, IInvocationContext context, IProbl
135139
break;
136140

137141
case IProblem.UndefinedMethod:
138-
UnresolvedElementsSubProcessor.getMethodProposals(context, problem, false, proposals);
142+
UnresolvedElementsSubProcessor.getMethodProposals(context, problem, false, proposals, monitor);
139143
break;
140144
case IProblem.UndefinedConstructor:
141145
UnresolvedElementsSubProcessor.getConstructorProposals(context, problem, proposals);
@@ -144,7 +148,7 @@ private void process(CodeActionParams params, IInvocationContext context, IProbl
144148
UnresolvedElementsSubProcessor.getAnnotationMemberProposals(context, problem, proposals);
145149
break;
146150
case IProblem.ParameterMismatch:
147-
UnresolvedElementsSubProcessor.getMethodProposals(context, problem, true, proposals);
151+
UnresolvedElementsSubProcessor.getMethodProposals(context, problem, true, proposals, monitor);
148152
break;
149153
// case IProblem.MethodButWithConstructorName:
150154
// ReturnTypeSubProcessor.addMethodWithConstrNameProposals(context,
@@ -153,7 +157,7 @@ private void process(CodeActionParams params, IInvocationContext context, IProbl
153157
case IProblem.UndefinedField:
154158
case IProblem.UndefinedName:
155159
case IProblem.UnresolvedVariable:
156-
UnresolvedElementsSubProcessor.getVariableProposals(context, problem, null, proposals);
160+
UnresolvedElementsSubProcessor.getVariableProposals(context, problem, null, proposals, monitor);
157161
break;
158162
case IProblem.AmbiguousType:
159163
case IProblem.JavadocAmbiguousType:
@@ -214,7 +218,7 @@ private void process(CodeActionParams params, IInvocationContext context, IProbl
214218
case IProblem.NonStaticOrAlienTypeReceiver:
215219
case IProblem.IndirectAccessToStaticField:
216220
case IProblem.IndirectAccessToStaticMethod:
217-
LocalCorrectionsSubProcessor.addCorrectAccessToStaticProposals(context, problem, proposals);
221+
LocalCorrectionsSubProcessor.addCorrectAccessToStaticProposals(context, problem, proposals, monitor);
218222
break;
219223
case IProblem.SealedMissingClassModifier:
220224
case IProblem.SealedMissingInterfaceModifier:
@@ -230,15 +234,15 @@ private void process(CodeActionParams params, IInvocationContext context, IProbl
230234
case IProblem.NonStaticFieldFromStaticInvocation:
231235
case IProblem.InstanceMethodDuringConstructorInvocation:
232236
case IProblem.InstanceFieldDuringConstructorInvocation:
233-
ModifierCorrectionSubProcessor.addNonAccessibleReferenceProposal(context, problem, proposals, ModifierCorrectionSubProcessor.TO_STATIC, IProposalRelevance.CHANGE_MODIFIER_TO_STATIC);
237+
ModifierCorrectionSubProcessor.addNonAccessibleReferenceProposal(context, problem, proposals, ModifierCorrectionSubProcessor.TO_STATIC, IProposalRelevance.CHANGE_MODIFIER_TO_STATIC, monitor);
234238
break;
235239
case IProblem.NonBlankFinalLocalAssignment:
236240
case IProblem.DuplicateFinalLocalInitialization:
237241
case IProblem.FinalFieldAssignment:
238242
case IProblem.DuplicateBlankFinalFieldInitialization:
239243
case IProblem.AnonymousClassCannotExtendFinalClass:
240244
case IProblem.ClassExtendFinalClass:
241-
ModifierCorrectionSubProcessor.addNonAccessibleReferenceProposal(context, problem, proposals, ModifierCorrectionSubProcessor.TO_NON_FINAL, IProposalRelevance.REMOVE_FINAL_MODIFIER);
245+
ModifierCorrectionSubProcessor.addNonAccessibleReferenceProposal(context, problem, proposals, ModifierCorrectionSubProcessor.TO_NON_FINAL, IProposalRelevance.REMOVE_FINAL_MODIFIER, monitor);
242246
break;
243247
case IProblem.InheritedMethodReducesVisibility:
244248
case IProblem.MethodReducesVisibility:
@@ -277,13 +281,13 @@ private void process(CodeActionParams params, IInvocationContext context, IProbl
277281
break;
278282
case IProblem.NotVisibleField:
279283
GetterSetterCorrectionSubProcessor.addGetterSetterProposal(context, problem, proposals, IProposalRelevance.GETTER_SETTER_NOT_VISIBLE_FIELD);
280-
ModifierCorrectionSubProcessor.addNonAccessibleReferenceProposal(context, problem, proposals, ModifierCorrectionSubProcessor.TO_VISIBLE, IProposalRelevance.CHANGE_VISIBILITY);
284+
ModifierCorrectionSubProcessor.addNonAccessibleReferenceProposal(context, problem, proposals, ModifierCorrectionSubProcessor.TO_VISIBLE, IProposalRelevance.CHANGE_VISIBILITY, monitor);
281285
break;
282286
case IProblem.NotVisibleMethod:
283287
case IProblem.NotVisibleConstructor:
284288
case IProblem.NotVisibleType:
285289
case IProblem.JavadocNotVisibleType:
286-
ModifierCorrectionSubProcessor.addNonAccessibleReferenceProposal(context, problem, proposals, ModifierCorrectionSubProcessor.TO_VISIBLE, IProposalRelevance.CHANGE_VISIBILITY);
290+
ModifierCorrectionSubProcessor.addNonAccessibleReferenceProposal(context, problem, proposals, ModifierCorrectionSubProcessor.TO_VISIBLE, IProposalRelevance.CHANGE_VISIBILITY, monitor);
287291
break;
288292
case IProblem.BodyForAbstractMethod:
289293
case IProblem.AbstractMethodInAbstractClass:

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

+56-7
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.Map;
2323

2424
import org.eclipse.core.runtime.CoreException;
25+
import org.eclipse.core.runtime.IProgressMonitor;
2526
import org.eclipse.core.runtime.NullProgressMonitor;
2627
import org.eclipse.jdt.core.ICompilationUnit;
2728
import org.eclipse.jdt.core.IField;
@@ -122,38 +123,86 @@ public RefactorProcessor(PreferenceManager preferenceManager) {
122123
this.preferenceManager = preferenceManager;
123124
}
124125

125-
public List<ChangeCorrectionProposal> getProposals(CodeActionParams params, IInvocationContext context, IProblemLocationCore[] locations) throws CoreException {
126+
public List<ChangeCorrectionProposal> getProposals(CodeActionParams params, IInvocationContext context, IProblemLocationCore[] locations, IProgressMonitor monitor) throws CoreException {
126127
ASTNode coveringNode = context.getCoveringNode();
128+
if (monitor.isCanceled()) {
129+
return Collections.emptyList();
130+
}
127131
if (coveringNode != null) {
128132
ArrayList<ChangeCorrectionProposal> proposals = new ArrayList<>();
129133

130134
InvertBooleanUtility.getInverseConditionProposals(params, context, coveringNode, proposals);
135+
if (monitor.isCanceled()) {
136+
return Collections.emptyList();
137+
}
131138
getInverseLocalVariableProposals(params, context, coveringNode, proposals);
132-
139+
if (monitor.isCanceled()) {
140+
return Collections.emptyList();
141+
}
133142
getMoveRefactoringProposals(params, context, coveringNode, proposals);
134-
143+
if (monitor.isCanceled()) {
144+
return Collections.emptyList();
145+
}
135146
boolean noErrorsAtLocation = noErrorsAtLocation(locations, coveringNode);
136147
if (noErrorsAtLocation) {
137148
boolean problemsAtLocation = locations.length != 0;
138149
getExtractVariableProposal(params, context, problemsAtLocation, proposals);
150+
if (monitor.isCanceled()) {
151+
return Collections.emptyList();
152+
}
139153
getExtractMethodProposal(params, context, coveringNode, problemsAtLocation, proposals);
154+
if (monitor.isCanceled()) {
155+
return Collections.emptyList();
156+
}
140157
getExtractFieldProposal(params, context, problemsAtLocation, proposals);
158+
if (monitor.isCanceled()) {
159+
return Collections.emptyList();
160+
}
141161
getInlineProposal(context, coveringNode, proposals);
142-
162+
if (monitor.isCanceled()) {
163+
return Collections.emptyList();
164+
}
143165
getConvertAnonymousToNestedProposals(params, context, coveringNode, proposals);
166+
if (monitor.isCanceled()) {
167+
return Collections.emptyList();
168+
}
144169
getConvertAnonymousClassCreationsToLambdaProposals(context, coveringNode, proposals);
170+
if (monitor.isCanceled()) {
171+
return Collections.emptyList();
172+
}
145173
getConvertLambdaToAnonymousClassCreationsProposals(context, coveringNode, proposals);
146-
174+
if (monitor.isCanceled()) {
175+
return Collections.emptyList();
176+
}
147177
getConvertVarTypeToResolvedTypeProposal(context, coveringNode, proposals);
178+
if (monitor.isCanceled()) {
179+
return Collections.emptyList();
180+
}
148181
getConvertResolvedTypeToVarTypeProposal(context, coveringNode, proposals);
149-
182+
if (monitor.isCanceled()) {
183+
return Collections.emptyList();
184+
}
150185
getAddStaticImportProposals(context, coveringNode, proposals);
151-
186+
if (monitor.isCanceled()) {
187+
return Collections.emptyList();
188+
}
152189
getConvertForLoopProposal(context, coveringNode, proposals);
190+
if (monitor.isCanceled()) {
191+
return Collections.emptyList();
192+
}
153193
getAssignToVariableProposals(context, coveringNode, locations, proposals, params);
194+
if (monitor.isCanceled()) {
195+
return Collections.emptyList();
196+
}
154197
getIntroduceParameterProposals(params, context, coveringNode, locations, proposals);
198+
if (monitor.isCanceled()) {
199+
return Collections.emptyList();
200+
}
155201
getExtractInterfaceProposal(params, context, proposals);
156202
}
203+
if (monitor.isCanceled()) {
204+
return Collections.emptyList();
205+
}
157206
return proposals;
158207
}
159208
return Collections.emptyList();

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

+27-12
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import java.util.List;
2020

2121
import org.eclipse.core.runtime.IPath;
22+
import org.eclipse.core.runtime.IProgressMonitor;
23+
import org.eclipse.core.runtime.ProgressMonitorWrapper;
2224
import org.eclipse.jdt.core.CompletionProposal;
2325
import org.eclipse.jdt.core.CompletionRequestor;
2426
import org.eclipse.jdt.core.Flags;
@@ -256,14 +258,16 @@ public void accept(CompletionProposal proposal) {
256258
}
257259
}
258260

259-
public static String[] getStaticImportFavorites(ICompilationUnit cu, final String elementName, boolean isMethod, String[] favorites) throws JavaModelException {
260-
StringBuffer dummyCU= new StringBuffer();
261+
public static String[] getStaticImportFavorites(ICompilationUnit cu, final String elementName, boolean isMethod, String[] favorites, IProgressMonitor monitor) throws JavaModelException {
262+
StringBuilder dummyCU = new StringBuilder();
261263
String packName= cu.getParent().getElementName();
262264
IType type= cu.findPrimaryType();
263265
if (type == null) {
264266
return new String[0];
265267
}
266-
268+
if (monitor.isCanceled()) {
269+
return new String[0];
270+
}
267271
if (packName.length() > 0) {
268272
dummyCU.append("package ").append(packName).append(';'); //$NON-NLS-1$
269273
}
@@ -272,7 +276,6 @@ public static String[] getStaticImportFavorites(ICompilationUnit cu, final Strin
272276
dummyCU.append("\n}\n }"); //$NON-NLS-1$
273277

274278
ICompilationUnit newCU= null;
275-
String contents = cu.getBuffer().getContents();
276279
try {
277280
newCU= cu.getWorkingCopy(null);
278281
newCU.getBuffer().setContents(dummyCU.toString());
@@ -283,9 +286,7 @@ public static String[] getStaticImportFavorites(ICompilationUnit cu, final Strin
283286
@Override
284287
public void accept(CompletionProposal proposal) {
285288
if (elementName.equals(new String(proposal.getName()))) {
286-
CompletionProposal[] requiredProposals= proposal.getRequiredProposals();
287-
for (int i= 0; i < requiredProposals.length; i++) {
288-
CompletionProposal curr= requiredProposals[i];
289+
for (CompletionProposal curr : proposal.getRequiredProposals()) {
289290
if (curr.getKind() == CompletionProposal.METHOD_IMPORT || curr.getKind() == CompletionProposal.FIELD_IMPORT) {
290291
result.add(JavaModelUtil.concatenateName(Signature.toCharArray(curr.getDeclarationSignature()), curr.getName()));
291292
}
@@ -303,14 +304,28 @@ public void accept(CompletionProposal proposal) {
303304
}
304305
requestor.setFavoriteReferences(favorites);
305306

306-
newCU.codeComplete(offset, requestor);
307-
// if cu is working copy, we should restore the contents saved previously.
308-
if (cu.isWorkingCopy()) {
309-
cu.getBuffer().setContents(contents);
307+
IProgressMonitor subMonitor = new ProgressMonitorWrapper(monitor) {
308+
private long timeLimit;
309+
private final long TIMEOUT = Long.getLong("completion.timeout", 5000);
310+
311+
@Override
312+
public void beginTask(String name, int totalWork) {
313+
timeLimit = System.currentTimeMillis() + TIMEOUT;
314+
}
315+
316+
@Override
317+
public boolean isCanceled() {
318+
return super.isCanceled() || timeLimit <= System.currentTimeMillis();
319+
}
320+
321+
};
322+
newCU.codeComplete(offset, requestor, subMonitor);
323+
if (monitor.isCanceled()) {
324+
return new String[0];
310325
}
311326
return result.toArray(new String[result.size()]);
312327
} finally {
313-
if (newCU != null && !cu.isWorkingCopy()) {
328+
if (newCU != null) {
314329
newCU.discardWorkingCopy();
315330
}
316331
}

0 commit comments

Comments
 (0)