|
22 | 22 |
|
23 | 23 | #include <QXmlStreamReader> |
24 | 24 | #include <QXmlStreamWriter> |
| 25 | +#include <QVariant> |
25 | 26 |
|
26 | 27 | const unsigned int CppcheckLibraryData::Function::Arg::ANY = ~0U; |
27 | 28 | const unsigned int CppcheckLibraryData::Function::Arg::VARIADIC = ~1U; |
@@ -321,6 +322,108 @@ static CppcheckLibraryData::Reflection loadReflection(QXmlStreamReader &xmlReade |
321 | 322 | return reflection; |
322 | 323 | } |
323 | 324 |
|
| 325 | +static CppcheckLibraryData::Markup loadMarkup(QXmlStreamReader &xmlReader) |
| 326 | +{ |
| 327 | + CppcheckLibraryData::Markup markup; |
| 328 | + |
| 329 | + QXmlStreamReader::TokenType type; |
| 330 | + if (xmlReader.attributes().hasAttribute("ext")) { |
| 331 | + markup.ext = xmlReader.attributes().value("ext").toString(); |
| 332 | + } |
| 333 | + else { |
| 334 | + mandatoryAttibuteMissing(xmlReader, "ext"); |
| 335 | + } |
| 336 | + if (xmlReader.attributes().hasAttribute("aftercode")) { |
| 337 | + markup.afterCode = (xmlReader.attributes().value("aftercode") == "true") ? true : false; |
| 338 | + } |
| 339 | + else { |
| 340 | + mandatoryAttibuteMissing(xmlReader, "aftercode"); |
| 341 | + } |
| 342 | + if (xmlReader.attributes().hasAttribute("reporterrors")) { |
| 343 | + markup.reportErrors = (xmlReader.attributes().value("reporterrors") == "true") ? true : false; |
| 344 | + } |
| 345 | + else { |
| 346 | + mandatoryAttibuteMissing(xmlReader, "reporterrors"); |
| 347 | + } |
| 348 | + |
| 349 | + while ((type = xmlReader.readNext()) != QXmlStreamReader::EndElement || |
| 350 | + xmlReader.name().toString() != "markup") { |
| 351 | + if (type != QXmlStreamReader::StartElement) |
| 352 | + continue; |
| 353 | + const QString elementName = xmlReader.name().toString(); |
| 354 | + if (elementName == "keywords") { |
| 355 | + while ((type = xmlReader.readNext()) != QXmlStreamReader::EndElement || |
| 356 | + xmlReader.name().toString() != "keywords") { |
| 357 | + if (type != QXmlStreamReader::StartElement) |
| 358 | + continue; |
| 359 | + if (xmlReader.name().toString() == "keyword") { |
| 360 | + markup.keywords.append(xmlReader.attributes().value("name").toString()); |
| 361 | + } |
| 362 | + else { |
| 363 | + unhandledElement(xmlReader); |
| 364 | + } |
| 365 | + } |
| 366 | + } else if (elementName == "codeblocks") { |
| 367 | + CppcheckLibraryData::Markup::CodeBlocks codeBlock; |
| 368 | + |
| 369 | + while ((type = xmlReader.readNext()) != QXmlStreamReader::EndElement || |
| 370 | + xmlReader.name().toString() != "codeblocks") { |
| 371 | + if (type != QXmlStreamReader::StartElement) |
| 372 | + continue; |
| 373 | + if (xmlReader.name().toString() == "block") { |
| 374 | + codeBlock.blocks.append(xmlReader.attributes().value("name").toString()); |
| 375 | + } |
| 376 | + else if (xmlReader.name().toString() == "structure") { |
| 377 | + codeBlock.offset = xmlReader.attributes().value("offset").toInt(); |
| 378 | + codeBlock.start = xmlReader.attributes().value("start").toString(); |
| 379 | + codeBlock.end = xmlReader.attributes().value("end").toString(); |
| 380 | + } |
| 381 | + else { |
| 382 | + unhandledElement(xmlReader); |
| 383 | + } |
| 384 | + } |
| 385 | + markup.codeBlocks.append(codeBlock); |
| 386 | + } else if (elementName == "exported") { |
| 387 | + CppcheckLibraryData::Markup::Exporter exporter; |
| 388 | + |
| 389 | + while ((type = xmlReader.readNext()) != QXmlStreamReader::EndElement || |
| 390 | + xmlReader.name().toString() != "exported") { |
| 391 | + if (type != QXmlStreamReader::StartElement) |
| 392 | + continue; |
| 393 | + if (xmlReader.name().toString() == "exporter") { |
| 394 | + exporter.prefix = xmlReader.attributes().value("prefix").toString(); |
| 395 | + } |
| 396 | + else if (xmlReader.name().toString() == "prefix") { |
| 397 | + exporter.prefixList.append(xmlReader.readElementText()); |
| 398 | + } |
| 399 | + else if (xmlReader.name().toString() == "suffix") { |
| 400 | + exporter.suffixList.append(xmlReader.readElementText()); |
| 401 | + } |
| 402 | + else { |
| 403 | + unhandledElement(xmlReader); |
| 404 | + } |
| 405 | + } |
| 406 | + markup.exporter.append(exporter); |
| 407 | + } else if (elementName == "imported") { |
| 408 | + while ((type = xmlReader.readNext()) != QXmlStreamReader::EndElement || |
| 409 | + xmlReader.name().toString() != "imported") { |
| 410 | + if (type != QXmlStreamReader::StartElement) |
| 411 | + continue; |
| 412 | + if (xmlReader.name().toString() == "importer") { |
| 413 | + markup.importer.append(xmlReader.readElementText()); |
| 414 | + } |
| 415 | + else { |
| 416 | + unhandledElement(xmlReader); |
| 417 | + } |
| 418 | + } |
| 419 | + } else { |
| 420 | + unhandledElement(xmlReader); |
| 421 | + } |
| 422 | + } |
| 423 | + |
| 424 | + return markup; |
| 425 | +} |
| 426 | + |
324 | 427 | QString CppcheckLibraryData::open(QIODevice &file) |
325 | 428 | { |
326 | 429 | clear(); |
@@ -359,6 +462,8 @@ QString CppcheckLibraryData::open(QIODevice &file) |
359 | 462 | platformTypes.append(loadPlatformType(xmlReader)); |
360 | 463 | else if (elementName == "reflection") |
361 | 464 | reflections.append(loadReflection(xmlReader)); |
| 465 | + else if (elementName == "markup") |
| 466 | + markups.append(loadMarkup(xmlReader)); |
362 | 467 | else |
363 | 468 | unhandledElement(xmlReader); |
364 | 469 | } catch (std::runtime_error &e) { |
@@ -630,6 +735,68 @@ static void writeReflection(QXmlStreamWriter &xmlWriter, const CppcheckLibraryDa |
630 | 735 | xmlWriter.writeEndElement(); |
631 | 736 | } |
632 | 737 |
|
| 738 | +static void writeMarkup(QXmlStreamWriter &xmlWriter, const CppcheckLibraryData::Markup &mup) |
| 739 | +{ |
| 740 | + xmlWriter.writeStartElement("markup"); |
| 741 | + xmlWriter.writeAttribute("ext", mup.ext); |
| 742 | + xmlWriter.writeAttribute("aftercode", QVariant(mup.afterCode).toString()); |
| 743 | + xmlWriter.writeAttribute("reporterrors", QVariant(mup.reportErrors).toString()); |
| 744 | + if (!mup.keywords.isEmpty()) { |
| 745 | + xmlWriter.writeStartElement("keywords"); |
| 746 | + foreach (const QString &keyword, mup.keywords) { |
| 747 | + xmlWriter.writeStartElement("keyword"); |
| 748 | + xmlWriter.writeAttribute("name", keyword); |
| 749 | + xmlWriter.writeEndElement(); |
| 750 | + } |
| 751 | + xmlWriter.writeEndElement(); |
| 752 | + } |
| 753 | + if (!mup.importer.isEmpty()) { |
| 754 | + xmlWriter.writeStartElement("imported"); |
| 755 | + foreach (const QString &import, mup.importer) { |
| 756 | + xmlWriter.writeStartElement("importer"); |
| 757 | + xmlWriter.writeCharacters(import); |
| 758 | + xmlWriter.writeEndElement(); |
| 759 | + } |
| 760 | + xmlWriter.writeEndElement(); |
| 761 | + } |
| 762 | + if (!mup.exporter.isEmpty()) { |
| 763 | + xmlWriter.writeStartElement("exported"); |
| 764 | + foreach (const CppcheckLibraryData::Markup::Exporter exporter, mup.exporter) { |
| 765 | + xmlWriter.writeStartElement("exporter"); |
| 766 | + xmlWriter.writeAttribute("prefix", exporter.prefix); |
| 767 | + foreach (const QString &prefix, exporter.prefixList) { |
| 768 | + xmlWriter.writeStartElement("prefix"); |
| 769 | + xmlWriter.writeCharacters(prefix); |
| 770 | + xmlWriter.writeEndElement(); |
| 771 | + } |
| 772 | + foreach (const QString &suffix, exporter.suffixList) { |
| 773 | + xmlWriter.writeStartElement("suffix"); |
| 774 | + xmlWriter.writeCharacters(suffix); |
| 775 | + xmlWriter.writeEndElement(); |
| 776 | + } |
| 777 | + xmlWriter.writeEndElement(); |
| 778 | + } |
| 779 | + xmlWriter.writeEndElement(); |
| 780 | + } |
| 781 | + if (!mup.codeBlocks.isEmpty()) { |
| 782 | + foreach (const CppcheckLibraryData::Markup::CodeBlocks codeblock, mup.codeBlocks) { |
| 783 | + xmlWriter.writeStartElement("codeblocks"); |
| 784 | + foreach (const QString &block, codeblock.blocks) { |
| 785 | + xmlWriter.writeStartElement("block"); |
| 786 | + xmlWriter.writeAttribute("name", block); |
| 787 | + xmlWriter.writeEndElement(); |
| 788 | + } |
| 789 | + xmlWriter.writeStartElement("structure"); |
| 790 | + xmlWriter.writeAttribute("offset", QString("%1").arg(codeblock.offset)); |
| 791 | + xmlWriter.writeAttribute("start", codeblock.start); |
| 792 | + xmlWriter.writeAttribute("end", codeblock.end); |
| 793 | + xmlWriter.writeEndElement(); |
| 794 | + xmlWriter.writeEndElement(); |
| 795 | + } |
| 796 | + } |
| 797 | + xmlWriter.writeEndElement(); |
| 798 | +} |
| 799 | + |
633 | 800 | QString CppcheckLibraryData::toString() const |
634 | 801 | { |
635 | 802 | QString outputString; |
@@ -695,6 +862,10 @@ QString CppcheckLibraryData::toString() const |
695 | 862 | writeReflection(xmlWriter, refl); |
696 | 863 | } |
697 | 864 |
|
| 865 | + foreach (const Markup &mup, markups) { |
| 866 | + writeMarkup(xmlWriter, mup); |
| 867 | + } |
| 868 | + |
698 | 869 | xmlWriter.writeEndElement(); |
699 | 870 |
|
700 | 871 | return outputString; |
|
0 commit comments