|
@@ -2,13 +2,15 @@ package org.openzen.zenscript.javabytecode.compiler.definitions;
|
2
|
2
|
|
3
|
3
|
import org.objectweb.asm.ClassWriter;
|
4
|
4
|
import org.objectweb.asm.Label;
|
|
5
|
+import org.objectweb.asm.Type;
|
|
6
|
+import org.openzen.zenscript.codemodel.FunctionParameter;
|
5
|
7
|
import org.openzen.zenscript.codemodel.HighLevelDefinition;
|
6
|
8
|
import org.openzen.zenscript.codemodel.member.*;
|
|
9
|
+import org.openzen.zenscript.codemodel.type.StoredType;
|
7
|
10
|
import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
|
8
|
11
|
import org.openzen.zenscript.javabytecode.compiler.CompilerUtils;
|
9
|
12
|
import org.openzen.zenscript.javabytecode.compiler.JavaStatementVisitor;
|
10
|
13
|
import org.openzen.zenscript.javabytecode.compiler.JavaWriter;
|
11
|
|
-import org.openzen.zenscript.javashared.JavaClass;
|
12
|
14
|
import org.openzen.zenscript.javashared.JavaCompiledModule;
|
13
|
15
|
import org.openzen.zenscript.javashared.JavaField;
|
14
|
16
|
import org.openzen.zenscript.javashared.JavaMethod;
|
|
@@ -17,13 +19,13 @@ public class JavaExpansionMemberVisitor implements MemberVisitor<Void> {
|
17
|
19
|
|
18
|
20
|
private final ClassWriter writer;
|
19
|
21
|
private final JavaBytecodeContext context;
|
20
|
|
- private final JavaClass toClass;
|
|
22
|
+ private final StoredType expandedClass;
|
21
|
23
|
private final HighLevelDefinition definition;
|
22
|
24
|
private final JavaCompiledModule javaModule;
|
23
|
25
|
|
24
|
|
- public JavaExpansionMemberVisitor(JavaBytecodeContext context, ClassWriter writer, JavaClass toClass, HighLevelDefinition definition) {
|
|
26
|
+ public JavaExpansionMemberVisitor(JavaBytecodeContext context, ClassWriter writer, StoredType expandedClass, HighLevelDefinition definition) {
|
25
|
27
|
this.writer = writer;
|
26
|
|
- this.toClass = toClass;
|
|
28
|
+ this.expandedClass = expandedClass;
|
27
|
29
|
this.definition = definition;
|
28
|
30
|
this.context = context;
|
29
|
31
|
javaModule = context.getJavaModule(definition.module);
|
|
@@ -58,28 +60,61 @@ public class JavaExpansionMemberVisitor implements MemberVisitor<Void> {
|
58
|
60
|
public Void visitMethod(MethodMember member) {
|
59
|
61
|
final boolean isStatic = member.isStatic();
|
60
|
62
|
final JavaMethod method = context.getJavaMethod(member);
|
61
|
|
- if(!method.compile)
|
|
63
|
+ if (!method.compile)
|
62
|
64
|
return null;
|
63
|
65
|
|
64
|
66
|
|
65
|
67
|
CompilerUtils.tagMethodParameters(context, javaModule, member.header, member.isStatic());
|
66
|
68
|
|
67
|
|
-
|
|
69
|
+ final String expandedClassDescriptor = context.getDescriptor(expandedClass);
|
68
|
70
|
final Label methodStart = new Label();
|
69
|
71
|
final Label methodEnd = new Label();
|
70
|
|
- final JavaWriter methodWriter = new JavaWriter(writer, method, definition, context.getMethodSignature(member.header), null);
|
|
72
|
+ final String methodSignature;
|
|
73
|
+
|
|
74
|
+ if (!isStatic) {
|
|
75
|
+ methodSignature = "(" + expandedClassDescriptor + context.getMethodSignature(member.header).substring(1);
|
|
76
|
+ } else {
|
|
77
|
+ methodSignature = context.getMethodSignature(member.header);
|
|
78
|
+ }
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+ final JavaWriter methodWriter = new JavaWriter(writer, true, method, definition, true, methodSignature, methodSignature, null);
|
|
82
|
+ methodWriter.label(methodStart);
|
|
83
|
+
|
|
84
|
+ if (!isStatic) {
|
|
85
|
+ methodWriter.nameVariable(0, "expandedObj", methodStart, methodEnd, Type.getType(expandedClassDescriptor));
|
|
86
|
+ for (final FunctionParameter parameter : member.header.parameters) {
|
|
87
|
+ methodWriter.nameParameter(0, parameter.name);
|
|
88
|
+ methodWriter.nameVariable(javaModule.getParameterInfo(parameter).index + 1, parameter.name, methodStart, methodEnd, context.getType(parameter.type));
|
|
89
|
+ }
|
|
90
|
+ } else {
|
|
91
|
+ for (final FunctionParameter parameter : member.header.parameters) {
|
|
92
|
+ methodWriter.nameParameter(0, parameter.name);
|
|
93
|
+ methodWriter.nameVariable(javaModule.getParameterInfo(parameter).index, parameter.name, methodStart, methodEnd, context.getType(parameter.type));
|
|
94
|
+ }
|
|
95
|
+ }
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+ {
|
|
99
|
+ final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, javaModule, methodWriter);
|
|
100
|
+ statementVisitor.start();
|
|
101
|
+ member.body.accept(statementVisitor);
|
|
102
|
+ methodWriter.label(methodEnd);
|
|
103
|
+ statementVisitor.end();
|
|
104
|
+ }
|
71
|
105
|
|
72
|
106
|
return null;
|
73
|
107
|
}
|
74
|
108
|
|
|
109
|
+
|
75
|
110
|
@Override
|
76
|
111
|
public Void visitGetter(GetterMember member) {
|
77
|
|
- throw new IllegalStateException("Cannot add getters via expansions");
|
|
112
|
+ return null;
|
78
|
113
|
}
|
79
|
114
|
|
80
|
115
|
@Override
|
81
|
116
|
public Void visitSetter(SetterMember member) {
|
82
|
|
- throw new IllegalStateException("Cannot add setters via expansions");
|
|
117
|
+ return null;
|
83
|
118
|
}
|
84
|
119
|
|
85
|
120
|
@Override
|