void Dumper::dumpProjectInfos( const QList<CppModelManagerInterface::ProjectInfo> &projectInfos)
{
    const QByteArray i1 = indent(1);
    const QByteArray i2 = indent(2);
    const QByteArray i3 = indent(3);
    const QByteArray i4 = indent(4);

    m_out << "Projects loaded: " << projectInfos.size() << "{{{1\n";
    foreach (const CppModelManagerInterface::ProjectInfo &info, projectInfos) {
        const QPointer<ProjectExplorer::Project> project = info.project();
        m_out << i1 << "Project " << project->displayName()
              << " (" << project->projectFilePath().toUserOutput() << "){{{2\n";

        const QList<ProjectPart::Ptr> projectParts = info.projectParts();
        foreach (const ProjectPart::Ptr &part, projectParts) {
            QString projectName = QLatin1String("<None>");
            QString projectFilePath = QLatin1String("<None>");
            if (ProjectExplorer::Project *project = part->project) {
                projectName = project->displayName();
                projectFilePath = project->projectFilePath().toUserOutput();
            }
            if (!part->projectConfigFile.isEmpty())
                m_out << i3 << "Project Config File: " << part->projectConfigFile << "\n";
            m_out << i2 << "Project Part \"" << part->projectFile << "\"{{{3\n";
            m_out << i3 << "Project Part Name  : " << part->displayName << "\n";
            m_out << i3 << "Project Name       : " << projectName << "\n";
            m_out << i3 << "Project File       : " << projectFilePath << "\n";
            m_out << i3 << "C Version          : " << Utils::toString(part->cVersion) << "\n";
            m_out << i3 << "CXX Version        : " << Utils::toString(part->cxxVersion) << "\n";
            m_out << i3 << "CXX Extensions     : " << Utils::toString(part->cxxExtensions) << "\n";
            m_out << i3 << "Qt Version         : " << Utils::toString(part->qtVersion) << "\n";

            if (!part->files.isEmpty()) {
                m_out << i3 << "Files:{{{4\n";
                foreach (const ProjectFile &projectFile, part->files) {
                    m_out << i4 << Utils::toString(projectFile.kind) << ": " << projectFile.path
                          << "\n";
                }
            }

            if (!part->toolchainDefines.isEmpty()) {
                m_out << i3 << "Toolchain Defines:{{{4\n";
                const QList<QByteArray> defineLines = part->toolchainDefines.split('\n');
                foreach (const QByteArray &defineLine, defineLines)
                    m_out << i4 << defineLine << "\n";
            }