diff options
-rw-r--r-- | src/expand/rustc_diagnostics.cpp | 36 | ||||
-rw-r--r-- | src/parse/tokentree.hpp | 4 |
2 files changed, 39 insertions, 1 deletions
diff --git a/src/expand/rustc_diagnostics.cpp b/src/expand/rustc_diagnostics.cpp index 2deaa9a3..917a5e4d 100644 --- a/src/expand/rustc_diagnostics.cpp +++ b/src/expand/rustc_diagnostics.cpp @@ -6,6 +6,7 @@ * - Stubbed handling for __register_diagnostic and __diagnostic_used */ #include <synext.hpp> +#include <parse/parseerror.hpp> // For GET_CHECK_TOK #include <parse/common.hpp> // TokenTree etc #include <parse/ttstream.hpp> @@ -30,7 +31,40 @@ class CExpanderBuildDiagnosticArray: { ::std::unique_ptr<TokenStream> expand(const Span& sp, const AST::Crate& crate, const ::std::string& ident, const TokenTree& tt, AST::Module& mod) override { - return box$( TTStreamO(TokenTree()) ); + if( ident != "" ) + ERROR(sp, E0000, "__build_diagnostic_array! doesn't take an ident"); + auto lex = TTStream(tt); + + Token tok; + + GET_CHECK_TOK(tok, lex, TOK_IDENT); + //auto crate_name = mv$(tok.str()); + GET_CHECK_TOK(tok, lex, TOK_COMMA); + GET_CHECK_TOK(tok, lex, TOK_IDENT); + auto item_name = mv$(tok.str()); + GET_CHECK_TOK(tok, lex, TOK_EOF); + + ::std::vector<TokenTree> toks; + toks.push_back( TOK_RWORD_STATIC ); + toks.push_back( Token(TOK_IDENT, item_name) ); + // : [(&'static str, &'static str); 0] + toks.push_back( TOK_COLON ); + toks.push_back( TOK_SQUARE_OPEN ); + toks.push_back( TOK_PAREN_OPEN ); + toks.push_back( TOK_AMP ); toks.push_back( Token(TOK_LIFETIME, "static") ); toks.push_back( Token(TOK_IDENT, "str") ); + toks.push_back( TOK_COMMA ); + toks.push_back( TOK_AMP ); toks.push_back( Token(TOK_LIFETIME, "static") ); toks.push_back( Token(TOK_IDENT, "str") ); + toks.push_back( TOK_PAREN_CLOSE ); + toks.push_back( TOK_SEMICOLON ); + toks.push_back( Token(static_cast<uint64_t>(0), CORETYPE_UINT) ); + toks.push_back( TOK_SQUARE_CLOSE ); + // = []; + toks.push_back( TOK_EQUAL ); + toks.push_back( TOK_SQUARE_OPEN ); + toks.push_back( TOK_SQUARE_CLOSE ); + toks.push_back( TOK_SEMICOLON ); + + return box$( TTStreamO(TokenTree( lex.getHygiene(), mv$(toks) )) ); } }; diff --git a/src/parse/tokentree.hpp b/src/parse/tokentree.hpp index 27b85b45..8472ec7f 100644 --- a/src/parse/tokentree.hpp +++ b/src/parse/tokentree.hpp @@ -22,6 +22,10 @@ public: TokenTree() {}
TokenTree(TokenTree&&) = default;
TokenTree& operator=(TokenTree&&) = default;
+ TokenTree(enum eTokenType ty):
+ m_tok( Token(ty) )
+ {
+ }
TokenTree(Token tok):
m_tok( ::std::move(tok) )
{
|