diff options
Diffstat (limited to 'src/parse')
-rw-r--r-- | src/parse/common.hpp | 1 | ||||
-rw-r--r-- | src/parse/eTokenType.enum.h | 1 | ||||
-rw-r--r-- | src/parse/expr.cpp | 3 | ||||
-rw-r--r-- | src/parse/interpolated_fragment.cpp | 12 | ||||
-rw-r--r-- | src/parse/interpolated_fragment.hpp | 5 | ||||
-rw-r--r-- | src/parse/root.cpp | 3 | ||||
-rw-r--r-- | src/parse/token.cpp | 16 |
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() + "!"; |