From bd83f011a8fddb5f21433584a55c2bc2f5f3983c Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sat, 26 Nov 2016 13:14:59 +0800 Subject: Expand - Emit rustc diagnostics arrays (empty) --- src/expand/rustc_diagnostics.cpp | 36 +++++++++++++++++++++++++++++++++++- src/parse/tokentree.hpp | 4 ++++ 2 files changed, 39 insertions(+), 1 deletion(-) (limited to 'src') 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 +#include // For GET_CHECK_TOK #include // TokenTree etc #include @@ -30,7 +31,40 @@ class CExpanderBuildDiagnosticArray: { ::std::unique_ptr 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 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(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) ) { -- cgit v1.2.3