-
Notifications
You must be signed in to change notification settings - Fork 82
/
VarargsWarningsBaseSubProcessor.java
128 lines (107 loc) · 5.39 KB
/
VarargsWarningsBaseSubProcessor.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*******************************************************************************
* Copyright (c) 2024 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Red Hat Inc - separate core logic from UI images
*******************************************************************************/
package org.eclipse.jdt.internal.ui.text.correction;
import java.util.Collection;
import java.util.List;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.ClassInstanceCreation;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.IMethodBinding;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.MarkerAnnotation;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.MethodInvocation;
import org.eclipse.jdt.core.dom.Modifier;
import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
import org.eclipse.jdt.internal.core.manipulation.dom.ASTResolving;
import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
import org.eclipse.jdt.internal.corext.util.Messages;
public abstract class VarargsWarningsBaseSubProcessor<T> {
public VarargsWarningsBaseSubProcessor() {
}
public void createAddSafeVarargsProposals(IInvocationContextCore context, IProblemLocationCore problem, Collection<T> proposals) {
ASTNode coveringNode= problem.getCoveringNode(context.getASTRoot());
MethodDeclaration methodDeclaration= ASTResolving.findParentMethodDeclaration(coveringNode);
if (methodDeclaration == null)
return;
IMethodBinding methodBinding= methodDeclaration.resolveBinding();
if (methodBinding == null)
return;
int modifiers= methodBinding.getModifiers();
if (!Modifier.isStatic(modifiers) && !Modifier.isFinal(modifiers) && !Modifier.isPrivate(modifiers) && !methodBinding.isConstructor())
return;
String label= CorrectionMessages.VarargsWarningsSubProcessor_add_safevarargs_label;
T proposal= createAddSafeVarargsProposal1(label, context.getCompilationUnit(), methodDeclaration, null, IProposalRelevance.ADD_SAFEVARARGS);
if (proposal != null)
proposals.add(proposal);
}
public void createAddSafeVarargsToDeclarationProposals(IInvocationContextCore context, IProblemLocationCore problem, Collection<T> proposals) {
if (!JavaModelUtil.is1d7OrHigher(context.getCompilationUnit().getJavaProject()))
return;
ASTNode coveringNode= problem.getCoveringNode(context.getASTRoot());
IMethodBinding methodBinding;
if (coveringNode instanceof MethodInvocation) {
methodBinding= ((MethodInvocation) coveringNode).resolveMethodBinding();
} else if (coveringNode instanceof ClassInstanceCreation) {
methodBinding= ((ClassInstanceCreation) coveringNode).resolveConstructorBinding();
} else {
return;
}
if (methodBinding == null)
return;
String label= Messages.format(CorrectionMessages.VarargsWarningsSubProcessor_add_safevarargs_to_method_label, methodBinding.getName());
ITypeBinding declaringType= methodBinding.getDeclaringClass();
CompilationUnit astRoot= (CompilationUnit) coveringNode.getRoot();
if (declaringType != null && declaringType.isFromSource()) {
try {
ICompilationUnit targetCu= ASTResolving.findCompilationUnitForBinding(context.getCompilationUnit(), astRoot, declaringType);
if (targetCu != null) {
T proposal= createAddSafeVarargsToDeclarationProposal1(label, targetCu, null, methodBinding.getMethodDeclaration(), IProposalRelevance.ADD_SAFEVARARGS);
if (proposal != null)
proposals.add(proposal);
}
} catch (JavaModelException e) {
return;
}
}
}
public void createRemoveSafeVarargsProposals(IInvocationContextCore context, IProblemLocationCore problem, Collection<T> proposals) {
ASTNode coveringNode= problem.getCoveringNode(context.getASTRoot());
if (!(coveringNode instanceof MethodDeclaration methodDeclaration))
return;
MarkerAnnotation annotation= null;
for (ASTNode node : (List<? extends ASTNode>) methodDeclaration.modifiers()) {
if (node instanceof MarkerAnnotation) {
annotation= (MarkerAnnotation) node;
if ("SafeVarargs".equals(annotation.resolveAnnotationBinding().getName())) { //$NON-NLS-1$
break;
}
}
}
if (annotation == null)
return;
ASTRewrite rewrite= ASTRewrite.create(coveringNode.getAST());
rewrite.remove(annotation, null);
String label= CorrectionMessages.VarargsWarningsSubProcessor_remove_safevarargs_label;
T proposal= createRemoveSafeVarargsProposal1(label, context.getCompilationUnit(), rewrite, IProposalRelevance.REMOVE_SAFEVARARGS);
if (proposal != null)
proposals.add(proposal);
}
protected abstract T createAddSafeVarargsProposal1(String label, ICompilationUnit compilationUnit, MethodDeclaration methodDeclaration, IMethodBinding methodBinding, int relevance);
protected abstract T createAddSafeVarargsToDeclarationProposal1(String label, ICompilationUnit targetCu, Object object, IMethodBinding methodDeclaration, int relevance);
protected abstract T createRemoveSafeVarargsProposal1(String label, ICompilationUnit compilationUnit, ASTRewrite rewrite, int removeSafevarargs);
}