summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ast/path.cpp2
-rw-r--r--src/ast/path.hpp13
-rw-r--r--src/convert/resolve.cpp13
-rw-r--r--src/include/tagged_enum.hpp110
-rw-r--r--src/parse/expr.cpp3
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) );