This repository was archived by the owner on Feb 24, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathDependencyOnDeprecatedGuavaClassDetector.java
More file actions
97 lines (80 loc) · 3.46 KB
/
Copy pathDependencyOnDeprecatedGuavaClassDetector.java
File metadata and controls
97 lines (80 loc) · 3.46 KB
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
package jp.skypencil.guava;
import java.util.Map;
import org.apache.bcel.classfile.Field;
import org.apache.bcel.classfile.Method;
import org.apache.bcel.generic.Type;
import org.apache.bcel.Const;
import com.google.common.collect.ImmutableMap;
import edu.umd.cs.findbugs.BugInstance;
import edu.umd.cs.findbugs.BugReporter;
import edu.umd.cs.findbugs.BytecodeScanningDetector;
import edu.umd.cs.findbugs.internalAnnotations.DottedClassName;
import edu.umd.cs.findbugs.internalAnnotations.SlashedClassName;
public class DependencyOnDeprecatedGuavaClassDetector extends BytecodeScanningDetector {
private Map<String, String> replacements = listUpTarget();
private final BugReporter bugReporter;
public DependencyOnDeprecatedGuavaClassDetector(BugReporter bugReporter) {
this.bugReporter = bugReporter;
}
private Map<String, String> listUpTarget() {
ImmutableMap.Builder<String, String> builder = ImmutableMap.builder();
builder.put("com/google/common/io/BaseEncoding", "java/util/Base64");
builder.put("com/google/common/base/Optional", "java/util/Optional");
builder.put("com/google/common/base/Joiner", "java/util/StringJoiner");
builder.put("com/google/common/base/Predicate", "java/util/function/Predicate");
builder.put("com/google/common/base/Function", "java/util/function/Function");
builder.put("com/google/common/base/Supplier", "java/util/function/Supplier");
builder.put("com/google/common/collect/FluentIterable", "java/util/stream/Stream");
builder.put("com/google/common/util/concurrent/SettableFuture", "java/util/concurrent/CompletableFuture");
return builder.build();
}
@Override
public boolean beforeOpcode(int seen) {
if ((seen == Const.INVOKESPECIAL) || (seen == Const.INVOKESTATIC)
|| (seen == Const.INVOKEVIRTUAL) || (seen == Const.INVOKEINTERFACE)) {
@SlashedClassName
String referenced = getClassConstantOperand();
@SlashedClassName
String replacement = replacements.get(referenced);
if (replacement != null) {
report(referenced.replace('/', '.'), replacement.replace('/', '.'));
}
}
return super.beforeOpcode(seen);
}
@Override
public void visitField(Field field) {
check(field.getType());
super.visitField(field);
}
@Override
public void visitMethod(Method method) {
check(method.getReturnType());
for (Type type : method.getArgumentTypes()) {
check(type);
}
super.visitMethod(method);
}
private void check(Type type) {
@DottedClassName
String referenced = type.toString();
@SlashedClassName
String replacement = replacements.get(referenced.replace('.', '/'));
if (replacement != null) {
report(referenced, replacement.replace('/', '.'));
}
}
private void report(@DottedClassName String referenced, @DottedClassName String replacement) {
BugInstance bug = new BugInstance(this, "GUAVA_DEPEND_ON_DEPRECATED_CLASS", NORMAL_PRIORITY);
bug.addString(referenced);
bug.addString(replacement);
if (this.visitingMethod()) {
bug.addSourceLine(this);
bug.addClassAndMethod(this);
} else if (this.visitingField()) {
bug.addField(this);
bug.addClass(this);
}
bugReporter.reportBug(bug);
}
}