summaryrefslogtreecommitdiff
path: root/src/ast/ast.cpp
diff options
context:
space:
mode:
authorJohn Hodge (sonata) <tpg@mutabah.net>2015-01-02 19:10:22 +0800
committerJohn Hodge (sonata) <tpg@mutabah.net>2015-01-02 19:10:22 +0800
commit5fae00d74e717a703d1bbc90536a003a205eae95 (patch)
tree68516d8066432774b9575b783f8cb200bed7960b /src/ast/ast.cpp
parentd0461823a2359e0eb052dd10813bc6a3d66f7c74 (diff)
downloadmrust-5fae00d74e717a703d1bbc90536a003a205eae95.tar.gz
Adding in support for std, parsing now broken due to TODO early in process
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;