summaryrefslogtreecommitdiff
path: root/src/ast/ast.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ast/ast.cpp')
-rw-r--r--src/ast/ast.cpp48
1 files changed, 44 insertions, 4 deletions
diff --git a/src/ast/ast.cpp b/src/ast/ast.cpp
index e1e6e877..7d151063 100644
--- a/src/ast/ast.cpp
+++ b/src/ast/ast.cpp
@@ -22,23 +22,49 @@ const ::std::vector<TypeRef>& PathNode::args() const
return m_params;
}
+Path& Path::operator+=(const Path& other)
+{
+ for(auto& node : other.m_nodes)
+ append(node);
+ return *this;
+}
+::std::ostream& operator<<(::std::ostream& os, const Path& path)
+{
+ switch(path.m_class)
+ {
+ case Path::RELATIVE:
+ os << "Path({" << path.m_nodes << "})";
+ break;
+ case Path::ABSOLUTE:
+ os << "Path(TagAbsolute, {" << path.m_nodes << "})";
+ break;
+ case Path::LOCAL:
+ os << "Path(TagLocal, " << path.m_nodes[0].name() << ")";
+ break;
+ }
+ return os;
+}
+
::std::ostream& operator<<(::std::ostream& os, const Pattern& pat)
{
switch(pat.m_class)
{
+ case Pattern::ANY:
+ os << "Pattern(TagWildcard, '" << pat.m_binding << "' @ _)";
+ break;
case Pattern::MAYBE_BIND:
- os << "Pattern(TagMaybeBind, '" << pat.m_path[0].name() << "')";
+ os << "Pattern(TagMaybeBind, '" << pat.m_binding << "')";
break;
case Pattern::VALUE:
//os << "Pattern(TagValue, " << *pat.m_node << ")";
- os << "Pattern(TagValue, TODO:ExprNode)";
+ os << "Pattern(TagValue, '" << pat.m_binding << "' @ TODO:ExprNode)";
break;
case Pattern::TUPLE:
- os << "Pattern(TagTuple, " << pat.m_sub_patterns << ")";
+ os << "Pattern(TagTuple, '" << pat.m_binding << "' @ [" << pat.m_sub_patterns << "])";
break;
case Pattern::TUPLE_STRUCT:
- os << "Pattern(TagEnumVariant, " << pat.m_path << ", " << pat.m_sub_patterns << ")";
+ os << "Pattern(TagEnumVariant, '" << pat.m_binding << "' @ " << pat.m_path << ", [" << pat.m_sub_patterns << "])";
break;
}
return os;
@@ -52,11 +78,25 @@ void Impl::add_function(bool is_public, Function fcn)
{
}
+Crate::Crate():
+ m_root_module(*this, ""),
+ m_load_std(true)
+{
+}
void Crate::iterate_functions(fcn_visitor_t* visitor)
{
m_root_module.iterate_functions(visitor, *this);
}
+void Module::add_ext_crate(::std::string ext_name, ::std::string int_name)
+{
+ DEBUG("add_ext_crate(\"" << ext_name << "\" as " << int_name << ")");
+ if( ext_name == "std" )
+ {
+ // HACK! Load std using a hackjob (included within the compiler)
+ }
+ throw ParseError::Todo("'extern crate'");
+}
void Module::add_constant(bool is_public, ::std::string name, TypeRef type, Expr val)
{
::std::cout << "add_constant()" << ::std::endl;