#include #include "AST/DeclNode.h" #include "Sema/ASTVisitor.h" VarDeclNode::VarDeclNode() : modifier(VarModifier::Let) {} VarDeclNode::VarDeclNode( VarModifier modifier, const SharedPtr &type ) : modifier(modifier), type(type) {} VarDeclNode::VarDeclNode( VarModifier modifier, String name, const SharedPtr &type ) : modifier(modifier), name(std::move(name)), type(type) {} VarDeclNode::VarDeclNode(VarModifier modifier, String name, const SharedPtr &type, const SharedPtr &initVal ) : modifier(modifier), name(std::move(name)), type(type), initVal(initVal) {} void VarDeclNode::accept(const SharedPtr &visitor) { visitor->visit(staticPtrCast(shared_from_this())); } void VarDeclNode::bindChildrenInversely() { auto self = shared_from_this(); if (initVal) { initVal->parent = self; } } bool VarDeclNode::isConstant() const { return modifier == VarModifier::Const; } ParmVarDeclNode::ParmVarDeclNode( const SharedPtr &type ) : VarDeclNode(VarModifier::Param, type) {} ParmVarDeclNode::ParmVarDeclNode( const String &name, const SharedPtr &type ) : VarDeclNode(VarModifier::Param, name, type) {} void ParmVarDeclNode::accept(const SharedPtr &visitor) { visitor->visit(staticPtrCast(shared_from_this())); } SharedPtrMap FunctionDeclNode::getBuiltinFunctions() { SharedPtrMap functions; SharedPtr booleanArg = makeShared(BasicType::BOOLEAN_TYPE); SharedPtr integerArg = makeShared(BasicType::INTEGER_TYPE); SharedPtr floatArg = makeShared(BasicType::FLOAT_TYPE); SharedPtr strArg = makeShared(BasicType::STRING_TYPE); SharedPtrVector booleanArgs{booleanArg}; SharedPtrVector integerArgs{integerArg}; SharedPtrVector floatArgs{floatArg}; SharedPtrVector strArgs{strArg}; functions["ss_integer2string"] = makeShared("ss_integer2string", integerArgs, BasicType::STRING_TYPE); functions["ss_string2integer"] = makeShared("ss_string2integer", strArgs, BasicType::INTEGER_TYPE); functions["ss_float2string"] = makeShared("ss_float2string", floatArgs, BasicType::STRING_TYPE); functions["ss_string2float"] = makeShared("ss_string2float", strArgs, BasicType::FLOAT_TYPE); functions["ss_print_integer"] = makeShared("ss_print_integer", integerArgs); functions["ss_println_integer"] = makeShared("ss_println_integer", integerArgs); functions["ss_print_float"] = makeShared("ss_print_float", floatArgs); functions["ss_println_float"] = makeShared("ss_println_float", floatArgs); functions["ss_print_string"] = makeShared("ss_print_string", strArgs); functions["ss_println_string"] = makeShared("ss_println_string", strArgs); functions["ss_assert"] = makeShared("ss_assert", booleanArgs); return functions; } FunctionDeclNode::FunctionDeclNode( String name, const SharedPtrVector ¶ms ) : name(std::move(name)), params(params) {} FunctionDeclNode::FunctionDeclNode( String name, const SharedPtrVector ¶ms, const SharedPtr &returnType ) : name(std::move(name)), params(params), returnType(returnType) {} FunctionDeclNode::FunctionDeclNode( String name, const SharedPtrVector ¶ms, const SharedPtr &returnType, const SharedPtr &body ) : name(std::move(name)), params(params), returnType(returnType), body(body) {} void FunctionDeclNode::accept(const SharedPtr &visitor) { visitor->visit(staticPtrCast(shared_from_this())); } void FunctionDeclNode::bindChildrenInversely() { auto self = shared_from_this(); for (const SharedPtr ¶m: params) { param->parent = self; } body->parent = self; }