summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-03-30 20:29:42 +0800
committerJohn Hodge <tpg@mutabah.net>2016-03-30 20:29:42 +0800
commit0397724cfdbff39773ecc825dc25917b860ee982 (patch)
tree7a8bbd5475c6a743bbba1b113c2c7c33163c3bfa /src
parent8f77e93357eeb45a31b14af91cd749a379da5179 (diff)
downloadmrust-0397724cfdbff39773ecc825dc25917b860ee982.tar.gz
AST - Path binding clone
Diffstat (limited to 'src')
-rw-r--r--src/ast/path.cpp18
-rw-r--r--src/include/tagged_union.hpp6
-rw-r--r--src/resolve/use.cpp2
3 files changed, 22 insertions, 4 deletions
diff --git a/src/ast/path.cpp b/src/ast/path.cpp
index 60dee881..5b1ba2f8 100644
--- a/src/ast/path.cpp
+++ b/src/ast/path.cpp
@@ -33,7 +33,23 @@ namespace AST {
}
PathBinding PathBinding::clone() const
{
- assert(!"TODO: PathBinding::clone()");
+ TU_MATCH(::AST::PathBinding, (*this), (e),
+ (Unbound , return PathBinding::make_Unbound({}); ),
+ (Module , return PathBinding::make_Module(e); ),
+ (Trait , return PathBinding::make_Trait(e); ),
+ (Struct , return PathBinding::make_Struct(e); ),
+ (Enum , return PathBinding::make_Enum(e); ),
+ (Static , return PathBinding::make_Static(e); ),
+ (Function, return PathBinding::make_Function(e); ),
+ (TypeAlias, return PathBinding::make_TypeAlias(e); ),
+ (EnumVar , return PathBinding::make_EnumVar(e); ),
+ (StructMethod, return PathBinding::make_StructMethod(e); ),
+ (TraitMethod, return PathBinding::make_TraitMethod(e); ),
+
+ (TypeParameter, return PathBinding::make_TypeParameter(e); ),
+ (Variable, return PathBinding::make_Variable(e); )
+ )
+ throw "BUG: Fell off the end of PathBinding::clone";
}
// --- AST::PathNode
diff --git a/src/include/tagged_union.hpp b/src/include/tagged_union.hpp
index 88b07d82..2a240d68 100644
--- a/src/include/tagged_union.hpp
+++ b/src/include/tagged_union.hpp
@@ -97,14 +97,14 @@
// "match"-like statement
// TU_MATCH(Class, m_data, ent, (Variant, CODE), (Variant2, CODE))
-#define TU_MATCH(CLASS, VAR, NAME, ...) switch( TU_FIRST VAR.tag()) {/*
+#define TU_MATCH(CLASS, VAR, NAME, ...) switch( (TU_FIRST VAR).tag()) {/*
*/ TU_MATCH_ARMS(CLASS, VAR, NAME, __VA_ARGS__)/*
*/}
-#define TU_MATCH_DEF(CLASS, VAR, NAME, DEF, ...) switch( TU_FIRST VAR.tag()) {/*
+#define TU_MATCH_DEF(CLASS, VAR, NAME, DEF, ...) switch( (TU_FIRST VAR).tag()) {/*
*/ TU_MATCH_ARMS(CLASS, VAR, NAME, __VA_ARGS__)/*
*/ default: {TU_EXP DEF;} break;/*
*/}
-#define TU_MATCH_BIND1(TAG, VAR, NAME) /*MATCH_BIND*/ auto& NAME = VAR.as_##TAG(); (void)&NAME;
+#define TU_MATCH_BIND1(TAG, VAR, NAME) /*MATCH_BIND*/ auto& NAME = (VAR).as_##TAG(); (void)&NAME;
#define TU_MATCH_BIND2_(TAG, v1,v2, n1,n2) TU_MATCH_BIND1(TAG, v1, n1) TU_MATCH_BIND1(TAG, v2, n2)
#define TU_MATCH_BIND2(...) TU_MATCH_BIND2_(__VA_ARGS__)
#define TU_MATCH_ARM(CLASS, VAR, NAME, TAG, ...) case CLASS::TAG_##TAG: {/*
diff --git a/src/resolve/use.cpp b/src/resolve/use.cpp
index 254a2374..77304c1e 100644
--- a/src/resolve/use.cpp
+++ b/src/resolve/use.cpp
@@ -145,6 +145,7 @@ void Resolve_Use_Mod(const ::AST::Crate& crate, ::AST::Module& mod, ::AST::Path
if( imp.data.binding().is_Unbound() ) {
DEBUG(" > Needs resolve");
const Span sp2;
+ // TODO: Handle possibility of recursion
return Resolve_Use_GetBinding(sp2, crate, Resolve_Use_AbsolutisePath(sp2, mod.path(), imp.data));
}
else {
@@ -158,6 +159,7 @@ void Resolve_Use_Mod(const ::AST::Crate& crate, ::AST::Module& mod, ::AST::Path
const auto* binding = &imp.data.binding();
if( binding->is_Unbound() ) {
DEBUG("Temp resolving wildcard " << imp.data);
+ // TODO: Handle possibility of recursion
binding_ = Resolve_Use_GetBinding(sp2, crate, Resolve_Use_AbsolutisePath(sp2, mod.path(), imp.data));
binding = &binding_;
}