88 */
99
1010#include " AddVariableNode.hpp"
11- #include " ArrayObject.hpp"
12- #include " FloatObject.hpp"
13- #include " IntObject.hpp"
11+ #include " Exceptions.hpp"
1412#include " ObjectFactory.hpp"
15- #include " StringObject.hpp"
1613
14+ AddVariableNode::AddVariableNode (std::string name, AnyObject::Type type)
15+ : LookupVariableNode(std::move(name)),
16+ _variableType(type)
17+ {
18+ setType (NodeType::AddVariable);
19+ }
1720
18- BaseObject ::Ptr AddVariableNode::evaluate (Scope &scope)
21+ AnyObject ::Ptr AddVariableNode::evaluate (Scope &scope)
1922{
2023 /* TODO: - add support for functions (to enable passing to other functions, etc) */
2124 auto objectPtr = ObjectFactory::allocate (_variableType);
@@ -26,39 +29,25 @@ BaseObject::Ptr AddVariableNode::evaluate(Scope &scope)
2629
2730
2831// / Type checking.
29- bool AddVariableNode::passesAssignmentTypeCheck (const BaseObject &assignObject) const
32+ bool AddVariableNode::passesAssignmentTypeCheck (const AnyObject &assignObject) const
3033{
31- switch (_variableType)
32- {
33- case ObjectType::Int:
34- return assignObject.isObjectType <IntObject>();
35- case ObjectType::Float:
36- return assignObject.isObjectType <FloatObject>();
37- case ObjectType::Bool:
38- return assignObject.isObjectType <BoolObject>();
39- case ObjectType::String:
40- return assignObject.isObjectType <StringObject>();
41- case ObjectType::Array:
42- return assignObject.isObjectType <ArrayObject>();
43- default :
44- return false ;
45- }
34+ return assignObject.isType (_variableType);
4635}
4736
4837
4938std::string AddVariableNode::description () const
5039{
5140 switch (_variableType)
5241 {
53- case ObjectType ::Bool:
42+ case AnyObject ::Bool:
5443 return " Bool" ;
55- case ObjectType ::Int:
44+ case AnyObject ::Int:
5645 return " Int" ;
57- case ObjectType ::Float:
46+ case AnyObject ::Float:
5847 return " Float" ;
59- case ObjectType ::String:
48+ case AnyObject ::String:
6049 return " String" ;
61- case ObjectType ::Array:
50+ case AnyObject ::Array:
6251 return " Array" ;
6352 default :
6453 return " Unknown" ;
@@ -68,50 +57,23 @@ std::string AddVariableNode::description() const
6857
6958AddReferenceVariableNode::AddReferenceVariableNode (std::string referenceName_,
7059 std::string boundName_,
71- ObjectType boundType_)
60+ AnyObject::Type boundType_)
7261 : AddVariableNode(boundName_, boundType_),
7362 referenceName(referenceName_)
7463{
7564}
7665
7766
78- BaseObject ::Ptr AddReferenceVariableNode::evaluate (Scope &scope)
67+ AnyObject ::Ptr AddReferenceVariableNode::evaluate (Scope &scope)
7968{
8069 // 1. Lookup the object associated with the variable name defined in this
8170 // scope or a parent scope (no issue with lifetimes such as to be bound
8271 // object going out of scope before our reference.
83- BaseObject::Ptr boundObject = scope.getNamedObject (name ());
84-
85- // 2. Type checking. The type of the reference must match that of the bound
86- // object.
87- bool passesTypeChecking{false };
88-
89- // TODO: - add type checking for classes and struct references.
90- switch (_variableType)
91- {
92- case ObjectType::Int:
93- passesTypeChecking = boundObject->isObjectType <IntObject>();
94- break ;
95- case ObjectType::Float:
96- passesTypeChecking = boundObject->isObjectType <FloatObject>();
97- break ;
98- case ObjectType::String:
99- passesTypeChecking = boundObject->isObjectType <StringObject>();
100- break ;
101- case ObjectType::Bool:
102- passesTypeChecking = boundObject->isObjectType <StringObject>();
103- break ;
104- case ObjectType::Array:
105- passesTypeChecking = boundObject->isObjectType <ArrayObject>();
106- break ;
107- case ObjectType::Struct:
108- case ObjectType::Class:
109- default :
110- passesTypeChecking = true ;
111- break ; // No type checking currently!
112- }
72+ AnyObject::Ptr boundObject = scope.getNamedObject (name ());
11373
114- if (!passesTypeChecking)
74+ // TODO: - this will not work for classes/structs since they could point to different types.
75+ // 2. Type checking. The type of the reference must match that of the bound object.
76+ if (!passesAssignmentTypeCheck (*boundObject))
11577 {
11678 ThrowException (" Cannot bind reference " + referenceName + " to variable " + name () + " . Types do not match!" );
11779 }
0 commit comments