From be5695e4ed2479853aa611605329510a32a02113 Mon Sep 17 00:00:00 2001 From: swasti16 Date: Mon, 19 Jan 2026 21:50:55 +0530 Subject: [PATCH] Add tag line and column in typedef-info in dump file --- lib/tokenize.cpp | 21 +++++++++++++++++++-- lib/tokenize.h | 1 + test/testsimplifytypedef.cpp | 14 +++++++++++++- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 96c69bb4dd9..4aa2932198d 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -1104,6 +1104,10 @@ void Tokenizer::simplifyTypedef() typedefInfo.filename = list.file(typedefToken); typedefInfo.lineNumber = typedefToken->linenr(); typedefInfo.column = typedefToken->column(); + if (Token::Match(typedefToken->next(), "struct|enum|class|union %name% {") && typedefToken->strAt(2) == typedefInfo.name) + typedefInfo.tagToken = typedefToken->tokAt(2); + else + typedefInfo.tagToken = nullptr; typedefInfo.used = t.second.isUsed(); typedefInfo.isFunctionPointer = isFunctionPointer(t.second.nameToken()); if (typedefInfo.isFunctionPointer) { @@ -1638,8 +1642,12 @@ void Tokenizer::simplifyTypedefCpp() TypedefInfo typedefInfo; typedefInfo.name = typeName->str(); typedefInfo.filename = list.file(typeName); - typedefInfo.lineNumber = typeName->linenr(); - typedefInfo.column = typeName->column(); + typedefInfo.lineNumber = typeDef->linenr(); + typedefInfo.column = typeDef->column(); + if (Token::Match(typeDef->next(), "struct|enum|class|union %name% {") && typeDef->strAt(2) == typedefInfo.name) + typedefInfo.tagToken = typeDef->tokAt(2); + else + typedefInfo.tagToken = nullptr; typedefInfo.used = false; typedefInfo.isFunctionPointer = isFunctionPointer(typeName); if (typedefInfo.isFunctionPointer) { @@ -3170,6 +3178,7 @@ bool Tokenizer::simplifyUsing() usingInfo.filename = list.file(nameToken); usingInfo.lineNumber = nameToken->linenr(); usingInfo.column = nameToken->column(); + usingInfo.tagToken = nullptr; usingInfo.used = true; usingInfo.isFunctionPointer = false; mTypedefInfo.push_back(std::move(usingInfo)); @@ -6326,7 +6335,15 @@ std::string Tokenizer::dumpTypedefInfo() const outs += " column=\""; outs += std::to_string(typedefInfo.column); outs += "\""; + if (typedefInfo.tagToken) { + outs += " tagline=\""; + outs += std::to_string(typedefInfo.tagToken->linenr()); + outs += "\""; + outs += " tagcolumn=\""; + outs += std::to_string(typedefInfo.tagToken->column()); + outs += "\""; + } outs += " used=\""; outs += std::to_string(typedefInfo.used?1:0); outs += "\""; diff --git a/lib/tokenize.h b/lib/tokenize.h index 616290e7e2a..c2541cb1c72 100644 --- a/lib/tokenize.h +++ b/lib/tokenize.h @@ -696,6 +696,7 @@ class CPPCHECKLIB Tokenizer { std::string filename; int lineNumber; int column; + const Token* tagToken; bool used; bool isFunctionPointer; std::vector typedefInfoTokens; diff --git a/test/testsimplifytypedef.cpp b/test/testsimplifytypedef.cpp index 087e3759901..e7085f0bc33 100644 --- a/test/testsimplifytypedef.cpp +++ b/test/testsimplifytypedef.cpp @@ -259,6 +259,7 @@ class TestSimplifyTypedef : public TestFixture { TEST_CASE(typedefInfo1); TEST_CASE(typedefInfo2); TEST_CASE(typedefInfo3); + TEST_CASE(typedefInfo4); } class TokenizerTest : public Tokenizer @@ -4609,7 +4610,7 @@ class TestSimplifyTypedef : public TestFixture { " \n" " \n" " \n" - " \n" + " \n" " \n" " \n" " \n" @@ -4638,6 +4639,17 @@ class TestSimplifyTypedef : public TestFixture { "}\n"); ASSERT_EQUALS("",xml); } + + void typedefInfo4() { + const std::string xml = dumpTypedefInfo("typedef struct coord {\n" + " uint16_t x;\n" + " uint16_t y;\n" + "} coord;\n" + "coord c;"); + ASSERT_EQUALS(" \n" + " \n" + " \n", xml); + } }; REGISTER_TEST(TestSimplifyTypedef)