13#include <qtextstream.h>
19using namespace Qt::StringLiterals;
25static inline QString
moduleHeader(
const QString &module,
const QString &header)
41 const QLatin1StringView namespaceDelimiter =
"::"_L1;
43 const QString klass = QLatin1StringView(e.klass);
44 const QString module = QLatin1StringView(e.module);
45 QLatin1StringView header(e
.header);
46 if (klass.contains(namespaceDelimiter)) {
47 m_classToHeader.insert(klass, moduleHeader(module, header));
49 const QString newHeader = moduleHeader(module, klass);
50 m_classToHeader.insert(klass, newHeader);
51 m_oldHeaderToNewHeader.insert(header, newHeader);
58 m_localIncludes.clear();
59 m_globalIncludes.clear();
60 m_includeBaseNames.clear();
64 const auto includeFile = uic()->option().includeFile;
65 if (!includeFile.isEmpty())
66 m_globalIncludes.insert(includeFile);
68 writeHeaders(m_globalIncludes,
true);
69 writeHeaders(m_localIncludes,
false);
74void WriteIncludes::insertIncludeForClass(
const QString &className, QString header,
bool global)
80 if (!header.isEmpty())
84 const StringMap::const_iterator it = m_classToHeader.constFind(className);
85 if (it != m_classToHeader.constEnd()) {
93 QString lowerClassName = className.toLower();
94 static const auto namespaceSeparator =
"::"_L1;
95 const auto namespaceIndex = lowerClassName.lastIndexOf(namespaceSeparator);
96 if (namespaceIndex != -1)
97 lowerClassName.remove(0, namespaceIndex + namespaceSeparator.size());
98 if (m_includeBaseNames.contains(lowerClassName)) {
104 if (!uic()->option().implicitIncludes)
106 header = lowerClassName;
109 qWarning(
"%s: Warning: generated header '%s' for class '%s'.",
118 if (!header.isEmpty())
119 insertInclude(header, global);
122void WriteIncludes::doAdd(
const QString &className,
const DomCustomWidget *dcw)
125 addCppCustomWidget(className, dcw);
127 insertIncludeForClass(className, {},
false);
130void WriteIncludes::addCppCustomWidget(
const QString &className,
const DomCustomWidget *dcw)
132 const DomHeader *domHeader = dcw->elementHeader();
133 if (domHeader !=
nullptr && !domHeader->text().isEmpty()) {
137 if (!m_classToHeader.contains(className)) {
138 global = domHeader->attributeLocation().toLower() ==
"global"_L1;
139 header = domHeader->text();
141 insertIncludeForClass(className, header, global);
149 if (node->hasAttributeLocation())
150 global = node->attributeLocation() ==
"global"_L1;
151 insertInclude(node->text(), global);
154void WriteIncludes::insertInclude(
const QString &header,
bool global)
157 fprintf(stderr,
"%s %s %d\n", Q_FUNC_INFO,
qPrintable(header), global);
159 OrderedSet &includes = global ? m_globalIncludes : m_localIncludes;
161 const bool isNewHeader = includes.insert(header).second;
165 const QString lowerBaseName = QFileInfo(header).completeBaseName ().toLower();
166 m_includeBaseNames.insert(lowerBaseName);
169void WriteIncludes::writeHeaders(
const OrderedSet &headers,
bool global)
171 const QChar openingQuote = global ? u'<' : u'"';
172 const QChar closingQuote = global ? u'>' : u'"';
175 for (
const QString &header : headers) {
176 const QString value = m_oldHeaderToNewHeader.value(header, header);
177 const auto trimmed = QStringView(value).trimmed();
178 if (!trimmed.isEmpty())
179 m_output <<
"#include " << openingQuote << trimmed << closingQuote <<
'\n';
void acceptUI(DomUI *node) override
void acceptInclude(DomInclude *node) override
WriteIncludesBase(Uic *uic)
void acceptUI(DomUI *node) override
static QString moduleHeader(const QString &module, const QString &header)
const QString & asString(const QString &s)
#define qPrintable(string)
ClassInfoEntries classInfoEntries()