-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathResultContainer.java
More file actions
172 lines (134 loc) · 4.46 KB
/
ResultContainer.java
File metadata and controls
172 lines (134 loc) · 4.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
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
package org.parchmentmc.compass.util;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.Collection;
import java.util.Map;
import java.util.TreeMap;
/**
* Container for arbitrary result data for packages, classes, methods, fields, and parameters.
*
* @param <T> the type of stored result data
*/
public class ResultContainer<T> {
final Map<String, PackageResult<T>> packages = new TreeMap<>();
final Map<String, ClassResult<T>> classes = new TreeMap<>();
public ResultContainer() {
}
public void addPackage(PackageResult<T> pkg) {
packages.put(pkg.getName(), pkg);
}
public void addClass(ClassResult<T> clz) {
classes.put(clz.getName(), clz);
}
@Nullable
public PackageResult<T> getPackage(String name) {
return packages.get(name);
}
@Nullable
public ClassResult<T> getClass(String name) {
return classes.get(name);
}
public Collection<? extends PackageResult<T>> getPackages() {
return packages.values();
}
public Collection<? extends ClassResult<T>> getClasses() {
return classes.values();
}
public boolean isEmpty() {
return getPackages().isEmpty() && getClasses().isEmpty();
}
abstract static class AbstractResult<T> {
private final String name;
final T data;
protected AbstractResult(String name, T data) {
this.name = name;
this.data = data;
}
public String getName() {
return name;
}
public T getData() {
return data;
}
}
public static class PackageResult<T> extends AbstractResult<T> {
public PackageResult(String name, T data) {
super(name, data);
}
}
public static class ClassResult<T> extends AbstractResult<T> {
final Map<String, FieldResult<T>> fields = new TreeMap<>();
final Map<String, MethodResult<T>> methods = new TreeMap<>();
public ClassResult(String name, T data) {
super(name, data);
}
public void addField(FieldResult<T> field) {
fields.put(field.getName(), field);
}
public void addMethod(MethodResult<T> method) {
methods.put(key(method.getName(), method.getDescriptor()), method);
}
@Nullable
public FieldResult<T> getField(String name) {
return fields.get(name);
}
@Nullable
public MethodResult<T> getMethod(String name, String descriptor) {
return methods.get(key(name, descriptor));
}
public Collection<? extends FieldResult<T>> getFields() {
return fields.values();
}
public Collection<? extends MethodResult<T>> getMethods() {
return methods.values();
}
public boolean isEmpty() {
return getFields().isEmpty() && getMethods().isEmpty();
}
private String key(String name, String descriptor) {
return name + ":" + descriptor;
}
}
public static class FieldResult<T> extends AbstractResult<T> {
public FieldResult(String name, T data) {
super(name, data);
}
}
public static class MethodResult<T> extends AbstractResult<T> {
private final String descriptor;
private final Map<Byte, ParameterResult<T>> parameters = new TreeMap<>();
public MethodResult(String name, String descriptor, T data) {
super(name, data);
this.descriptor = descriptor;
}
public String getDescriptor() {
return descriptor;
}
public void addParameter(ParameterResult<T> parameter) {
parameters.put(parameter.getIndex(), parameter);
}
@Nullable
public ParameterResult<T> getParameter(byte index) {
return parameters.get(index);
}
public boolean isEmpty() {
return getParameters().isEmpty();
}
public Collection<? extends ParameterResult<T>> getParameters() {
return parameters.values();
}
}
public static class ParameterResult<T> {
private final byte index;
private final T data;
public ParameterResult(byte index, T data) {
this.index = index;
this.data = data;
}
public byte getIndex() {
return index;
}
public T getData() {
return data;
}
}
}