Skip to content

Commit 4b64cfb

Browse files
committed
Complete fix on class fields where the type is inferred from the initializer
1 parent c5e3a2f commit 4b64cfb

1 file changed

Lines changed: 23 additions & 11 deletions

File tree

CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/FieldMember.java

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
package org.openzen.zenscript.codemodel.member;
22

33
import org.openzen.zencode.shared.CodePosition;
4-
import org.openzen.zenscript.codemodel.FunctionHeader;
5-
import org.openzen.zenscript.codemodel.GenericMapper;
6-
import org.openzen.zenscript.codemodel.HighLevelDefinition;
7-
import org.openzen.zenscript.codemodel.Modifiers;
4+
import org.openzen.zenscript.codemodel.*;
85
import org.openzen.zenscript.codemodel.constant.CompileTimeConstant;
96
import org.openzen.zenscript.codemodel.expression.*;
107
import org.openzen.zenscript.codemodel.identifiers.FieldSymbol;
118
import org.openzen.zenscript.codemodel.identifiers.TypeSymbol;
129
import org.openzen.zenscript.codemodel.identifiers.instances.FieldInstance;
1310
import org.openzen.zenscript.codemodel.statement.ExpressionStatement;
1411
import org.openzen.zenscript.codemodel.statement.ReturnStatement;
12+
import org.openzen.zenscript.codemodel.statement.Statement;
1513
import org.openzen.zenscript.codemodel.type.GenericTypeID;
1614
import org.openzen.zenscript.codemodel.type.TypeID;
1715
import org.openzen.zenscript.codemodel.type.member.MemberSet;
@@ -25,6 +23,7 @@ public class FieldMember extends PropertyMember implements FieldSymbol {
2523
public final GetterMember autoGetter;
2624
public final SetterMember autoSetter;
2725
public Expression initializer;
26+
private final TypeID thisType;
2827

2928
public FieldMember(
3029
CodePosition position,
@@ -40,6 +39,7 @@ public FieldMember(
4039
this.name = name;
4140
this.autoGetterAccess = autoGetterAccess;
4241
this.autoSetterAccess = autoSetterAccess;
42+
this.thisType = thisType;
4343

4444
// ToDo: This is never used?
4545
TypeID[] parameters = null;
@@ -57,30 +57,37 @@ public FieldMember(
5757
private SetterMember constructAutoSetter(TypeID thisType, FieldInstance fieldInstance) {
5858
Modifiers autoSetterModifiers = isStatic() ? autoSetterAccess.withStatic() : autoSetterAccess;
5959
final SetterMember autoSetter = new SetterMember(position, definition, autoSetterModifiers, name, type);
60-
final GetFunctionParameterExpression setValue = new GetFunctionParameterExpression(position, autoSetter.parameter);
60+
autoSetter.setBody(constructAutoSetterBody(thisType, fieldInstance, autoSetter.parameter));
61+
return autoSetter;
62+
}
63+
64+
private Statement constructAutoSetterBody(TypeID thisType, FieldInstance fieldInstance, FunctionParameter parameter) {
65+
final GetFunctionParameterExpression setValue = new GetFunctionParameterExpression(position, parameter);
6166
final Expression setFieldExpression;
6267
if (isStatic()) {
6368
setFieldExpression = new SetStaticFieldExpression(position, fieldInstance, setValue);
6469
} else {
6570
setFieldExpression = new SetFieldExpression(position, new ThisExpression(position, thisType), fieldInstance, setValue);
6671
}
67-
autoSetter.setBody(new ExpressionStatement(position, setFieldExpression));
68-
return autoSetter;
72+
return new ExpressionStatement(position, setFieldExpression);
6973
}
7074

7175
private GetterMember constructAutoGetter(TypeID thisType, FieldInstance fieldInstance) {
7276
Modifiers autoGetterModifiers = isStatic() ? autoGetterAccess.withStatic() : autoGetterAccess;
7377
final GetterMember autoGetter = new GetterMember(position, definition, autoGetterModifiers, name, type);
78+
autoGetter.setBody(constructAutoGetterBody(thisType, fieldInstance));
79+
return autoGetter;
80+
}
7481

82+
private Statement constructAutoGetterBody(TypeID thisType, FieldInstance fieldInstance) {
7583
final Expression getFieldExpression;
7684
if(isStatic()) {
7785
getFieldExpression = new GetStaticFieldExpression(position, fieldInstance);
7886
} else {
7987
getFieldExpression = new GetFieldExpression(position, new ThisExpression(position, thisType), fieldInstance);
8088
}
8189

82-
autoGetter.setBody(new ReturnStatement(position, getFieldExpression));
83-
return autoGetter;
90+
return new ReturnStatement(position, getFieldExpression);
8491
}
8592

8693
public boolean hasAutoGetter() {
@@ -156,10 +163,15 @@ public TypeID getType() {
156163
public void setType(TypeID type) {
157164
super.setType(type);
158165

159-
if (autoGetter != null)
166+
final FieldInstance fieldInstance = new FieldInstance(this, type);
167+
if (autoGetter != null) {
160168
this.autoGetter.setType(type);
161-
if (autoSetter != null)
169+
this.autoGetter.setBody(constructAutoGetterBody(thisType, fieldInstance));
170+
}
171+
if (autoSetter != null) {
162172
this.autoSetter.setType(type);
173+
this.autoSetter.setBody(constructAutoSetterBody(thisType, fieldInstance, autoSetter.parameter));
174+
}
163175
}
164176

165177
@Override

0 commit comments

Comments
 (0)