Skip to content

Commit 623aa90

Browse files
committed
Add single attribute annotation signature subtypes
1 parent f1f6a82 commit 623aa90

File tree

5 files changed

+211
-27
lines changed

5 files changed

+211
-27
lines changed

impl-util-jdk8/src/main/saker/java/compiler/util8/impl/model/IncrementalElementsTypes8.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -851,12 +851,19 @@ private static ParameterizedTypeSignature typeElementToTypeReference(TypeElement
851851
}
852852

853853
private static AnnotationSignature annotationMirrorToSignature(AnnotationMirror a, ParserCache cache) {
854-
LinkedHashMap<String, AnnotationSignature.Value> vals = new LinkedHashMap<>();
855-
for (Entry<? extends ExecutableElement, ? extends AnnotationValue> entry : a.getElementValues().entrySet()) {
856-
ExecutableElement method = entry.getKey();
857-
AnnotationValue value = entry.getValue();
858-
vals.put(method.getSimpleName().toString(),
859-
AnnotationValueToSignatureConverterVisitor.convert(value, cache));
854+
Map<? extends ExecutableElement, ? extends AnnotationValue> elementvalues = a.getElementValues();
855+
856+
Map<String, AnnotationSignature.Value> vals;
857+
if (ObjectUtils.isNullOrEmpty(elementvalues)) {
858+
vals = Collections.emptyMap();
859+
} else {
860+
vals = new LinkedHashMap<>();
861+
for (Entry<? extends ExecutableElement, ? extends AnnotationValue> entry : elementvalues.entrySet()) {
862+
ExecutableElement method = entry.getKey();
863+
AnnotationValue value = entry.getValue();
864+
vals.put(method.getSimpleName().toString(),
865+
AnnotationValueToSignatureConverterVisitor.convert(value, cache));
866+
}
860867
}
861868
DeclaredType annottype = a.getAnnotationType();
862869
//XXX should we create a dynamically unresolved declared type class?

impl/src/main/saker/java/compiler/impl/compile/signature/impl/AnnotationSignatureImpl.java

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.Iterator;
2323
import java.util.LinkedHashMap;
2424
import java.util.Map;
25+
import java.util.Objects;
2526
import java.util.Map.Entry;
2627

2728
import saker.build.thirdparty.saker.util.ObjectUtils;
@@ -48,6 +49,15 @@ public static AnnotationSignature create(TypeSignature annotationType, Map<Strin
4849
if (ObjectUtils.isNullOrEmpty(values)) {
4950
return SimpleAnnotationSignature.create(annotationType);
5051
}
52+
if (values.size() == 1) {
53+
Entry<String, Value> entry = values.entrySet().iterator().next();
54+
String name = entry.getKey();
55+
Value value = entry.getValue();
56+
if ("value".equals(name)) {
57+
return new ValueAttributeSimpleAnnotationSignature(annotationType, value);
58+
}
59+
return new SingleAttributeAnnotationSignature(annotationType, name, value);
60+
}
5161
return new AnnotationSignatureImpl(annotationType, values);
5262
}
5363

@@ -71,27 +81,28 @@ public String toString() {
7181
StringBuilder sb = new StringBuilder();
7282
sb.append("@");
7383
sb.append(annotationType);
74-
sb.append("(");
75-
for (Iterator<Entry<String, Value>> it = values.entrySet().iterator(); it.hasNext();) {
76-
Entry<String, Value> entry = it.next();
77-
sb.append(entry.getKey());
78-
sb.append(" = ");
79-
sb.append(entry.getValue());
80-
if (it.hasNext()) {
81-
sb.append(", ");
84+
Iterator<Entry<String, Value>> it = values.entrySet().iterator();
85+
if (it.hasNext()) {
86+
sb.append("(");
87+
while (true) {
88+
Entry<String, Value> entry = it.next();
89+
sb.append(entry.getKey());
90+
sb.append(" = ");
91+
sb.append(entry.getValue());
92+
if (it.hasNext()) {
93+
sb.append(", ");
94+
} else {
95+
break;
96+
}
8297
}
98+
sb.append(")");
8399
}
84-
sb.append(")");
85100
return sb.toString();
86101
}
87102

88103
@Override
89104
public int hashCode() {
90-
final int prime = 31;
91-
int result = 1;
92-
result = prime * result + ((annotationType == null) ? 0 : annotationType.hashCode());
93-
result = prime * result + ((values == null) ? 0 : values.hashCode());
94-
return result;
105+
return Objects.hashCode(annotationType) * 31 + Objects.hashCode(values);
95106
}
96107

97108
@Override

impl/src/main/saker/java/compiler/impl/compile/signature/impl/SimpleAnnotationSignature.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,14 @@
2222
import java.util.Collections;
2323
import java.util.HashMap;
2424
import java.util.Map;
25+
import java.util.Objects;
2526

2627
import saker.java.compiler.impl.compile.signature.type.impl.SimpleCanonicalTypeSignature;
2728
import saker.java.compiler.impl.compile.signature.type.impl.SimpleUnresolvedTypeSignature;
2829
import saker.java.compiler.impl.signature.element.AnnotationSignature;
2930
import saker.java.compiler.impl.signature.type.TypeSignature;
3031

31-
public final class SimpleAnnotationSignature implements AnnotationSignature, Externalizable {
32+
public class SimpleAnnotationSignature implements AnnotationSignature, Externalizable {
3233
private static final long serialVersionUID = 1L;
3334

3435
public static final SimpleAnnotationSignature INSTANCE_OVERRIDE = new SimpleAnnotationSignature(
@@ -52,12 +53,14 @@ private static void initSimpleCache(SimpleAnnotationSignature sig) {
5253
SIMPLE_CACHE.put(sig.getAnnotationType(), sig);
5354
}
5455

55-
private TypeSignature annotationType;
56+
protected TypeSignature annotationType;
57+
//Note: subclasses may have their own serialization functions,
58+
// so take care when adding new fields
5659

5760
public SimpleAnnotationSignature() {
5861
}
5962

60-
private SimpleAnnotationSignature(TypeSignature annotationType) {
63+
protected SimpleAnnotationSignature(TypeSignature annotationType) {
6164
this.annotationType = annotationType;
6265
}
6366

@@ -100,10 +103,7 @@ public String toString() {
100103

101104
@Override
102105
public int hashCode() {
103-
final int prime = 31;
104-
int result = 1;
105-
result = prime * result + ((annotationType == null) ? 0 : annotationType.hashCode());
106-
return result;
106+
return Objects.hashCode(annotationType);
107107
}
108108

109109
@Override
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package saker.java.compiler.impl.compile.signature.impl;
2+
3+
import java.io.Externalizable;
4+
import java.io.IOException;
5+
import java.io.ObjectInput;
6+
import java.io.ObjectOutput;
7+
import java.util.Map;
8+
import java.util.Objects;
9+
10+
import saker.build.thirdparty.saker.util.ImmutableUtils;
11+
import saker.java.compiler.impl.signature.element.AnnotationSignature;
12+
import saker.java.compiler.impl.signature.type.TypeSignature;
13+
14+
/**
15+
* {@link AnnotationSignature} that contains a single name-value pair.
16+
*/
17+
public final class SingleAttributeAnnotationSignature extends ValueAttributeSimpleAnnotationSignature {
18+
private static final long serialVersionUID = 1L;
19+
20+
protected String name;
21+
22+
/**
23+
* For {@link Externalizable}.
24+
*/
25+
public SingleAttributeAnnotationSignature() {
26+
}
27+
28+
public SingleAttributeAnnotationSignature(TypeSignature annotationType, String name, Value value) {
29+
super(annotationType, value);
30+
this.name = name;
31+
}
32+
33+
@Override
34+
public Map<String, ? extends Value> getValues() {
35+
return ImmutableUtils.singletonMap(name, value);
36+
}
37+
38+
@Override
39+
public void writeExternal(ObjectOutput out) throws IOException {
40+
super.writeExternal(out);
41+
out.writeUTF(name);
42+
}
43+
44+
@Override
45+
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
46+
super.readExternal(in);
47+
name = in.readUTF();
48+
}
49+
50+
@Override
51+
public int hashCode() {
52+
return super.hashCode() * 31 + Objects.hashCode(name);
53+
}
54+
55+
@Override
56+
public boolean equals(Object obj) {
57+
if (this == obj)
58+
return true;
59+
if (!super.equals(obj))
60+
return false;
61+
if (getClass() != obj.getClass())
62+
return false;
63+
SingleAttributeAnnotationSignature other = (SingleAttributeAnnotationSignature) obj;
64+
if (name == null) {
65+
if (other.name != null)
66+
return false;
67+
} else if (!name.equals(other.name))
68+
return false;
69+
return true;
70+
}
71+
72+
@Override
73+
public String toString() {
74+
StringBuilder sb = new StringBuilder();
75+
sb.append("@");
76+
sb.append(annotationType);
77+
sb.append("(");
78+
sb.append(name);
79+
sb.append(" = ");
80+
sb.append(value);
81+
sb.append(")");
82+
return sb.toString();
83+
}
84+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package saker.java.compiler.impl.compile.signature.impl;
2+
3+
import java.io.Externalizable;
4+
import java.io.IOException;
5+
import java.io.ObjectInput;
6+
import java.io.ObjectOutput;
7+
import java.util.Map;
8+
import java.util.Objects;
9+
10+
import saker.build.thirdparty.saker.util.ImmutableUtils;
11+
import saker.java.compiler.impl.signature.element.AnnotationSignature;
12+
import saker.java.compiler.impl.signature.type.TypeSignature;
13+
14+
/**
15+
* {@link AnnotationSignature} that contains a single attribute with the name <code>"value"</code>
16+
*/
17+
public class ValueAttributeSimpleAnnotationSignature extends SimpleAnnotationSignature {
18+
private static final long serialVersionUID = 1L;
19+
20+
protected AnnotationSignature.Value value;
21+
22+
/**
23+
* For {@link Externalizable}.
24+
*/
25+
public ValueAttributeSimpleAnnotationSignature() {
26+
}
27+
28+
public ValueAttributeSimpleAnnotationSignature(TypeSignature annotationType, Value value) {
29+
super(annotationType);
30+
this.value = value;
31+
}
32+
33+
@Override
34+
public Map<String, ? extends Value> getValues() {
35+
return ImmutableUtils.singletonMap("value", value);
36+
}
37+
38+
@Override
39+
public void writeExternal(ObjectOutput out) throws IOException {
40+
super.writeExternal(out);
41+
out.writeObject(value);
42+
}
43+
44+
@Override
45+
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
46+
super.readExternal(in);
47+
value = (Value) in.readObject();
48+
}
49+
50+
@Override
51+
public int hashCode() {
52+
return super.hashCode() * 31 + Objects.hashCode(value);
53+
}
54+
55+
@Override
56+
public boolean equals(Object obj) {
57+
if (this == obj)
58+
return true;
59+
if (!super.equals(obj))
60+
return false;
61+
if (getClass() != obj.getClass())
62+
return false;
63+
ValueAttributeSimpleAnnotationSignature other = (ValueAttributeSimpleAnnotationSignature) obj;
64+
if (value == null) {
65+
if (other.value != null)
66+
return false;
67+
} else if (!value.equals(other.value))
68+
return false;
69+
return true;
70+
}
71+
72+
@Override
73+
public String toString() {
74+
StringBuilder sb = new StringBuilder();
75+
sb.append("@");
76+
sb.append(annotationType);
77+
sb.append("(");
78+
sb.append(value);
79+
sb.append(")");
80+
return sb.toString();
81+
}
82+
}

0 commit comments

Comments
 (0)