8000 Add VarArgFullMethodSignature, more serialization tweaks · sakerbuild/saker.java.compiler@f3bfd99 · GitHub
[go: up one dir, main page]

Skip to content

Commit f3bfd99

Browse files
committed
Add VarArgFullMethodSignature, more serialization tweaks
1 parent 8cc5ee8 commit f3bfd99

File tree

6 files changed

+132
-64
lines changed

6 files changed

+132
-64
lines changed

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

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.io.IOException;
2020
import java.io.ObjectInput;
2121
import java.io.ObjectOutput;
22+
import java.util.ArrayList;
2223
import java.util.Collection;
2324
import java.util.Collections;
2425
import java.util.List;
@@ -29,7 +30,6 @@
2930

3031
import saker.build.thirdparty.saker.util.ObjectUtils;
3132
import saker.build.thirdparty.saker.util.StringUtils;
32-
import saker.build.thirdparty.saker.util.io.SerialUtils;
3333
import saker.java.compiler.impl.JavaTaskUtils;
3434
import saker.java.compiler.impl.JavaUtil;
3535
import saker.java.compiler.impl.compat.ElementKindCompatUtils;
@@ -43,6 +43,7 @@
4343
import saker.java.compiler.impl.signature.type.TypeParameterSignature;
4444
import saker.java.compiler.impl.signature.type.TypeSignature;
4545
import saker.java.compiler.impl.util.ImmutableModifierSet;
46+
import saker.java.compiler.impl.util.JavaSerialUtils;
4647
import saker.java.compiler.jdk.impl.incremental.model.IncrementalElementsTypes;
4748

