aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2019-11-12 10:44:30 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2019-11-15 11:16:13 +0100
commitf91914b75aac2acd61ca2e1310c0523f78130171 (patch)
treed6e9a2b0aca0ffb256854a3d4ce29d580b8477bd
parent9045e2b2c4de9427a9d97f6a270bb844f8ad8da7 (diff)
shiboken/Doc generator: Refactor the Table class
Use QVector and no longer inherit the container. Change-Id: I7ab9df4cefa408c01324d88737d639b80b45fc48 Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
-rw-r--r--sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp77
-rw-r--r--sources/shiboken2/generator/qtdoc/qtdocgenerator.h20
2 files changed, 55 insertions, 42 deletions
diff --git a/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp b/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp
index 672148d64..339669758 100644
--- a/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp
+++ b/sources/shiboken2/generator/qtdoc/qtdocgenerator.cpp
@@ -847,7 +847,7 @@ void QtXmlToSphinx::handleTableTag(QXmlStreamReader& reader)
m_tableHasHeader = false;
} else if (token == QXmlStreamReader::EndElement) {
// write the table on m_output
- m_currentTable.enableHeader(m_tableHasHeader);
+ m_currentTable.setHeaderEnabled(m_tableHasHeader);
m_currentTable.normalize();
m_output << ensureEndl << m_currentTable;
m_currentTable.clear();
@@ -864,7 +864,7 @@ void QtXmlToSphinx::handleTermTag(QXmlStreamReader& reader)
} else if (token == QXmlStreamReader::EndElement) {
TableCell cell;
cell.data = popOutputBuffer().trimmed();
- m_currentTable << (TableRow() << cell);
+ m_currentTable.appendRow(TableRow(1, cell));
}
}
@@ -874,7 +874,7 @@ void QtXmlToSphinx::handleItemTag(QXmlStreamReader& reader)
QXmlStreamReader::TokenType token = reader.tokenType();
if (token == QXmlStreamReader::StartElement) {
if (m_currentTable.isEmpty())
- m_currentTable << TableRow();
+ m_currentTable.appendRow({});
TableRow& row = m_currentTable.last();
TableCell cell;
cell.colSpan = reader.attributes().value(QLatin1String("colspan")).toShort();
@@ -896,7 +896,7 @@ void QtXmlToSphinx::handleRowTag(QXmlStreamReader& reader)
QXmlStreamReader::TokenType token = reader.tokenType();
if (token == QXmlStreamReader::StartElement) {
m_tableHasHeader = reader.name() == QLatin1String("header");
- m_currentTable << TableRow();
+ m_currentTable.appendRow({});
}
}
@@ -919,8 +919,8 @@ void QtXmlToSphinx::handleListTag(QXmlStreamReader& reader)
if (token == QXmlStreamReader::StartElement) {
listType = webXmlListType(reader.attributes().value(QLatin1String("type")));
if (listType == EnumeratedList) {
- m_currentTable << TableRow{TableCell(QLatin1String("Constant")),
- TableCell(QLatin1String("Description"))};
+ m_currentTable.appendRow(TableRow{TableCell(QLatin1String("Constant")),
+ TableCell(QLatin1String("Description"))});
m_tableHasHeader = true;
}
INDENT.indent--;
@@ -943,7 +943,7 @@ void QtXmlToSphinx::handleListTag(QXmlStreamReader& reader)
}
break;
case EnumeratedList:
- m_currentTable.enableHeader(m_tableHasHeader);
+ m_currentTable.setHeaderEnabled(m_tableHasHeader);
m_currentTable.normalize();
m_output << ensureEndl << m_currentTable;
break;
@@ -1328,53 +1328,49 @@ void QtXmlToSphinx::Table::normalize()
if (m_normalized || isEmpty())
return;
- int row;
- int col;
- QtXmlToSphinx::Table& self = *this;
-
//QDoc3 generates tables with wrong number of columns. We have to
//check and if necessary, merge the last columns.
int maxCols = -1;
- for (const auto &row : qAsConst(self)) {
+ for (const auto &row : qAsConst(m_rows)) {
if (row.count() > maxCols)
maxCols = row.count();
}
if (maxCols <= 0)
return;
// add col spans
- for (row = 0; row < count(); ++row) {
- for (col = 0; col < at(row).count(); ++col) {
- QtXmlToSphinx::TableCell& cell = self[row][col];
+ for (int row = 0; row < m_rows.count(); ++row) {
+ for (int col = 0; col < m_rows.at(row).count(); ++col) {
+ QtXmlToSphinx::TableCell& cell = m_rows[row][col];
bool mergeCols = (col >= maxCols);
if (cell.colSpan > 0) {
QtXmlToSphinx::TableCell newCell;
newCell.colSpan = -1;
for (int i = 0, max = cell.colSpan-1; i < max; ++i) {
- self[row].insert(col+1, newCell);
+ m_rows[row].insert(col + 1, newCell);
}
cell.colSpan = 0;
col++;
} else if (mergeCols) {
- self[row][maxCols - 1].data += QLatin1Char(' ') + cell.data;
+ m_rows[row][maxCols - 1].data += QLatin1Char(' ') + cell.data;
}
}
}
// row spans
- const int numCols = first().count();
- for (col = 0; col < numCols; ++col) {
- for (row = 0; row < count(); ++row) {
- if (col < self[row].count()) {
- QtXmlToSphinx::TableCell& cell = self[row][col];
+ const int numCols = m_rows.constFirst().count();
+ for (int col = 0; col < numCols; ++col) {
+ for (int row = 0; row < m_rows.count(); ++row) {
+ if (col < m_rows[row].count()) {
+ QtXmlToSphinx::TableCell& cell = m_rows[row][col];
if (cell.rowSpan > 0) {
QtXmlToSphinx::TableCell newCell;
newCell.rowSpan = -1;
int targetRow = row + 1;
const int targetEndRow =
- std::min(targetRow + cell.rowSpan - 1, count());
+ std::min(targetRow + cell.rowSpan - 1, m_rows.count());
cell.rowSpan = 0;
for ( ; targetRow < targetEndRow; ++targetRow)
- self[targetRow].insert(col, newCell);
+ m_rows[targetRow].insert(col, newCell);
row++;
}
}
@@ -1385,20 +1381,26 @@ void QtXmlToSphinx::Table::normalize()
QTextStream& operator<<(QTextStream& s, const QtXmlToSphinx::Table &table)
{
- if (table.isEmpty())
- return s;
+ table.format(s);
+ return s;
+}
+
+void QtXmlToSphinx::Table::format (QTextStream& s) const
+{
+ if (isEmpty())
+ return;
- if (!table.isNormalized()) {
+ if (!isNormalized()) {
qCDebug(lcShiboken) << "Attempt to print an unnormalized table!";
- return s;
+ return;
}
// calc width and height of each column and row
- const int headerColumnCount = table.constFirst().count();
+ const int headerColumnCount = m_rows.constFirst().count();
QVector<int> colWidths(headerColumnCount);
- QVector<int> rowHeights(table.count());
- for (int i = 0, maxI = table.count(); i < maxI; ++i) {
- const QtXmlToSphinx::TableRow& row = table[i];
+ QVector<int> rowHeights(m_rows.count());
+ for (int i = 0, maxI = m_rows.count(); i < maxI; ++i) {
+ const QtXmlToSphinx::TableRow& row = m_rows.at(i);
for (int j = 0, maxJ = std::min(row.count(), colWidths.size()); j < maxJ; ++j) {
const QVector<QStringRef> rowLines = row[j].data.splitRef(QLatin1Char('\n')); // cache this would be a good idea
for (const QStringRef &str : rowLines)
@@ -1408,7 +1410,7 @@ QTextStream& operator<<(QTextStream& s, const QtXmlToSphinx::Table &table)
}
if (!*std::max_element(colWidths.begin(), colWidths.end()))
- return s; // empty table (table with empty cells)
+ return; // empty table (table with empty cells)
// create a horizontal line to be used later.
QString horizontalLine = QLatin1String("+");
@@ -1418,8 +1420,8 @@ QTextStream& operator<<(QTextStream& s, const QtXmlToSphinx::Table &table)
}
// write table rows
- for (int i = 0, maxI = table.count(); i < maxI; ++i) { // for each row
- const QtXmlToSphinx::TableRow& row = table[i];
+ for (int i = 0, maxI = m_rows.count(); i < maxI; ++i) { // for each row
+ const QtXmlToSphinx::TableRow& row = m_rows.at(i);
// print line
s << INDENT << '+';
@@ -1427,7 +1429,7 @@ QTextStream& operator<<(QTextStream& s, const QtXmlToSphinx::Table &table)
char c;
if (col >= row.length() || row[col].rowSpan == -1)
c = ' ';
- else if (i == 1 && table.hasHeader())
+ else if (i == 1 && hasHeader())
c = '=';
else
c = '-';
@@ -1461,7 +1463,6 @@ QTextStream& operator<<(QTextStream& s, const QtXmlToSphinx::Table &table)
}
s << INDENT << horizontalLine << endl;
s << endl;
- return s;
}
static QString getFuncName(const AbstractMetaFunction* cppFunc) {
@@ -2159,7 +2160,7 @@ static void writeFancyToc(QTextStream& s, const QStringList& items, int cols = 4
currentColData.clear();
i = 0;
}
- table << row;
+ table.appendRow(row);
table.normalize();
s << ".. container:: pysidetoc" << endl << endl;
s << table;
diff --git a/sources/shiboken2/generator/qtdoc/qtdocgenerator.h b/sources/shiboken2/generator/qtdoc/qtdocgenerator.h
index 53e292d22..56cb9c4bb 100644
--- a/sources/shiboken2/generator/qtdoc/qtdocgenerator.h
+++ b/sources/shiboken2/generator/qtdoc/qtdocgenerator.h
@@ -67,13 +67,16 @@ public:
TableCell(const char* text) : data(QLatin1String(text)) {}
};
- using TableRow = QList<TableCell>;
- class Table : public QList<TableRow>
+ using TableRow = QVector<TableCell>;
+
+ class Table
{
public:
Table() = default;
- void enableHeader(bool enable)
+ bool isEmpty() const { return m_rows.isEmpty(); }
+
+ void setHeaderEnabled(bool enable)
{
m_hasHeader = enable;
}
@@ -92,10 +95,19 @@ public:
void clear() {
m_normalized = false;
- QList<TableRow>::clear();
+ m_rows.clear();
}
+ void appendRow(const TableRow &row) { m_rows.append(row); }
+
+ const TableRow &constFirst() { return m_rows.constFirst(); }
+ TableRow &first() { return m_rows.first(); }
+ TableRow &last() { return m_rows.last(); }
+
+ void format (QTextStream& s) const;
+
private:
+ QVector<TableRow> m_rows;
bool m_hasHeader = false;
bool m_normalized = false;
};