|
@@ -5,8 +5,10 @@ import org.objectweb.asm.Opcodes;
|
5
|
5
|
import org.objectweb.asm.Type;
|
6
|
6
|
import org.openzen.zenscript.codemodel.Modifiers;
|
7
|
7
|
import org.openzen.zenscript.codemodel.definition.*;
|
|
8
|
+import org.openzen.zenscript.codemodel.generic.TypeParameter;
|
8
|
9
|
import org.openzen.zenscript.codemodel.member.IDefinitionMember;
|
9
|
10
|
import org.openzen.zenscript.codemodel.type.BasicTypeID;
|
|
11
|
+import org.openzen.zenscript.codemodel.type.GenericTypeID;
|
10
|
12
|
import org.openzen.zenscript.codemodel.type.ITypeID;
|
11
|
13
|
import org.openzen.zenscript.javabytecode.JavaMethodInfo;
|
12
|
14
|
import org.openzen.zenscript.javabytecode.JavaModule;
|
|
@@ -187,7 +189,11 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
|
187
|
189
|
final JavaClass toClass = new JavaClass("", variantName, JavaClass.Kind.CLASS);
|
188
|
190
|
final JavaClassWriter writer = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
|
189
|
191
|
|
190
|
|
- writer.visit(Opcodes.V1_8, Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, variantName, null, "java/lang/Object", null);
|
|
192
|
+
|
|
193
|
+ final String ss = "<" + JavaTypeGenericVisitor.getGenericSignature(variant.genericParameters) + ">Ljava/lang/Object;";
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+ writer.visit(Opcodes.V1_8, Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, variantName, ss, "java/lang/Object", null);
|
191
|
197
|
writer.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT, "getDenominator", "()I", null, null).visitEnd();
|
192
|
198
|
|
193
|
199
|
|
|
@@ -210,15 +216,30 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
|
210
|
216
|
final String signature;
|
211
|
217
|
{
|
212
|
218
|
StringBuilder builder = new StringBuilder();
|
213
|
|
- for (int i = 0; i < option.types.length; ++i) {
|
214
|
|
- builder.append("<T").append(i).append(":");
|
215
|
|
- builder.append(option.types[i].accept(JavaTypeVisitor.INSTANCE).getDescriptor());
|
|
219
|
+ builder.append("<");
|
|
220
|
+ for (final ITypeID type : option.types) {
|
|
221
|
+ builder.append(JavaTypeGenericVisitor.getSignatureWithBound(type));
|
216
|
222
|
}
|
217
|
223
|
builder.append(">");
|
218
|
|
- builder.append("L").append(variantName).append(";");
|
|
224
|
+ builder.append("L").append(variantName).append("<");
|
|
225
|
+
|
|
226
|
+ for (final TypeParameter genericParameter : variant.genericParameters) {
|
|
227
|
+ boolean t = true;
|
|
228
|
+ for (final ITypeID type : option.types)
|
|
229
|
+ if (type instanceof GenericTypeID) {
|
|
230
|
+ final GenericTypeID genericTypeID = (GenericTypeID) type;
|
|
231
|
+ if (genericParameter == genericTypeID.parameter) {
|
|
232
|
+ builder.append("T").append(genericParameter.name).append(";");
|
|
233
|
+ t = false;
|
|
234
|
+ }
|
|
235
|
+ }
|
|
236
|
+ if (t)
|
|
237
|
+ builder.append(JavaTypeGenericVisitor.getGenericBounds(genericParameter.bounds));
|
|
238
|
+
|
|
239
|
+ }
|
219
|
240
|
|
220
|
241
|
|
221
|
|
- signature = builder.toString();
|
|
242
|
+ signature = builder.append(">;").toString();
|
222
|
243
|
}
|
223
|
244
|
|
224
|
245
|
optionWriter.visit(Opcodes.V1_8, Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, optionClassName, signature, variantName, null);
|
|
@@ -226,18 +247,21 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
|
226
|
247
|
|
227
|
248
|
|
228
|
249
|
final StringBuilder optionInitDescBuilder = new StringBuilder("(");
|
|
250
|
+ final StringBuilder optionInitSignatureBuilder = new StringBuilder("(");
|
229
|
251
|
|
230
|
252
|
ITypeID[] types = option.types;
|
231
|
253
|
for (int i = 0; i < types.length; ++i) {
|
232
|
254
|
final Type type = types[i].accept(JavaTypeVisitor.INSTANCE);
|
233
|
255
|
final String internalName = type.getDescriptor();
|
234
|
256
|
optionInitDescBuilder.append(internalName);
|
235
|
|
- optionWriter.visitField(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, "Field" + i, internalName, "TT" + i + ";", null).visitEnd();
|
|
257
|
+ optionInitSignatureBuilder.append("T").append(((GenericTypeID) types[i]).parameter.name).append(";");
|
|
258
|
+ optionWriter.visitField(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, "Field" + i, internalName, "T" + ((GenericTypeID) types[i]).parameter.name + ";", null).visitEnd();
|
236
|
259
|
}
|
237
|
260
|
optionInitDescBuilder.append(")V");
|
|
261
|
+ optionInitSignatureBuilder.append(")V");
|
238
|
262
|
|
239
|
263
|
|
240
|
|
- final JavaWriter initWriter = new JavaWriter(optionWriter, new JavaMethodInfo(optionClass, "<init>", optionInitDescBuilder.toString(), Opcodes.ACC_PUBLIC), variant, optionInitDescBuilder.toString(), null);
|
|
264
|
+ final JavaWriter initWriter = new JavaWriter(optionWriter, new JavaMethodInfo(optionClass, "<init>", optionInitDescBuilder.toString(), Opcodes.ACC_PUBLIC), variant, optionInitSignatureBuilder.toString(), null);
|
241
|
265
|
initWriter.start();
|
242
|
266
|
initWriter.loadObject(0);
|
243
|
267
|
initWriter.dup();
|