4849
public abstract class ClassSignatureBase implements ClassSignature, Externalizable {
@@ -136,18 +137,19 @@ public PermittedSubclassesList getPermittedSubclasses() {
136137

137138
@Override
138139
public void writeExternal(ObjectOutput out) throws IOException {
140+
JavaSerialUtils.writeOpenEndedList(members, out);
141+
out.writeObject(name);
139142
out.writeObject(packageName);
140-
out.writeUTF(name);
141143
ImmutableModifierSet.writeExternalFlag(out, modifierFlags);
142-
SerialUtils.writeExternalCollection(out, members);
143144
}
144145

145146
@Override
146147
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
147-
packageName = (String) in.readObject();
148-
name = in.readUTF();
149-
modifierFlags = ImmutableModifierSet.readExternalFlag(in);
150-
members = SerialUtils.readExternalImmutableList(in);
148+
ArrayList<ClassMemberSignature> members = new ArrayList<>();
149+
this.members = members;
150+
this.name = (String) JavaSerialUtils.readOpenEndedList(ClassMemberSignature.class, members, in);
151+
this.packageName = (String) in.readObject();
152+
this.modifierFlags = ImmutableModifierSet.readExternalFlag(in);
151153
}
152154

153155
@Override

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

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,25 +19,24 @@
1919
import java.io.IOException;
2020
import java.io.ObjectInput;
2121
import java.io.ObjectOutput;
22-
import java.util.Collection;
23-
import java.util.Collections;
22+
import java.util.ArrayList;
2423
import java.util.List;
2524
import java.util.Set;
2625

2726
import javax.lang.model.element.Modifier;
2827
import javax.lang.model.element.NestingKind;
2928

30-
import saker.build.thirdparty.saker.util.io.SerialUtils;
3129
import saker.java.compiler.impl.signature.element.AnnotationSignature;
3230
import saker.java.compiler.impl.signature.element.ClassMemberSignature;
3331
import saker.java.compiler.impl.signature.element.ClassSignature;
32+
import saker.java.compiler.impl.util.JavaSerialUtils;
3433

3534
public class ExtendedAnnotationInterfaceSignature extends SimpleAnnotationInterfaceSignature {
3635
private static final long serialVersionUID = 1L;
3736

3837
private transient ClassSignature enclosingClass;
3938

40-
private List<AnnotationSignature> annotations = Collections.emptyList();
39+
private List<AnnotationSignature> annotations;
4140
private String docComment;
4241

4342
/**
@@ -78,17 +77,28 @@ public List<? extends AnnotationSignature> getAnnotations() {
7877
@Override
7978
public void writeExternal(ObjectOutput out) throws IOException {
8079
super.writeExternal(out);
81-
out.writeObject(enclosingClass);
82-
SerialUtils.writeExternalCollection(out, annotations);
80+
81+
JavaSerialUtils.writeOpenEndedList(annotations, out);
82+
if (enclosingClass != null) {
83+
//optionally written
84+
out.writeObject(enclosingClass);
85+
}
8386
out.writeObject(docComment);
8487
}
8588

8689
@Override
8790
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
8891
super.readExternal(in);
89-
enclosingClass = (ClassSignature) in.readObject();
90-
annotations = SerialUtils.readExternalImmutableList(in);
91-
docComment = (String) in.readObject();
92+
93+
ArrayList<AnnotationSignature> annotations = new ArrayList<>();
94+
this.annotations = annotations;
95+
Object next = JavaSerialUtils.readOpenEndedList(AnnotationSignature.class, annotations, in);
96+
if (next instanceof ClassSignature) {
97+
//optionally written
98+
this.enclosingClass = (ClassSignature) next;
99+
next = in.readObject();
100+
}
101+
this.docComment = (String) next;
92102
}
93103

94104
@Override

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

Lines changed: 55 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import java.io.IOException;
2020
import java.io.ObjectInput;
2121
import java.io.ObjectOutput;
22-
import java.util.Collection;
22+
import java.util.ArrayList;
2323
import java.util.Collections;
2424
import java.util.List;
2525
import java.util.Set;
@@ -29,27 +29,27 @@
2929

3030
import saker.build.thirdparty.saker.util.ObjectUtils;
3131
import saker.build.thirdparty.saker.util.StringUtils;
32-
import saker.build.thirdparty.saker.util.io.SerialUtils;
3332
import saker.java.compiler.impl.compat.ElementKindCompatUtils;
3433
import saker.java.compiler.impl.compile.signature.type.impl.NoTypeSignatureImpl;
3534
import saker.java.compiler.impl.signature.element.AnnotationSignature;
3635
import saker.java.compiler.impl.signature.element.MethodParameterSignature;
3736
import saker.java.compiler.impl.signature.element.MethodSignature;
3837
import saker.java.compiler.impl.signature.type.TypeParameterSignature;
3938
import saker.java.compiler.impl.signature.type.TypeSignature;
39+
import saker.java.compiler.impl.util.ImmutableModifierSet;
40+
import saker.java.compiler.impl.util.JavaSerialUtils;
4041

41-
public final class FullMethodSignature extends MethodSignatureBase {
42+
public class FullMethodSignature extends MethodSignatureBase {
4243
private static final long serialVersionUID = 1L;
4344

4445
protected byte elementKindIndex;
4546
protected TypeSignature returnType;
4647
protected String name;
47-
protected List<TypeSignature> throwsTypes = Collections.emptyList();
48+
protected List<TypeSignature> throwsTypes;
4849

49-
protected List<TypeParameterSignature> typeParameters = Collections.emptyList();
50+
protected List<TypeParameterSignature> typeParameters;
5051

5152
protected TypeSignature receiverParameter;
52-
protected boolean varArg;
5353
protected String docComment;
5454

5555
/**
@@ -60,9 +60,8 @@ public FullMethodSignature() {
6060

6161
public static MethodSignature create(String name, Set<Modifier> modifiers,
6262
List<MethodParameterSignature> parameters, List<TypeSignature> throwsTypes, TypeSignature returnType,
63-
AnnotationSignature.Value defaultValue, ElementKind methodKind,
64-
List<TypeParameterSignature> typeParameters, TypeSignature receiverParameter, boolean varArg,
65-
String docComment) {
63+
AnnotationSignature.Value defaultValue, ElementKind methodKind, List<TypeParameterSignature> typeParameters,
64+
TypeSignature receiverParameter, boolean varArg, String docComment) {
6665
if (defaultValue != null) {
6766
if (docComment == null) {
6867
return new AnnotationAttributeMethodSignature(returnType, name, defaultValue);
@@ -98,17 +97,21 @@ public static MethodSignature create(String name, Set<Modifier> modifiers,
9897
throwsTypes);
9998
}
10099
}
100+
if (varArg) {
101+
return new VarArgFullMethodSignature(modifiers, parameters, returnType, name, typeParameters, throwsTypes,
102+
methodKind, receiverParameter, docComment);
103+
}
101104
return new FullMethodSignature(modifiers, parameters, returnType, name, typeParameters, throwsTypes, methodKind,
102-
receiverParameter, varArg, docComment);
105+
receiverParameter, docComment);
103106
}
104107

105108
public static MethodSignature createDefaultConstructor(Set<Modifier> modifiers) {
106109
return SimpleNoArgConstructor.create(modifiers);
107110
}
108111

109-
private FullMethodSignature(Set<Modifier> modifiers, List<MethodParameterSignature> parameters,
112+
protected FullMethodSignature(Set<Modifier> modifiers, List<MethodParameterSignature> parameters,
110113
TypeSignature returnType, String name, List<TypeParameterSignature> typeParameters,
111-
List<TypeSignature> throwsTypes, ElementKind methodKind, TypeSignature receiverParameter, boolean varArg,
114+
List<TypeSignature> throwsTypes, ElementKind methodKind, TypeSignature receiverParameter,
112115
String docComment) {
113116
super(modifiers, parameters);
114117
this.name = name;
@@ -117,7 +120,6 @@ private FullMethodSignature(Set<Modifier> modifiers, List<MethodParameterSignatu
117120
this.elementKindIndex = ElementKindCompatUtils.getElementKindIndex(methodKind);
118121
this.typeParameters = typeParameters == null ? Collections.emptyList() : typeParameters;
119122
this.receiverParameter = receiverParameter;
120-
this. F438 varArg = varArg;
121123
this.docComment = docComment;
122124
}
123125

@@ -178,45 +180,56 @@ public TypeSignature getReceiverParameter() {
178180
return receiverParameter;
179181
}
180182

181-
@Override
182-
public boolean isVarArg() {
183-
return varArg;
184-
}
185-
186183
@Override
187184
public void writeExternal(ObjectOutput out) throws IOException {
188-
super.writeExternal(out);
189-
190-
SerialUtils.writeExternalCollection(out, throwsTypes);
191-
SerialUtils.writeExternalCollection(out, typeParameters);
192-
193-
out.writeUTF(name);
185+
ImmutableModifierSet.writeExternalFlag(out, modifierFlags);
186+
JavaSerialUtils.writeOpenEndedList(parameters, out);
187+
JavaSerialUtils.writeOpenEndedList(throwsTypes, out);
188+
JavaSerialUtils.writeOpenEndedList(typeParameters, out);
189+
190+
if (receiverParameter != null) {
191+
//optionally written, as rarely used
192+
out.writeObject(receiverParameter);
193+
}
194+
out.writeObject(name);
195+
if (docComment != null) {
196+
//optionally written
197+
out.writeObject(docComment);
198+
}
194199
out.writeObject(returnType);
195200

196201
out.writeByte(elementKindIndex);
197-
198-
out.writeObject(receiverParameter);
199-
200-
out.writeBoolean(varArg);
201-
out.writeObject(docComment);
202202
}
203203

204204
@Override
205205
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
206-
super.readExternal(in);
207-
208-
throwsTypes = SerialUtils.readExternalImmutableList(in);
209-
typeParameters = SerialUtils.readExternalImmutableList(in);
210-
211-
name = in.readUTF();
212-
returnType = (TypeSignature) in.readObject();
213-
214-
elementKindIndex = in.readByte();
215-
216-
receiverParameter = (TypeSignature) in.readObject();
206+
this.modifierFlags = ImmutableModifierSet.readExternalFlag(in);
207+
208+
ArrayList<MethodParameterSignature> parameters = new ArrayList<>();
209+
ArrayList<TypeSignature> throwstypes = new ArrayList<>();
210+
ArrayList<TypeParameterSignature> typeparams = new ArrayList<>();
211+
this.parameters = parameters;
212+
this.throwsTypes = throwstypes;
213+
this.typeParameters = typeparams;
214+
215+
Object next = JavaSerialUtils.readOpenEndedList(MethodParameterSignature.class, parameters, in);
216+
next = JavaSerialUtils.readOpenEndedList(next, TypeSignature.class, throwstypes, in);
217+
next = JavaSerialUtils.readOpenEndedList(next, TypeParameterSignature.class, typeparams, in);
218+
if (next instanceof TypeSignature) {
219+
//receiver parameter is optionally present
220+
this.receiverParameter = (TypeSignature) next;
221+
next = in.readObject();
222+
}
223+
this.name = (String) next;
224+
next = in.readObject();
225+
if (next instanceof String) {
226+
//optional
227+
this.docComment = (String) next;
228+
next = in.readObject();
229+
}
230+
this.returnType = (TypeSignature) next;
217231

218-
varArg = in.readBoolean();
219-
docComment = (String) in.readObject();
232+
this.elementKindIndex = in.readByte();
220233
}
221234

222235
@Override
@@ -260,8 +273,6 @@ public boolean equals(Object obj) {
260273
return false;
261274
} else if (!typeParameters.equals(other.typeParameters))
262275
return false;
263-
if (varArg != other.varArg)
264-
return false;
265276
return true;
266277
}
267278

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package saker.java.compiler.impl.compile.signature.impl;
2+
3+
import java.io.Externalizable;
4+
import java.util.List;
5+
import java.util.Set;
6+
7+
import javax.lang.model.element.ElementKind;
8+
import javax.lang.model.element.Modifier;
9+
10+
import saker.java.compiler.impl.signature.element.MethodParameterSignature;
11+
import saker.java.compiler.impl.signature.type.TypeParameterSignature;
12+
import saker.java.compiler.impl.signature.type.TypeSignature;
13+
14+
public final class VarArgFullMethodSignature extends FullMethodSignature {
15+
private static final long serialVersionUID = 1L;
16+
17+
/**
18+
* For {@link Externalizable}.
19+
*/
20+
public VarArgFullMethodSignature() {
21+
}
22+
23+
public VarArgFullMethodSignature(Set<Modifier> modifiers, List<MethodParameterSignature> parameters,
24+
TypeSignature returnType, String name, List<TypeParameterSignature> typeParameters,
25+
List<TypeSignature> throwsTypes, ElementKind methodKind, TypeSignature receiverParameter,
26+
String docComment) {
27+
super(modifiers, parameters, returnType, name, typeParameters, throwsTypes, methodKind, receiverParameter,
28+
docComment);
29+
}
30+
31+
@Override
32+
public boolean isVarArg() {
33+
return true;
34+
}
35+
36+
}

impl/src/main/saker/java/compiler/impl/compile/signature/type/impl/UnresolvedTypeSignatureImpl.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,11 @@ public List<? extends TypeSignature> getTypeParameters() {
105105
public void writeExternal(ObjectOutput out) throws IOException {
106106
JavaSerialUtils.writeOpenEndedList(annotations, out);
107107
JavaSerialUtils.writeOpenEndedList(typeParameters, out);
108+
if (enclosing != null) {
109+
//optionally written
110+
out.writeObject(enclosing);
111+
}
108112
out.writeObject(qualifiedName);
109-
out.writeObject(enclosing);
110113
}
111114

112115
@Override
@@ -117,8 +120,13 @@ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundExcept
117120
this.typeParameters = typeparams;
118121

119122
Object next = JavaSerialUtils.readOpenEndedList(AnnotationSignature.class, annotations, in);
120-
this.qualifiedName = (String) JavaSerialUtils.readOpenEndedList(next, TypeSignature.class, typeparams, in);
121-
this.enclosing = (ParameterizedTypeSignature) in.readObject();
123+
next = JavaSerialUtils.readOpenEndedList(next, TypeSignature.class, typeparams, in);
124+
if (next instanceof ParameterizedTypeSignature) {
125+
//optionally written, check based on type
126+
this.enclosing = (ParameterizedTypeSignature) next;
127+
next = in.readObject();
128+
}
129+
this.qualifiedName = (String) next;
122130
}
123131

124132
@Override

impl/src/main/saker/java/compiler/impl/util/JavaSerialUtils.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ private JavaSerialUtils() {
1717
* The elements of the list is simply written to the output sequentially.
1818
* <p>
1919
* Note that for these serialization methods to work, there must be an additional object written to the output after
20-
* this call.
20+
* this call. This additional object must not be an instance of the type that is used during reading for
21+
* <code>instanceof</code> checks.
2122
*
2223
* @param objects
2324
* The objects.

0 commit comments

Comments
 (0)
0