uic: Refactor DOM class lookup in class Driver

Change the API to take const Dom * classes and use a helper
function to do the insertion.

Task-number: PYSIDE-797
Change-Id: I079f5c92bae85d6246c14077db06e381b572cda5
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
bb10
Friedemann Kleint 2018-11-29 14:41:20 +01:00
parent 4aac7b92c4
commit e6d1071dd3
3 changed files with 55 additions and 62 deletions

View File

@ -2404,9 +2404,9 @@ QString WriteInitialization::findDeclaration(const QString &name)
{
const QString normalized = Driver::normalizedName(name);
if (DomWidget *widget = m_driver->widgetByName(normalized))
if (const DomWidget *widget = m_driver->widgetByName(normalized))
return m_driver->findOrInsertWidget(widget);
if (DomAction *action = m_driver->actionByName(normalized))
if (const DomAction *action = m_driver->actionByName(normalized))
return m_driver->findOrInsertAction(action);
if (const DomButtonGroup *group = m_driver->findButtonGroup(normalized))
return m_driver->findOrInsertButtonGroup(group);

View File

@ -45,39 +45,37 @@ Driver::Driver()
Driver::~Driver() = default;
QString Driver::findOrInsertWidget(DomWidget *ui_widget)
{
if (!m_widgets.contains(ui_widget))
m_widgets.insert(ui_widget, unique(ui_widget->attributeName(), ui_widget->attributeClass()));
static inline QString spacerItemClass() { return QStringLiteral("QSpacerItem"); }
static inline QString actionGroupClass() { return QStringLiteral("QActionGroup"); }
static inline QString actionClass() { return QStringLiteral("QAction"); }
static inline QString buttonGroupClass() { return QStringLiteral("QButtonGroup"); }
return m_widgets.value(ui_widget);
template <class DomClass>
QString Driver::findOrInsert(DomObjectHash<DomClass> *domHash, const DomClass *dom,
const QString &className)
{
auto it = domHash->find(dom);
if (it == domHash->end())
it = domHash->insert(dom, this->unique(dom->attributeName(), className));
return it.value();
}
QString Driver::findOrInsertSpacer(DomSpacer *ui_spacer)
QString Driver::findOrInsertWidget(const DomWidget *ui_widget)
{
if (!m_spacers.contains(ui_spacer)) {
QString name;
if (ui_spacer->hasAttributeName())
name = ui_spacer->attributeName();
m_spacers.insert(ui_spacer, unique(name, QLatin1String("QSpacerItem")));
}
return m_spacers.value(ui_spacer);
return findOrInsert(&m_widgets, ui_widget, ui_widget->attributeClass());
}
QString Driver::findOrInsertLayout(DomLayout *ui_layout)
QString Driver::findOrInsertSpacer(const DomSpacer *ui_spacer)
{
if (!m_layouts.contains(ui_layout)) {
QString name;
if (ui_layout->hasAttributeName())
name = ui_layout->attributeName();
m_layouts.insert(ui_layout, unique(name, ui_layout->attributeClass()));
}
return m_layouts.value(ui_layout);
return findOrInsert(&m_spacers, ui_spacer, spacerItemClass());
}
QString Driver::findOrInsertLayoutItem(DomLayoutItem *ui_layoutItem)
QString Driver::findOrInsertLayout(const DomLayout *ui_layout)
{
return findOrInsert(&m_layouts, ui_layout, ui_layout->attributeClass());
}
QString Driver::findOrInsertLayoutItem(const DomLayoutItem *ui_layoutItem)
{
switch (ui_layoutItem->kind()) {
case DomLayoutItem::Widget:
@ -95,38 +93,29 @@ QString Driver::findOrInsertLayoutItem(DomLayoutItem *ui_layoutItem)
return QString();
}
QString Driver::findOrInsertActionGroup(DomActionGroup *ui_group)
QString Driver::findOrInsertActionGroup(const DomActionGroup *ui_group)
{
if (!m_actionGroups.contains(ui_group))
m_actionGroups.insert(ui_group, unique(ui_group->attributeName(), QLatin1String("QActionGroup")));
return m_actionGroups.value(ui_group);
return findOrInsert(&m_actionGroups, ui_group, actionGroupClass());
}
QString Driver::findOrInsertAction(DomAction *ui_action)
QString Driver::findOrInsertAction(const DomAction *ui_action)
{
if (!m_actions.contains(ui_action))
m_actions.insert(ui_action, unique(ui_action->attributeName(), QLatin1String("QAction")));
return m_actions.value(ui_action);
return findOrInsert(&m_actions, ui_action, actionClass());
}
QString Driver::findOrInsertButtonGroup(const DomButtonGroup *ui_group)
{
ButtonGroupNameHash::iterator it = m_buttonGroups.find(ui_group);
if (it == m_buttonGroups.end())
it = m_buttonGroups.insert(ui_group, unique(ui_group->attributeName(), QLatin1String("QButtonGroup")));
return it.value();
return findOrInsert(&m_buttonGroups, ui_group, buttonGroupClass());
}
// Find a group by its non-uniqified name
const DomButtonGroup *Driver::findButtonGroup(const QString &attributeName) const
{
const ButtonGroupNameHash::const_iterator cend = m_buttonGroups.constEnd();
for (ButtonGroupNameHash::const_iterator it = m_buttonGroups.constBegin(); it != cend; ++it)
for (auto it = m_buttonGroups.cbegin(), end = m_buttonGroups.cend(); it != end; ++it) {
if (it.key()->attributeName() == attributeName)
return it.key();
return 0;
}
return nullptr;
}
@ -297,17 +286,17 @@ bool Driver::uic(const QString &fileName, QTextStream *out)
return rtn;
}
DomWidget *Driver::widgetByName(const QString &name) const
const DomWidget *Driver::widgetByName(const QString &name) const
{
return m_widgets.key(name);
}
DomActionGroup *Driver::actionGroupByName(const QString &name) const
const DomActionGroup *Driver::actionGroupByName(const QString &name) const
{
return m_actionGroups.key(name);
}
DomAction *Driver::actionByName(const QString &name) const
const DomAction *Driver::actionByName(const QString &name) const
{
return m_actions.key(name);
}

View File

@ -73,37 +73,41 @@ public:
const QString &className=QString());
// symbol table
QString findOrInsertWidget(DomWidget *ui_widget);
QString findOrInsertSpacer(DomSpacer *ui_spacer);
QString findOrInsertLayout(DomLayout *ui_layout);
QString findOrInsertLayoutItem(DomLayoutItem *ui_layoutItem);
QString findOrInsertWidget(const DomWidget *ui_widget);
QString findOrInsertSpacer(const DomSpacer *ui_spacer);
QString findOrInsertLayout(const DomLayout *ui_layout);
QString findOrInsertLayoutItem(const DomLayoutItem *ui_layoutItem);
QString findOrInsertName(const QString &name);
QString findOrInsertActionGroup(DomActionGroup *ui_group);
QString findOrInsertAction(DomAction *ui_action);
QString findOrInsertActionGroup(const DomActionGroup *ui_group);
QString findOrInsertAction(const DomAction *ui_action);
QString findOrInsertButtonGroup(const DomButtonGroup *ui_group);
// Find a group by its non-uniqified name
const DomButtonGroup *findButtonGroup(const QString &attributeName) const;
DomWidget *widgetByName(const QString &name) const;
DomActionGroup *actionGroupByName(const QString &name) const;
DomAction *actionByName(const QString &name) const;
const DomWidget *widgetByName(const QString &name) const;
const DomActionGroup *actionGroupByName(const QString &name) const;
const DomAction *actionByName(const QString &name) const;
bool useIdBasedTranslations() const { return m_idBasedTranslations; }
void setUseIdBasedTranslations(bool u) { m_idBasedTranslations = u; }
private:
template <class DomClass> using DomObjectHash = QHash<const DomClass *, QString>;
template <class DomClass>
QString findOrInsert(DomObjectHash<DomClass> *domHash, const DomClass *dom, const QString &className);
Option m_option;
QTextStream m_stdout;
QTextStream *m_output;
// symbol tables
QHash<DomWidget*, QString> m_widgets;
QHash<DomSpacer*, QString> m_spacers;
QHash<DomLayout*, QString> m_layouts;
QHash<DomActionGroup*, QString> m_actionGroups;
typedef QHash<const DomButtonGroup*, QString> ButtonGroupNameHash;
ButtonGroupNameHash m_buttonGroups;
QHash<DomAction*, QString> m_actions;
DomObjectHash<DomWidget> m_widgets;
DomObjectHash<DomSpacer> m_spacers;
DomObjectHash<DomLayout> m_layouts;
DomObjectHash<DomActionGroup> m_actionGroups;
DomObjectHash<DomButtonGroup> m_buttonGroups;
DomObjectHash<DomAction> m_actions;
QHash<QString, bool> m_nameRepository;
bool m_idBasedTranslations = false;
};