summaryrefslogtreecommitdiff
path: root/src/expand/rustc_diagnostics.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/expand/rustc_diagnostics.cpp')
-rw-r--r--src/expand/rustc_diagnostics.cpp36
1 files changed, 35 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) )) );
}
};