local variable was not typed as referenced type
[ozulis.git] / src / ast / scope-builder-visitor.cc
blobb22dbde0324edd78ce1b2d4d7021b402ebd7ad54
1 #include <boost/foreach.hpp>
3 #include <core/assert.hh>
4 #include "scope-builder-visitor.hh"
5 #include "scope.hh"
7 namespace ast
9 ScopeBuilderVisitor::ScopeBuilderVisitor()
10 : parent_(0)
14 ScopeBuilderVisitor::~ScopeBuilderVisitor()
18 void
19 ScopeBuilderVisitor::visit(File & node)
21 node.scope = new Scope();
22 node.scope->setParent(parent_);
23 global_ = node.scope;
24 parent_ = node.scope;
25 super_t::visit(node);
26 parent_ = node.scope->parent();
29 void
30 ScopeBuilderVisitor::visit(FunctionDecl & node)
32 assert(parent_);
33 assert(node.args);
35 FunctionType *ftype = new FunctionType;
36 ftype->returnType = node.returnType;
37 ftype->argsType = new std::vector<Type *> ();
38 BOOST_FOREACH (VarDecl * varDecl, *node.args)
39 ftype->argsType->push_back(varDecl->type);
41 Symbol * symbol = new Symbol;
42 symbol->name = node.name;
43 symbol->type = ftype;
44 symbol->address = new MemoryAddress;
45 parent_->addSymbol(symbol);
48 void
49 ScopeBuilderVisitor::visit(Function & node)
51 assert(parent_);
52 assert(node.block);
53 assert(node.args);
55 FunctionType *ftype = new FunctionType;
56 ftype->returnType = node.returnType;
57 ftype->argsType = new std::vector<Type *> ();
58 BOOST_FOREACH (VarDecl * varDecl, *node.args)
59 ftype->argsType->push_back(varDecl->type);
61 Symbol * symbol = new Symbol;
62 symbol->name = node.name;
63 symbol->type = ftype;
64 symbol->address = new MemoryAddress;
65 parent_->addSymbol(symbol);
67 node.scope = new Scope;
68 node.scope->setParent(parent_);
70 BOOST_FOREACH (VarDecl * varDecl, *node.args)
72 symbol = new Symbol;
74 assert(varDecl);
75 symbol->name = varDecl->name;
76 ReferenceType * rtype = new ReferenceType;
77 rtype->type = varDecl->type;
78 symbol->type = rtype;
79 symbol->address = new MemoryAddress;
80 node.scope->addSymbol(symbol);
83 parent_ = node.scope;
84 node.block->accept(*this);
85 parent_ = node.scope->parent();
88 void
89 ScopeBuilderVisitor::visit(Block & node)
91 assert(parent_);
92 node.scope = new Scope();
93 node.scope->setParent(parent_);
94 parent_ = node.scope;
96 /// @todo fill the scope with the declarated variables
97 assert(node.varDecls);
98 BOOST_FOREACH (VarDecl * varDecl, (*node.varDecls))
100 Symbol * symbol = new Symbol;
102 assert(varDecl);
103 symbol->name = varDecl->name;
104 ReferenceType * rtype = new ReferenceType;
105 rtype->type = varDecl->type;
106 symbol->type = rtype;
107 symbol->address = new MemoryAddress;
108 node.scope->addSymbol(symbol);
111 super_t::visit(node);
112 parent_ = node.scope->parent();
115 void
116 ScopeBuilderVisitor::visit(StringExp & /*node*/)
118 assert(global_);
119 assert(false);
120 /// @todo create a global variable