diff options
-rw-r--r-- | src/ast/path.cpp | 2 | ||||
-rw-r--r-- | src/ast/path.hpp | 13 | ||||
-rw-r--r-- | src/convert/resolve.cpp | 13 | ||||
-rw-r--r-- | src/include/tagged_enum.hpp | 110 | ||||
-rw-r--r-- | src/parse/expr.cpp | 3 |
5 files changed, 99 insertions, 42 deletions
diff --git a/src/ast/path.cpp b/src/ast/path.cpp index 25015ab7..1f07d4b0 100644 --- a/src/ast/path.cpp +++ b/src/ast/path.cpp @@ -159,7 +159,7 @@ void Path::resolve(const Crate& root_crate) else if( is_sec_last ) { m_binding_type = TRAIT_METHOD; m_binding.trait_ = &it->data; - throw ParseError::Todo("Path::resolve() trait method"); + goto ret; } else { throw ParseError::Generic("Import of trait, too many extra nodes"); diff --git a/src/ast/path.hpp b/src/ast/path.hpp index db8b64b3..447ff0a0 100644 --- a/src/ast/path.hpp +++ b/src/ast/path.hpp @@ -10,6 +10,7 @@ #include <initializer_list> #include <cassert> #include <serialise.hpp> +#include <tagged_enum.hpp> class TypeRef; @@ -62,6 +63,18 @@ public: FUNCTION, STATIC, }; + //TAGGED_ENUM(Binding, Unbound, + // (BndModule, (const Module* module_; ) ), + // (BndEnum, (const Enum* enum_; ) ), + // (BndStruct, (const Struct* struct_; ) ), + // (BndTrait, (const Trait* trait_; ) ), + // (BndStatic, (const Static* static_; ) ), + // (BndFunction, (const Function* func_; ) ), + // (BndEnumVar, (const Enum* enum_; unsigned int idx; ) ), + // (BndTypeAlias, (const TypeAlias* alias_; ) ), + // (BndStructMethod, (const Struct* struct_; ::std::string name; ) ), + // (BndTraitMethod, (const Trait* struct_; ::std::string name; ) ) + // ); private: enum Class { RELATIVE, diff --git a/src/convert/resolve.cpp b/src/convert/resolve.cpp index 1e320e6f..95325da1 100644 --- a/src/convert/resolve.cpp +++ b/src/convert/resolve.cpp @@ -39,6 +39,9 @@ class CPathResolver: AST::Path m_module_path;
::std::vector< LocalItem > m_locals;
// TODO: Maintain a stack of variable scopes
+ ::std::vector<const AST::Module*> m_module_stack;
+
+ friend class CResolvePaths_NodeVisitor;
public:
CPathResolver(const AST::Crate& crate);
@@ -64,6 +67,8 @@ public: m_locals.push_back( LocalItem(LocalItem::VAR, ::std::move(name), path) );
}
::rust::option<const AST::Path&> lookup_local(LocalItem::Type type, const ::std::string& name) const;
+
+ // TODO: Handle a block and obtain the local module (if any)
};
// Path resolution checking
@@ -97,6 +102,14 @@ public: m_res.handle_path(node.m_path, CASTIterator::MODE_EXPR);
}
+ void visit(AST::ExprNode_Block& node) {
+ if( node.m_inner_mod.get() )
+ m_res.m_module_stack.push_back( node.m_inner_mod.get() );
+ AST::NodeVisitorDef::visit(node);
+ if( node.m_inner_mod.get() )
+ m_res.m_module_stack.pop_back();
+ }
+
void visit(AST::ExprNode_Match& node)
{
DEBUG("ExprNode_Match");
diff --git a/src/include/tagged_enum.hpp b/src/include/tagged_enum.hpp index 08168fe5..e491e154 100644 --- a/src/include/tagged_enum.hpp +++ b/src/include/tagged_enum.hpp @@ -21,6 +21,9 @@ #define TE_CONS5(a, ...) TE_CONS a TE_CONS4(__VA_ARGS__) #define TE_CONS6(a, ...) TE_CONS a TE_CONS5(__VA_ARGS__) #define TE_CONS7(a, ...) TE_CONS a TE_CONS6(__VA_ARGS__) +#define TE_CONS8(a, ...) TE_CONS a TE_CONS7(__VA_ARGS__) +#define TE_CONS9(a, ...) TE_CONS a TE_CONS8(__VA_ARGS__) +#define TE_CONS10(a, ...) TE_CONS a TE_CONS9(__VA_ARGS__) // Sizes of structures #define TE_SO(name, _) sizeof(TE_DATANAME(name)) @@ -31,16 +34,23 @@ #define MAXS5(a, b, c, d, e) MAX2(MAXS3(a, b, c), MAXS2(d, e)) #define MAXS6(a, b, c, d, e, f) MAX2(MAXS3(a, b, c), MAXS3(d, e, f)) #define MAXS7(a, b, c, d, e, f, g) MAX2(MAXS3(a, b, c), MAXS4(d, e, f, g)) +#define MAXS8(a, b, c, d, e, f, g, h) MAX2(MAXS4(a, b, c, d), MAXS4(e, f, g, h)) +#define MAXS9(a, b, c, d, e, f, g, h, i) MAX2(MAXS4(a, b, c, d), MAXS5(e, f, g, h, i)) +#define MAXS10(a, b, c, d, e, f, g, h, i, j) MAX2(MAXS5(a, b, c, d, e), MAXS5(f, g, h, i, j)) // Type definitions #define TE_EXP(...) __VA_ARGS__ -#define TE_TYPEDEF(name, content) struct TE_DATANAME(name) { TE_EXP content }; +#define TE_TYPEDEF(name, content) struct TE_DATANAME(name) { TE_EXP content };/* +*/ #define TE_TYPEDEF2(_1, _2) TE_TYPEDEF _1 TE_TYPEDEF _2 -#define TE_TYPEDEF3(_1, ...) TE_TYPEDEF _1 TE_TYPEDEF2(__VA_ARGS__) -#define TE_TYPEDEF4(_1, ...) TE_TYPEDEF _1 TE_TYPEDEF3(__VA_ARGS__) -#define TE_TYPEDEF5(_1, ...) TE_TYPEDEF _1 TE_TYPEDEF4(__VA_ARGS__) -#define TE_TYPEDEF6(_1, ...) TE_TYPEDEF _1 TE_TYPEDEF5(__VA_ARGS__) -#define TE_TYPEDEF7(_1, ...) TE_TYPEDEF _1 TE_TYPEDEF6(__VA_ARGS__) +#define TE_TYPEDEF3(v, ...) TE_TYPEDEF v TE_TYPEDEF2(__VA_ARGS__) +#define TE_TYPEDEF4(v, ...) TE_TYPEDEF v TE_TYPEDEF3(__VA_ARGS__) +#define TE_TYPEDEF5(v, ...) TE_TYPEDEF v TE_TYPEDEF4(__VA_ARGS__) +#define TE_TYPEDEF6(v, ...) TE_TYPEDEF v TE_TYPEDEF5(__VA_ARGS__) +#define TE_TYPEDEF7(v, ...) TE_TYPEDEF v TE_TYPEDEF6(__VA_ARGS__) +#define TE_TYPEDEF8(v, ...) TE_TYPEDEF v TE_TYPEDEF7(__VA_ARGS__) +#define TE_TYPEDEF9(v, ...) TE_TYPEDEF v TE_TYPEDEF8(__VA_ARGS__) +#define TE_TYPEDEF10(v, ...) TE_TYPEDEF v TE_TYPEDEF9(__VA_ARGS__) #define TE_TAG(name, _) name, #define TE_TAG2(_1,_2) TE_TAG _1 TE_TAG _2 @@ -49,65 +59,85 @@ #define TE_TAG5(_1,...) TE_TAG _1 TE_TAG4(__VA_ARGS__) #define TE_TAG6(_1,...) TE_TAG _1 TE_TAG5(__VA_ARGS__) #define TE_TAG7(_1,...) TE_TAG _1 TE_TAG6(__VA_ARGS__) +#define TE_TAG8(_1,...) TE_TAG _1 TE_TAG7(__VA_ARGS__) +#define TE_TAG9(_1,...) TE_TAG _1 TE_TAG9(__VA_ARGS__) +#define TE_TAG10(_1,...) TE_TAG _1 TE_TAG9(__VA_ARGS__) -#define TE_DEST_CASE(tag, _) case tag: as_##tag().~TE_DATANAME(tag)(); break; +#define TE_DEST_CASE(tag, _) case tag: as_##tag().~TE_DATANAME(tag)(); break;/* +*/ #define TE_DEST_CASE2(_1,_2) TE_DEST_CASE _1 TE_DEST_CASE _2 -#define TE_DEST_CASE3(_1, ...) TE_DEST_CASE _1 TE_DEST_CASE2(__VA_ARGS__) -#define TE_DEST_CASE4(_1, ...) TE_DEST_CASE _1 TE_DEST_CASE3(__VA_ARGS__) -#define TE_DEST_CASE5(_1, ...) TE_DEST_CASE _1 TE_DEST_CASE4(__VA_ARGS__) -#define TE_DEST_CASE6(_1, ...) TE_DEST_CASE _1 TE_DEST_CASE5(__VA_ARGS__) -#define TE_DEST_CASE7(_1, ...) TE_DEST_CASE _1 TE_DEST_CASE6(__VA_ARGS__) +#define TE_DEST_CASE3(v, ...) TE_DEST_CASE v TE_DEST_CASE2(__VA_ARGS__) +#define TE_DEST_CASE4(v, ...) TE_DEST_CASE v TE_DEST_CASE3(__VA_ARGS__) +#define TE_DEST_CASE5(v, ...) TE_DEST_CASE v TE_DEST_CASE4(__VA_ARGS__) +#define TE_DEST_CASE6(v, ...) TE_DEST_CASE v TE_DEST_CASE5(__VA_ARGS__) +#define TE_DEST_CASE7(v, ...) TE_DEST_CASE v TE_DEST_CASE6(__VA_ARGS__) +#define TE_DEST_CASE8(v, ...) TE_DEST_CASE v TE_DEST_CASE7(__VA_ARGS__) +#define TE_DEST_CASE9(v, ...) TE_DEST_CASE v TE_DEST_CASE8(__VA_ARGS__) +#define TE_DEST_CASE10(v, ...) TE_DEST_CASE v TE_DEST_CASE9(__VA_ARGS__) -#define TE_MOVE_CASE(tag, _) case tag: new(m_data) TE_DATANAME(tag)(x.unwrap_##tag()); break; +#define TE_MOVE_CASE(tag, _) case tag: new(m_data) TE_DATANAME(tag)(x.unwrap_##tag()); break;/* +*/ #define TE_MOVE_CASE2(_1,_2) TE_MOVE_CASE _1 TE_MOVE_CASE _2 -#define TE_MOVE_CASE3(_1, ...) TE_MOVE_CASE _1 TE_MOVE_CASE2(__VA_ARGS__) -#define TE_MOVE_CASE4(_1, ...) TE_MOVE_CASE _1 TE_MOVE_CASE3(__VA_ARGS__) -#define TE_MOVE_CASE5(_1, ...) TE_MOVE_CASE _1 TE_MOVE_CASE4(__VA_ARGS__) -#define TE_MOVE_CASE6(_1, ...) TE_MOVE_CASE _1 TE_MOVE_CASE5(__VA_ARGS__) -#define TE_MOVE_CASE7(_1, ...) TE_MOVE_CASE _1 TE_MOVE_CASE6(__VA_ARGS__) +#define TE_MOVE_CASE3(v, ...) TE_MOVE_CASE v TE_MOVE_CASE2(__VA_ARGS__) +#define TE_MOVE_CASE4(v, ...) TE_MOVE_CASE v TE_MOVE_CASE3(__VA_ARGS__) +#define TE_MOVE_CASE5(v, ...) TE_MOVE_CASE v TE_MOVE_CASE4(__VA_ARGS__) +#define TE_MOVE_CASE6(v, ...) TE_MOVE_CASE v TE_MOVE_CASE5(__VA_ARGS__) +#define TE_MOVE_CASE7(v, ...) TE_MOVE_CASE v TE_MOVE_CASE6(__VA_ARGS__) +#define TE_MOVE_CASE8(v, ...) TE_MOVE_CASE v TE_MOVE_CASE7(__VA_ARGS__) +#define TE_MOVE_CASE9(v, ...) TE_MOVE_CASE v TE_MOVE_CASE8(__VA_ARGS__) +#define TE_MOVE_CASE10(v, ...) TE_MOVE_CASE v TE_MOVE_CASE9(__VA_ARGS__) // "tag_to_str" internals -#define TE_TOSTR_CASE(tag,_) case tag: return #tag; +#define TE_TOSTR_CASE(tag,_) case tag: return #tag;/* +*/ #define TE_TOSTR_CASE2(a,b) TE_TOSTR_CASE a TE_TOSTR_CASE b -#define TE_TOSTR_CASE3(a,...) TE_TOSTR_CASE a TE_TOSTR_CASE2(__VA_ARGS__) -#define TE_TOSTR_CASE4(a,...) TE_TOSTR_CASE a TE_TOSTR_CASE3(__VA_ARGS__) -#define TE_TOSTR_CASE5(a,...) TE_TOSTR_CASE a TE_TOSTR_CASE4(__VA_ARGS__) -#define TE_TOSTR_CASE6(a,...) TE_TOSTR_CASE a TE_TOSTR_CASE5(__VA_ARGS__) -#define TE_TOSTR_CASE7(a,...) TE_TOSTR_CASE a TE_TOSTR_CASE6(__VA_ARGS__) +#define TE_TOSTR_CASE3(a,...) TE_TOSTR_CASE a TE_TOSTR_CASE2(__VA_ARGS__) +#define TE_TOSTR_CASE4(a,...) TE_TOSTR_CASE a TE_TOSTR_CASE3(__VA_ARGS__) +#define TE_TOSTR_CASE5(a,...) TE_TOSTR_CASE a TE_TOSTR_CASE4(__VA_ARGS__) +#define TE_TOSTR_CASE6(a,...) TE_TOSTR_CASE a TE_TOSTR_CASE5(__VA_ARGS__) +#define TE_TOSTR_CASE7(a,...) TE_TOSTR_CASE a TE_TOSTR_CASE6(__VA_ARGS__) +#define TE_TOSTR_CASE8(a,...) TE_TOSTR_CASE a TE_TOSTR_CASE7(__VA_ARGS__) +#define TE_TOSTR_CASE9(a,...) TE_TOSTR_CASE a TE_TOSTR_CASE8(__VA_ARGS__) +#define TE_TOSTR_CASE10(a,...) TE_TOSTR_CASE a TE_TOSTR_CASE9(__VA_ARGS__) // "tag_from_str" internals -#define TE_FROMSTR_CASE(tag,_) else if(str == #tag) return tag; +#define TE_FROMSTR_CASE(tag,_) else if(str == #tag) return tag;/* +*/ #define TE_FROMSTR_CASE2(a,b) TE_FROMSTR_CASE a TE_FROMSTR_CASE b #define TE_FROMSTR_CASE3(a,...) TE_FROMSTR_CASE a TE_FROMSTR_CASE2(__VA_ARGS__) #define TE_FROMSTR_CASE4(a,...) TE_FROMSTR_CASE a TE_FROMSTR_CASE3(__VA_ARGS__) #define TE_FROMSTR_CASE5(a,...) TE_FROMSTR_CASE a TE_FROMSTR_CASE4(__VA_ARGS__) #define TE_FROMSTR_CASE6(a,...) TE_FROMSTR_CASE a TE_FROMSTR_CASE5(__VA_ARGS__) #define TE_FROMSTR_CASE7(a,...) TE_FROMSTR_CASE a TE_FROMSTR_CASE6(__VA_ARGS__) +#define TE_FROMSTR_CASE8(a,...) TE_FROMSTR_CASE a TE_FROMSTR_CASE7(__VA_ARGS__) +#define TE_FROMSTR_CASE9(a,...) TE_FROMSTR_CASE a TE_FROMSTR_CASE8(__VA_ARGS__) +#define TE_FROMSTR_CASE10(a,...) TE_FROMSTR_CASE a TE_FROMSTR_CASE9(__VA_ARGS__) // Macro to obtain a numbered macro for argument counts -#define TE_GM_I(SUF,_1,_2,_3,_4,_5,_6,_7,COUNT,...) SUF##COUNT -#define TE_GM(SUF,...) TE_GM_I(SUF,__VA_ARGS__,7,6,5,4,3,2) +#define TE_GM_I(SUF,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,COUNT,...) SUF##COUNT +#define TE_GM(SUF,...) TE_GM_I(SUF,__VA_ARGS__,10,9,8,7,6,5,4,3,2,x) +//#define TE_GMx(SUF,...) TE_GM_I(SUF,__VA_ARGS__,x,x,x,x,x,x,2) #define MAXS(...) TE_GM(MAXS ,__VA_ARGS__)(__VA_ARGS__) +#define TE_CONSS(...) TE_GM(TE_CONS ,__VA_ARGS__)(__VA_ARGS__) #define TE_TYPEDEFS(...) TE_GM(TE_TYPEDEF ,__VA_ARGS__)(__VA_ARGS__) #define TE_TAGS(...) TE_GM(TE_TAG ,__VA_ARGS__)(__VA_ARGS__) #define TE_DEST_CASES(...) TE_GM(TE_DEST_CASE,__VA_ARGS__)(__VA_ARGS__) #define TE_MOVE_CASES(...) TE_GM(TE_MOVE_CASE,__VA_ARGS__)(__VA_ARGS__) #define TE_TOSTR_CASES(...) TE_GM(TE_TOSTR_CASE ,__VA_ARGS__)(__VA_ARGS__) #define TE_FROMSTR_CASES(...) TE_GM(TE_FROMSTR_CASE,__VA_ARGS__)(__VA_ARGS__) -#define TE_CONSS(...) TE_GM(TE_CONS ,__VA_ARGS__)(__VA_ARGS__) #define TAGGED_ENUM(_name, _def, ...) \ class _name { \ - typedef _name self_t; \ - TE_TYPEDEFS(__VA_ARGS__) \ -public:\ + typedef _name self_t;/* +*/ TE_TYPEDEFS(__VA_ARGS__)/* +*/public:\ enum Tag { \ TE_TAGS(__VA_ARGS__)\ - }; \ -private:\ + };/* +*/ private:\ Tag m_tag; \ - char m_data[MAXS(__VA_ARGS__)]; \ -public:\ + char m_data[MAXS(__VA_ARGS__)];/* +*/ public:\ _name(): m_tag(_def) {}\ _name(const _name&) = delete; \ _name(_name&& x): m_tag(x.m_tag) { x.m_tag = _def; switch(m_tag) { TE_MOVE_CASES(__VA_ARGS__) } } \ @@ -118,12 +148,14 @@ public:\ TE_CONSS(__VA_ARGS__) \ /* */ static const char *tag_to_str(Tag tag) { \ - switch(tag) { TE_TOSTR_CASES(__VA_ARGS__) } return ""; \ + switch(tag) {/* +*/ TE_TOSTR_CASES(__VA_ARGS__)/* +*/ } return ""; \ }/* */ static Tag tag_from_str(const ::std::string& str) { \ - if(0); \ - TE_FROMSTR_CASES(__VA_ARGS__)\ - else throw ::std::runtime_error("enum "#_name" No conversion"); \ + if(0); /* +*/ TE_FROMSTR_CASES(__VA_ARGS__)/* +*/ else throw ::std::runtime_error("enum "#_name" No conversion"); \ }\ } diff --git a/src/parse/expr.cpp b/src/parse/expr.cpp index de27de7f..d618a9af 100644 --- a/src/parse/expr.cpp +++ b/src/parse/expr.cpp @@ -144,8 +144,7 @@ ExprNodeP Parse_ExprBlockNode(TokenStream& lex) }
Macro_SetModule( *prev_modstack );
- if( !keep_mod )
- {
+ if( !keep_mod ) {
local_mod.reset();
}
return NEWNODE( AST::ExprNode_Block, ::std::move(nodes), ::std::move(local_mod) );
|