summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/expand/rustc_diagnostics.cpp36
-rw-r--r--src/parse/tokentree.hpp4
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) )
{