summaryrefslogtreecommitdiff
path: root/src/parse
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-09-25 21:23:07 +0800
committerJohn Hodge <tpg@mutabah.net>2016-09-25 21:23:07 +0800
commit36e197f903ba19229b35cdd7c5bea045ca34dcdc (patch)
tree547ffd0f02cf00ebaba9dd40caf51c809d65cb0e /src/parse
parentadc6e7e42f05724d031c50d6d0092753e87cc79d (diff)
downloadmrust-36e197f903ba19229b35cdd7c5bea045ca34dcdc.tar.gz
Parse+AST - Support capturing :item (requires cloning AST items)
Diffstat (limited to 'src/parse')
-rw-r--r--src/parse/common.hpp1
-rw-r--r--src/parse/eTokenType.enum.h1
-rw-r--r--src/parse/expr.cpp3
-rw-r--r--src/parse/interpolated_fragment.cpp12
-rw-r--r--src/parse/interpolated_fragment.hpp5
-rw-r--r--src/parse/root.cpp3
-rw-r--r--src/parse/token.cpp16
7 files changed, 38 insertions, 3 deletions
diff --git a/src/parse/common.hpp b/src/parse/common.hpp
index 12d56eb3..a4420b54 100644
--- a/src/parse/common.hpp
+++ b/src/parse/common.hpp
@@ -46,6 +46,7 @@ extern AST::Pattern Parse_Pattern(TokenStream& lex, bool is_refutable);
extern void Parse_Impl_Item(TokenStream& lex, AST::Impl& impl);
extern void Parse_Mod_Item(TokenStream& lex, bool file_controls_dir, const ::std::string& file_path, AST::Module& mod, bool is_public, AST::MetaItems meta_items);
+extern ::AST::Named<::AST::Item> Parse_Mod_Item_S(TokenStream& lex, bool file_controls_dir, const ::std::string& file_path, const ::AST::Path& mod_path, bool is_public, AST::MetaItems meta_items);
extern void Parse_ModRoot_Items(TokenStream& lex, AST::Module& mod, bool file_controls_dir, const ::std::string& path);
diff --git a/src/parse/eTokenType.enum.h b/src/parse/eTokenType.enum.h
index f7157805..21bbb1d5 100644
--- a/src/parse/eTokenType.enum.h
+++ b/src/parse/eTokenType.enum.h
@@ -12,6 +12,7 @@ _(TOK_INTERPOLATED_EXPR)
_(TOK_INTERPOLATED_STMT)
_(TOK_INTERPOLATED_BLOCK)
_(TOK_INTERPOLATED_META)
+_(TOK_INTERPOLATED_ITEM)
// Value tokens
_(TOK_IDENT)
diff --git a/src/parse/expr.cpp b/src/parse/expr.cpp
index ffc2fa19..aa016cd2 100644
--- a/src/parse/expr.cpp
+++ b/src/parse/expr.cpp
@@ -11,7 +11,8 @@
* - Parse_Expr0 : Parse a single expression
*/
#include "parseerror.hpp"
-#include "../ast/ast.hpp"
+#include <ast/ast.hpp>
+#include <ast/expr.hpp>
#include "common.hpp"
#include <iostream>
#include "tokentree.hpp"
diff --git a/src/parse/interpolated_fragment.cpp b/src/parse/interpolated_fragment.cpp
index e907978b..f0d7c19c 100644
--- a/src/parse/interpolated_fragment.cpp
+++ b/src/parse/interpolated_fragment.cpp
@@ -3,6 +3,7 @@
#include <iostream>
#include "interpolated_fragment.hpp"
#include <ast/ast.hpp>
+#include <ast/expr.hpp> // For definition of ExprNode
InterpolatedFragment::~InterpolatedFragment()
{
@@ -22,6 +23,9 @@ InterpolatedFragment::~InterpolatedFragment()
case InterpolatedFragment::META:
delete reinterpret_cast<AST::MetaItem*>(m_ptr);
break;
+ case InterpolatedFragment::ITEM:
+ delete reinterpret_cast<AST::Named<AST::Item>*>(m_ptr);
+ break;
}
}
}
@@ -48,6 +52,11 @@ InterpolatedFragment::InterpolatedFragment(AST::MetaItem v):
m_ptr( new AST::MetaItem(mv$(v)) )
{
}
+InterpolatedFragment::InterpolatedFragment(::AST::Named<::AST::Item> v):
+ m_type( InterpolatedFragment::ITEM ),
+ m_ptr( new ::AST::Named<::AST::Item>( mv$(v) ) )
+{
+}
InterpolatedFragment::InterpolatedFragment(TokenTree v):
m_type( InterpolatedFragment::TT ),
m_ptr( new TokenTree(mv$(v)) )
@@ -99,6 +108,9 @@ InterpolatedFragment::InterpolatedFragment(TypeRef v):
case InterpolatedFragment::META:
os << "meta[" << *reinterpret_cast<AST::MetaItem*>(x.m_ptr) << "]";
break;
+ case InterpolatedFragment::ITEM:
+ os << "item[?]";
+ break;
}
return os;
}
diff --git a/src/parse/interpolated_fragment.hpp b/src/parse/interpolated_fragment.hpp
index 7d9ee7c8..b0be2efe 100644
--- a/src/parse/interpolated_fragment.hpp
+++ b/src/parse/interpolated_fragment.hpp
@@ -11,8 +11,11 @@ namespace AST {
class Path;
class ExprNode;
class MetaItem;
+ template<typename T> class Named;
+ class Item;
};
+
class InterpolatedFragment
{
public:
@@ -28,6 +31,7 @@ public:
BLOCK,
META,
+ ITEM,
} m_type;
// Owned type-pruned pointer
@@ -41,6 +45,7 @@ public:
InterpolatedFragment(::AST::Path);
InterpolatedFragment(::TypeRef);
InterpolatedFragment(::AST::MetaItem );
+ InterpolatedFragment(::AST::Named<AST::Item> );
~InterpolatedFragment();
InterpolatedFragment(Type , ::AST::ExprNode*);
diff --git a/src/parse/root.cpp b/src/parse/root.cpp
index 0140f898..b5fc9c09 100644
--- a/src/parse/root.cpp
+++ b/src/parse/root.cpp
@@ -1675,7 +1675,7 @@ void Parse_ModRoot_Items(TokenStream& lex, AST::Module& mod, bool file_controls_
PUTBACK(tok, lex);
DEBUG("meta_items = " << meta_items);
- // root-level macros
+ // Root-level macro invocations
auto ps = lex.start_span();
if( GET_TOK(tok, lex) == TOK_MACRO )
{
@@ -1692,6 +1692,7 @@ void Parse_ModRoot_Items(TokenStream& lex, AST::Module& mod, bool file_controls_
}
// Module visibility
+ // TODO: Move this into Parse_Mod_Item?
bool is_public = false;
if( GET_TOK(tok, lex) == TOK_RWORD_PUB ) {
is_public = true;
diff --git a/src/parse/token.cpp b/src/parse/token.cpp
index ee884d3b..b261f248 100644
--- a/src/parse/token.cpp
+++ b/src/parse/token.cpp
@@ -8,6 +8,7 @@
#include "interpolated_fragment.hpp"
#include <ast/types.hpp>
#include <ast/ast.hpp>
+#include <ast/expr.hpp> // for reasons
Token::~Token()
{
@@ -93,6 +94,12 @@ Token::Token(const InterpolatedFragment& frag)
m_type = TOK_INTERPOLATED_META;
m_data = new AST::MetaItem( reinterpret_cast<const AST::MetaItem*>(frag.m_ptr)->clone() );
break;
+ case InterpolatedFragment::ITEM: {
+ m_type = TOK_INTERPOLATED_ITEM;
+ const auto& named = *reinterpret_cast<const AST::Named<AST::Item>*>(frag.m_ptr);
+ ::AST::Item item = named.data.clone();
+ m_data = new AST::Named<AST::Item>( named.name, mv$(item), named.is_pub );
+ break; }
}
}
Token::Token(TagTakeIP, InterpolatedFragment frag)
@@ -122,9 +129,15 @@ Token::Token(TagTakeIP, InterpolatedFragment frag)
m_data = reinterpret_cast<AST::ExprNode*>(frag.m_ptr);
frag.m_ptr = nullptr;
break;
+ case InterpolatedFragment::ITEM:
+ m_type = TOK_INTERPOLATED_ITEM;
+ m_data = frag.m_ptr;
+ frag.m_ptr = nullptr;
+ break;
case InterpolatedFragment::META:
m_type = TOK_INTERPOLATED_META;
- m_data = new AST::MetaItem( mv$(*reinterpret_cast<AST::MetaItem*>(frag.m_ptr)) );
+ m_data = frag.m_ptr;
+ frag.m_ptr = nullptr;
break;
}
}
@@ -257,6 +270,7 @@ struct EscapedString {
case TOK_INTERPOLATED_STMT: return "/*:stmt*/";
case TOK_INTERPOLATED_BLOCK: return "/*:block*/";
case TOK_INTERPOLATED_META: return "/*:meta*/";
+ case TOK_INTERPOLATED_ITEM: return "/*:item*/";
// Value tokens
case TOK_IDENT: return m_data.as_String();
case TOK_MACRO: return m_data.as_String() + "!";