diff options
author | John Hodge <tpg@mutabah.net> | 2016-03-30 20:29:42 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-03-30 20:29:42 +0800 |
commit | 0397724cfdbff39773ecc825dc25917b860ee982 (patch) | |
tree | 7a8bbd5475c6a743bbba1b113c2c7c33163c3bfa /src | |
parent | 8f77e93357eeb45a31b14af91cd749a379da5179 (diff) | |
download | mrust-0397724cfdbff39773ecc825dc25917b860ee982.tar.gz |
AST - Path binding clone
Diffstat (limited to 'src')
-rw-r--r-- | src/ast/path.cpp | 18 | ||||
-rw-r--r-- | src/include/tagged_union.hpp | 6 | ||||
-rw-r--r-- | src/resolve/use.cpp | 2 |
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_; } |