From 0397724cfdbff39773ecc825dc25917b860ee982 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Wed, 30 Mar 2016 20:29:42 +0800 Subject: AST - Path binding clone --- src/ast/path.cpp | 18 +++++++++++++++++- src/include/tagged_union.hpp | 6 +++--- src/resolve/use.cpp | 2 ++ 3 files changed, 22 insertions(+), 4 deletions(-) (limited to 'src') 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_; } -- cgit v1.2.3