Skip to content

Commit 379f8c8

Browse files
authored
Fix #13952 (dumpfile: the action and yield for container methods) (danmar#7609)
1 parent 7504064 commit 379f8c8

File tree

5 files changed

+112
-4
lines changed

5 files changed

+112
-4
lines changed

lib/library.cpp

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,66 @@ Library::Container::Action Library::Container::actionFrom(const std::string& act
310310
return Container::Action::NO_ACTION;
311311
}
312312

313+
std::string Library::Container::toString(Library::Container::Yield yield)
314+
{
315+
switch (yield) {
316+
case Library::Container::Yield::AT_INDEX:
317+
return "at_index";
318+
case Library::Container::Yield::ITEM:
319+
return "item";
320+
case Library::Container::Yield::BUFFER:
321+
return "buffer";
322+
case Library::Container::Yield::BUFFER_NT:
323+
return "buffer-nt";
324+
case Library::Container::Yield::START_ITERATOR:
325+
return "start-iterator";
326+
case Library::Container::Yield::END_ITERATOR:
327+
return "end-iterator";
328+
case Library::Container::Yield::ITERATOR:
329+
return "iterator";
330+
case Library::Container::Yield::SIZE:
331+
return "size";
332+
case Library::Container::Yield::EMPTY:
333+
return "empty";
334+
case Library::Container::Yield::NO_YIELD:
335+
break;
336+
}
337+
return "";
338+
}
339+
340+
std::string Library::Container::toString(Library::Container::Action action)
341+
{
342+
switch (action) {
343+
case Library::Container::Action::RESIZE:
344+
return "resize";
345+
case Library::Container::Action::CLEAR:
346+
return "clear";
347+
case Library::Container::Action::PUSH:
348+
return "push";
349+
case Library::Container::Action::POP:
350+
return "pop";
351+
case Library::Container::Action::FIND:
352+
return "find";
353+
case Library::Container::Action::FIND_CONST:
354+
return "find-const";
355+
case Library::Container::Action::INSERT:
356+
return "insert";
357+
case Library::Container::Action::ERASE:
358+
return "erase";
359+
case Library::Container::Action::APPEND:
360+
return "append";
361+
case Library::Container::Action::CHANGE_CONTENT:
362+
return "change-content";
363+
case Library::Container::Action::CHANGE:
364+
return "change";
365+
case Library::Container::Action::CHANGE_INTERNAL:
366+
return "change-internal";
367+
case Library::Container::Action::NO_ACTION:
368+
break;
369+
}
370+
return "";
371+
}
372+
313373
Library::Error Library::load(const tinyxml2::XMLDocument &doc)
314374
{
315375
const tinyxml2::XMLElement * const rootnode = doc.FirstChildElement();

lib/library.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,8 +259,10 @@ class CPPCHECKLIB Library {
259259
return (i != functions.end()) ? i->second.returnType : mEmptyString;
260260
}
261261

262-
static Yield yieldFrom(const std::string& yieldName);
263-
static Action actionFrom(const std::string& actionName);
262+
CPPCHECKLIB static Yield yieldFrom(const std::string& yieldName);
263+
CPPCHECKLIB static Action actionFrom(const std::string& actionName);
264+
CPPCHECKLIB static std::string toString(Yield yield);
265+
CPPCHECKLIB static std::string toString(Action action);
264266
};
265267
const std::unordered_map<std::string, Container>& containers() const;
266268
const Container* detectContainer(const Token* typeStart) const;

lib/tokenize.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6202,8 +6202,23 @@ void Tokenizer::dump(std::ostream &out) const
62026202
outs += "\" ";
62036203
outs += "std-string-like=\"";
62046204
outs += bool_to_string(c->stdStringLike);
6205-
outs += "\"/>";
6206-
outs += '\n';
6205+
outs += "\"";
6206+
if (c->functions.empty()) {
6207+
outs += "/>\n";
6208+
continue;
6209+
}
6210+
outs += ">\n";
6211+
for (const auto& fp: c->functions) {
6212+
std::string action;
6213+
std::string yield;
6214+
if (fp.second.action != Library::Container::Action::NO_ACTION)
6215+
action = " action=\"" + Library::Container::toString(fp.second.action) + "\"";
6216+
if (fp.second.yield != Library::Container::Yield::NO_YIELD)
6217+
yield = " yield=\"" + Library::Container::toString(fp.second.yield) + "\"";
6218+
if (!action.empty() || !yield.empty())
6219+
outs += " <f name=\"" + fp.first + "\"" + action + yield + "/>\n";
6220+
}
6221+
outs += " </container>\n";
62076222
}
62086223
outs += " </containers>";
62096224
outs += '\n';

test/cli/dumpfile_test.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,3 +119,16 @@ def test_duplicate_file_entries(tmpdir): #13333
119119
assert os.path.isfile(test_file + '.dump')
120120
assert os.path.isfile(test_file + '.1.dump')
121121

122+
123+
def test_container_methods(tmpdir):
124+
test_file = str(tmpdir / 'test.cpp')
125+
with open(test_file, 'wt') as f:
126+
f.write('std::string s;\n')
127+
128+
exitcode, _, stderr = cppcheck(['--dump', '.'], cwd=str(tmpdir))
129+
assert exitcode == 0, stderr
130+
131+
dumpfile = test_file + '.dump'
132+
with open(dumpfile, 'rt') as f:
133+
dump = f.read()
134+
assert '<f name="emplace" action="push" yield="iterator"/>' in dump

test/testlibrary.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ class TestLibrary : public TestFixture {
6464
TEST_CASE(resource);
6565
TEST_CASE(podtype);
6666
TEST_CASE(container);
67+
TEST_CASE(containerActionToFromString);
68+
TEST_CASE(containerYieldToFromString);
6769
TEST_CASE(version);
6870
TEST_CASE(loadLibErrors);
6971
TEST_CASE(loadLibCombinations);
@@ -1036,6 +1038,22 @@ class TestLibrary : public TestFixture {
10361038
}
10371039
}
10381040

1041+
void containerActionToFromString() const {
1042+
for (uint16_t i = 0; i < static_cast<uint16_t>(Library::Container::Action::NO_ACTION); ++i) {
1043+
const auto a = static_cast<Library::Container::Action>(i);
1044+
const std::string& s = Library::Container::toString(a);
1045+
ASSERT_EQUALS(i, static_cast<uint16_t>(Library::Container::actionFrom(s)));
1046+
}
1047+
}
1048+
1049+
void containerYieldToFromString() const {
1050+
for (uint16_t i = 0; i < static_cast<uint16_t>(Library::Container::Yield::NO_YIELD); ++i) {
1051+
const auto y = static_cast<Library::Container::Yield>(i);
1052+
const std::string& s = Library::Container::toString(y);
1053+
ASSERT_EQUALS(i, static_cast<uint16_t>(Library::Container::yieldFrom(s)));
1054+
}
1055+
}
1056+
10391057
template<std::size_t size>
10401058
void loadLibError(const char (&xmldata)[size], Library::ErrorCode errorcode, const char* file, unsigned line) const {
10411059
Library library;

0 commit comments

Comments
 (0)