Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 39 additions & 10 deletions generator/abstractmetabuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
#endif
#include <QtCore/QTextStream>
#include <QtCore/QVariant>
#include <QtCore/QDir>

static QString strip_template_args(const QString &name)
{
Expand Down Expand Up @@ -413,6 +414,39 @@ AbstractMetaClass* AbstractMetaBuilder::getGlobalNamespace(const TypeEntry* type
return global;
}

Include AbstractMetaBuilder::getRelativeInclude(const QString& path)
{
QString bestRelativePath;
int bestNumDirectories = 0;
// find the shortest relative path relative to all given include directories
for (QString includePath : m_include_paths) {
QDir includeDir(includePath);
QString relativePath = includeDir.relativeFilePath(path);
QFileInfo info(relativePath);
if (!info.isRelative()) {
// not relative - different drives?
continue;
}
int numDirectories = relativePath.count('/');
if (bestRelativePath.isEmpty() || numDirectories < bestNumDirectories) {
bestRelativePath = relativePath;
bestNumDirectories = numDirectories;
if (numDirectories == 0) {
// optimal relative path
break;
}
}
}
if (bestRelativePath.isEmpty()) {
// This shouldn't happen
QFileInfo info(path);
return Include(Include::IncludePath, info.fileName());
}
else {
return Include(Include::IncludePath, bestRelativePath);
}
}

bool AbstractMetaBuilder::build()
{
Q_ASSERT(!m_file_name.isEmpty());
Expand Down Expand Up @@ -756,13 +790,11 @@ AbstractMetaClass *AbstractMetaBuilder::traverseNamespace(NamespaceModelItem nam
m_namespace_prefix = currentScope()->qualifiedName().join("::");

if (!type->include().isValid()) {
QFileInfo info(namespace_item->fileName());
type->setInclude(Include(Include::IncludePath, info.fileName()));
type->setInclude(getRelativeInclude(namespace_item->fileName()));
}
// namespace items might come from different include files:
for (const QString& oneIncludeFile : includeFiles) {
QFileInfo info(oneIncludeFile);
type->addExtraInclude(Include(Include::IncludePath, info.fileName()));
type->addExtraInclude(getRelativeInclude(oneIncludeFile));
}

return meta_class;
Expand Down Expand Up @@ -837,8 +869,7 @@ AbstractMetaEnum *AbstractMetaBuilder::traverseEnum(EnumModelItem enum_item, Abs
m_enum_values[meta_enum_value->name()] = meta_enum_value;
}

QFileInfo info(enum_item->fileName());
meta_enum->typeEntry()->setInclude(Include(Include::IncludePath, info.fileName()));
meta_enum->typeEntry()->setInclude(getRelativeInclude(enum_item->fileName()));

m_enums << meta_enum;

Expand Down Expand Up @@ -872,8 +903,7 @@ AbstractMetaClass *AbstractMetaBuilder::traverseTypeAlias(TypeAliasModelItem typ

// Set the default include file name
if (!type->include().isValid()) {
QFileInfo info(typeAlias->fileName());
type->setInclude(Include(Include::IncludePath, info.fileName()));
type->setInclude(getRelativeInclude(typeAlias->fileName()));
}

return meta_class;
Expand Down Expand Up @@ -986,8 +1016,7 @@ AbstractMetaClass *AbstractMetaBuilder::traverseClass(ClassModelItem class_item)
// Set the default include file name. In case we saw an template instance earlier,
// overwrite the include file when we see the actual declaration.
if (!type->include().isValid() || class_item->hasActualDeclaration()) {
QFileInfo info(class_item->fileName());
type->setInclude(Include(Include::IncludePath, info.fileName()));
type->setInclude(getRelativeInclude(class_item->fileName()));
}

return meta_class;
Expand Down
7 changes: 7 additions & 0 deletions generator/abstractmetabuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,9 @@ class AbstractMetaBuilder
QString fileName() const { return m_file_name; }
void setFileName(const QString &fileName) { m_file_name = fileName; }

//! Set list of include directories. This will be used to make absolute include paths relative.
void setIncludePaths(const QStringList& includePaths) { m_include_paths = includePaths; }

void dumpLog();

bool build();
Expand Down Expand Up @@ -153,7 +156,11 @@ class AbstractMetaBuilder

AbstractMetaClass* getGlobalNamespace(const TypeEntry* typeEntry);

// turn absolute file path into a relative include
Include getRelativeInclude(const QString& path);

QString m_file_name;
QStringList m_include_paths;

AbstractMetaClassList m_meta_classes;
QHash<QString,AbstractMetaClass*> m_templates;
Expand Down
1 change: 1 addition & 0 deletions generator/generatorset.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ class GeneratorSet : public QObject
virtual bool readParameters(const QMap<QString, QString> args) = 0;
virtual void buildModel(const QString pp_file) = 0;
virtual void dumpObjectTree() = 0;
virtual void setIncludePaths(const QStringList& includePaths) = 0;
virtual QString generate() = 0;

static GeneratorSet *getInstance();
Expand Down
5 changes: 5 additions & 0 deletions generator/generatorsetqtscript.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,11 @@ void GeneratorSetQtScript::dumpObjectTree() {

}

void GeneratorSetQtScript::setIncludePaths(const QStringList& includePaths)
{
builder.setIncludePaths(includePaths);
}

QString GeneratorSetQtScript::generate() {
AbstractMetaClassList classes = builder.classesTopologicalSorted();
QSet<QString> declaredTypeNames = builder.qtMetaTypeDeclaredTypeNames();
Expand Down
11 changes: 6 additions & 5 deletions generator/generatorsetqtscript.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,14 @@ class GeneratorSetQtScript : public GeneratorSet
public:
GeneratorSetQtScript();

QString usage();
bool readParameters(const QMap<QString, QString> args);
QString usage() override;
bool readParameters(const QMap<QString, QString> args) override;

void buildModel(const QString pp_file);
void dumpObjectTree();
void buildModel(const QString pp_file) override;
void dumpObjectTree() override;
void setIncludePaths(const QStringList& includePaths) override;

QString generate( );
QString generate() override;

private:
MetaQtScriptBuilder builder;
Expand Down
17 changes: 10 additions & 7 deletions generator/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -127,11 +127,11 @@ namespace
}

bool
preprocess(const QString& sourceFile, const QString& targetFile, const QString& commandLineIncludes = QString())
preprocess(const QString& sourceFile, const QString& targetFile, const QStringList& includePaths)
{
simplecpp::DUI dui; // settings

for(QString include : getIncludeDirectories(commandLineIncludes)) {
for(QString include : includePaths) {
dui.includePaths.push_back(QDir::toNativeSeparators(include).toStdString());
}
dui.defines.push_back("__cplusplus=1");
Expand Down Expand Up @@ -212,10 +212,10 @@ namespace
return true;
}

unsigned int getQtVersion(const QString &commandLineIncludes)
unsigned int getQtVersion(const QStringList& includePaths)
{
QRegularExpression re("#define\\s+QTCORE_VERSION\\s+0x([0-9a-f]+)", QRegularExpression::CaseInsensitiveOption);
for (const QString &includeDir: getIncludeDirectories(commandLineIncludes))
for (const QString &includeDir: includePaths)
{
QFileInfo fi(QDir(includeDir), "qtcoreversion.h");
if (fi.exists())
Expand Down Expand Up @@ -244,7 +244,7 @@ namespace
}
}
printf("Error: Could not find Qt version (looked for qtcoreversion.h in %s)\n",
qPrintable(commandLineIncludes));
qPrintable(includePaths.join(QDir::listSeparator())));
return 0;
}
};
Expand Down Expand Up @@ -348,9 +348,10 @@ int main(int argc, char *argv[])

printf("Please wait while source files are being generated...\n");

QStringList includePaths = getIncludeDirectories(args.value("include-paths"));
if (!qtVersion) {
printf("Trying to determine Qt version...\n");
qtVersion = getQtVersion(args.value("include-paths"));
qtVersion = getQtVersion(includePaths);
if (!qtVersion)
{
fprintf(stderr, "Aborting\n"); // the error message was printed by getQtVersion
Expand All @@ -372,7 +373,8 @@ int main(int argc, char *argv[])
printf("PreProcessing - Generate [%s] using [%s] and include-paths [%s]\n",
qPrintable(pp_file), qPrintable(fileName), qPrintable(args.value("include-paths")));
ReportHandler::setContext("Preprocess");
if (!preprocess(fileName, pp_file, args.value("include-paths"))) {

if (!preprocess(fileName, pp_file, includePaths)) {
fprintf(stderr, "Preprocessor failed on file: '%s'\n", qPrintable(fileName));
return 1;
}
Expand All @@ -387,6 +389,7 @@ int main(int argc, char *argv[])

printf("Building model using [%s]\n", qPrintable(pp_file));
ReportHandler::setContext("Build");
gs->setIncludePaths(includePaths);
gs->buildModel(pp_file);
if (args.contains("dump-object-tree")) {
gs->dumpObjectTree();
Expand Down
Loading