From 8ac5b10b954c6a9f33e1ed200e737682c7e89dfc Mon Sep 17 00:00:00 2001 From: John Hodge Date: Mon, 17 Jul 2017 12:57:29 +0800 Subject: Parse - Allow :expr in attributes --- src/parse/root.cpp | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'src/parse') diff --git a/src/parse/root.cpp b/src/parse/root.cpp index cdb36345..33087724 100644 --- a/src/parse/root.cpp +++ b/src/parse/root.cpp @@ -18,6 +18,7 @@ #include // check_cfg - for `mod nonexistant;` #include // Used by directory path #include "lex.hpp" // New file lexer +#include template Spanned get_spanned(TokenStream& lex, ::std::function f) { @@ -981,8 +982,25 @@ AST::MetaItem Parse_MetaItem(TokenStream& lex) switch(GET_TOK(tok, lex)) { case TOK_EQUAL: - GET_CHECK_TOK(tok, lex, TOK_STRING); - return AST::MetaItem(name, tok.str()); + switch(GET_TOK(tok, lex)) + { + case TOK_STRING: + return AST::MetaItem(name, tok.str()); + case TOK_INTERPOLATED_EXPR: { + auto n = tok.take_frag_node(); + if( auto* v = dynamic_cast<::AST::ExprNode_String*>(&*n) ) + { + return AST::MetaItem(name, mv$(v->m_value)); + } + else + { + CHECK_TOK(tok, TOK_STRING); + } + break; } + default: + CHECK_TOK(tok, TOK_STRING); + } + throw ""; case TOK_PAREN_OPEN: { ::std::vector items; do { -- cgit v1.2.3