diff options
-rw-r--r-- | src/parse/expr.cpp | 7 | ||||
-rw-r--r-- | src/parse/root.cpp | 9 |
2 files changed, 13 insertions, 3 deletions
diff --git a/src/parse/expr.cpp b/src/parse/expr.cpp index 5e38ca81..6e18f0eb 100644 --- a/src/parse/expr.cpp +++ b/src/parse/expr.cpp @@ -57,13 +57,18 @@ ExprNodeP Parse_ExprBlockNode(TokenStream& lex, bool is_unsafe/*=false*/) ::std::shared_ptr<AST::Module> local_mod; + if( LOOK_AHEAD(lex) == TOK_INTERPOLATED_BLOCK ) + { + GET_TOK(tok, lex); + return tok.take_frag_node(); + } + GET_CHECK_TOK(tok, lex, TOK_BRACE_OPEN); bool last_value_yielded = false; while( LOOK_AHEAD(lex) != TOK_BRACE_CLOSE ) { last_value_yielded = false; - DEBUG("tok = " << tok); // NOTE: Doc comments can appear within a function and apply to the function if( lex.parse_state().parent_attrs ) diff --git a/src/parse/root.cpp b/src/parse/root.cpp index a58e05d5..d79df434 100644 --- a/src/parse/root.cpp +++ b/src/parse/root.cpp @@ -1499,14 +1499,19 @@ bool Parse_MacroInvocation_Opt(TokenStream& lex, AST::MacroInvocation& out_inv) { // Good } + else if( lex.lookahead(0) == TOK_INTERPOLATED_PATH && lex.lookahead(1) == TOK_EXCLAM ) + { + // Also good. + } else { return false; } auto ps = lex.start_span(); - GET_CHECK_TOK(tok, lex, TOK_IDENT); - auto name = tok.str(); + auto name_path = Parse_Path(lex, PATH_GENERIC_NONE); + ASSERT_BUG(lex.point_span(), name_path.nodes().size() == 1, "TODO: Support multi-component paths in macro invocations"); + auto name = name_path.nodes()[0].name(); GET_CHECK_TOK(tok, lex, TOK_EXCLAM); bool is_braced = (lex.lookahead(0) == TOK_BRACE_OPEN || (lex.lookahead(0) == TOK_IDENT && lex.lookahead(1) == TOK_BRACE_OPEN)); |