From f03945a9e2362da75fe4b17c7d48709d6f50d8ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 26 Oct 2019 19:19:20 +0200 Subject: [PATCH] AST: better handling when returning list of lambdas --- lib/tokenlist.cpp | 20 +++++++++++++++----- test/testtokenize.cpp | 6 ++++++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/lib/tokenlist.cpp b/lib/tokenlist.cpp index 8c55efe8a..8fef5842f 100644 --- a/lib/tokenlist.cpp +++ b/lib/tokenlist.cpp @@ -1184,11 +1184,21 @@ static void createAstAtTokenInner(Token * const tok1, const Token *endToken, boo const Token * const endToken2 = tok->link(); for (; tok && tok != endToken && tok != endToken2; tok = tok ? tok->next() : nullptr) tok = createAstAtToken(tok, cpp); - } else if (Token::simpleMatch(tok->link(), "] (") && Token::simpleMatch(tok->link()->linkAt(1), ") {")) { - tok = tok->link()->linkAt(1)->next(); - const Token * const endToken2 = tok->link(); - for (; tok && tok != endToken && tok != endToken2; tok = tok ? tok->next() : nullptr) - tok = createAstAtToken(tok, cpp); + } else if (Token::simpleMatch(tok->link(), "] (") && Token::Match(tok->link()->linkAt(1), ") .|{")) { + Token *bodyStart = tok->link()->linkAt(1)->next(); + if (Token::Match(bodyStart, ". %name%") && bodyStart->originalName() == "->") { + bodyStart = bodyStart->next(); + while (Token::Match(bodyStart, "%name%|::")) + bodyStart = bodyStart->next(); + if (Token::simpleMatch(bodyStart, "<") && Token::simpleMatch(bodyStart->link(), "> {")) + bodyStart = bodyStart->link()->next(); + } + if (Token::simpleMatch(bodyStart, "{")) { + tok = bodyStart; + const Token * const endToken2 = tok->link(); + for (; tok && tok != endToken && tok != endToken2; tok = tok ? tok->next() : nullptr) + tok = createAstAtToken(tok, cpp); + } } } } diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index f2ec89fef..eca553124 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -7613,6 +7613,12 @@ private: " a = b;\n" " }\n" "};\n")); + ASSERT_EQUALS("{return ab={", + testAst("return {\n" + " [=]() -> int {\n" + " a=b;\n" + " }\n" + "}")); } void astcase() {