mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 08:44:20 +03:00
Авто вызов toString() (#9)
* Added auto toString() * Update ClassInstanceValue.java
This commit is contained in:
parent
493a3995a9
commit
d18a14b2ac
@ -8,6 +8,7 @@ public class ClassInstanceValue implements Value {
|
|||||||
private final String className;
|
private final String className;
|
||||||
private final MapValue thisMap;
|
private final MapValue thisMap;
|
||||||
private ClassMethod constructor;
|
private ClassMethod constructor;
|
||||||
|
private UserDefinedFunction toString;
|
||||||
|
|
||||||
public ClassInstanceValue(String name) {
|
public ClassInstanceValue(String name) {
|
||||||
this.className = name;
|
this.className = name;
|
||||||
@ -17,28 +18,32 @@ public class ClassInstanceValue implements Value {
|
|||||||
public MapValue getThisMap() {
|
public MapValue getThisMap() {
|
||||||
return thisMap;
|
return thisMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getClassName() {
|
public String getClassName() {
|
||||||
return className;
|
return className;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addField(String name, Value value) {
|
public void addField(String name, Value value) {
|
||||||
thisMap.set(name, value);
|
thisMap.set(name, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addMethod(String name, ClassMethod method) {
|
public void addMethod(String name, ClassMethod method) {
|
||||||
|
if (name.equals("toString")) {
|
||||||
|
toString = method;
|
||||||
|
}
|
||||||
thisMap.set(name, method);
|
thisMap.set(name, method);
|
||||||
if (name.equals(className)) {
|
if (name.equals(className)) {
|
||||||
constructor = method;
|
constructor = method;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void callConstructor(Value[] args) {
|
public void callConstructor(Value[] args) {
|
||||||
if (constructor != null) {
|
if (constructor != null) {
|
||||||
constructor.execute(args);
|
constructor.execute(args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Value access(Value value) {
|
public Value access(Value value) {
|
||||||
return thisMap.get(value);
|
return thisMap.get(value);
|
||||||
}
|
}
|
||||||
@ -46,7 +51,7 @@ public class ClassInstanceValue implements Value {
|
|||||||
public void set(Value key, Value value) {
|
public void set(Value key, Value value) {
|
||||||
final Value v = thisMap.get(key);
|
final Value v = thisMap.get(key);
|
||||||
if (v == null) {
|
if (v == null) {
|
||||||
throw new RuntimeException("Unable to add new field "
|
throw new RuntimeException("Unable to add new field "
|
||||||
+ key.asString() + " to class " + className);
|
+ key.asString() + " to class " + className);
|
||||||
}
|
}
|
||||||
thisMap.set(key, value);
|
thisMap.set(key, value);
|
||||||
@ -69,14 +74,17 @@ public class ClassInstanceValue implements Value {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String asString() {
|
public String asString() {
|
||||||
return "class " + className + "@" + thisMap;
|
if (toString != null) {
|
||||||
|
return toString.execute(new Value[] {}).asString();
|
||||||
|
}
|
||||||
|
return className + "@" + thisMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int type() {
|
public int type() {
|
||||||
return Types.CLASS;
|
return Types.CLASS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
int hash = 5;
|
int hash = 5;
|
||||||
@ -99,7 +107,7 @@ public class ClassInstanceValue implements Value {
|
|||||||
public int compareTo(Value o) {
|
public int compareTo(Value o) {
|
||||||
return asString().compareTo(o.asString());
|
return asString().compareTo(o.asString());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return asString();
|
return asString();
|
||||||
|
Loading…
Reference in New Issue
Block a user