From 0de4dffa0c5abc80df7063daf6bc9d1754891a9d Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 2 Nov 2017 14:13:37 +0100 Subject: shikoben2: Extend type system path resolution - Remove stripping of directory components from the file names so that for example QtCore/typesystem_core.xml can also be resolved via type system path. - In addition, pass in the path of the current file being parsed so that for example typesystem_core_x11.xml is found from the directory of typesystem_core.xml while parsing Change-Id: Id10aafaf21750aa87460ccfe9ee3c3764086eda6 Reviewed-by: Alexandru Croitor --- sources/shiboken2/ApiExtractor/typesystem.cpp | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) (limited to 'sources/shiboken2/ApiExtractor/typesystem.cpp') diff --git a/sources/shiboken2/ApiExtractor/typesystem.cpp b/sources/shiboken2/ApiExtractor/typesystem.cpp index 9c80a6c0b..c20b06750 100644 --- a/sources/shiboken2/ApiExtractor/typesystem.cpp +++ b/sources/shiboken2/ApiExtractor/typesystem.cpp @@ -32,6 +32,7 @@ #include "reporthandler.h" #include #include +#include #include #include #include @@ -183,13 +184,20 @@ Handler::Handler(TypeDatabase* database, bool generate) tagNames.insert(QLatin1String("add-function"), StackElement::AddFunction); } +static QString readerFileName(const QXmlStreamReader &reader) +{ + const QFile *file = qobject_cast(reader.device()); + return file != nullptr ? file->fileName() : QString(); +} + static QString msgReaderError(const QXmlStreamReader &reader, const QString &what) { QString message; QTextStream str(&message); str << "Error: "; - if (const QFile *file = qobject_cast(reader.device())) - str << "file=" << QDir::toNativeSeparators(file->fileName()) << ", "; + const QString fileName = readerFileName(reader); + if (!fileName.isEmpty()) + str << "file=" << QDir::toNativeSeparators(fileName) << ", "; str << "line=" << reader.lineNumber() << ", column=" << reader.columnNumber() << ", message=" << what; return message; @@ -203,6 +211,11 @@ static QString msgReaderError(const QXmlStreamReader &reader) bool Handler::parse(QXmlStreamReader &reader) { m_error.clear(); + m_currentPath.clear(); + const QString fileName = readerFileName(reader); + if (!fileName.isEmpty()) + m_currentPath = QFileInfo(fileName).absolutePath(); + while (!reader.atEnd()) { switch (reader.readNext()) { case QXmlStreamReader::NoToken: @@ -1325,7 +1338,7 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts return false; } bool generateChild = (convertBoolean(attributes[QLatin1String("generate")], QLatin1String("generate"), true) && (m_generate == TypeEntry::GenerateAll)); - if (!m_database->parseFile(name, generateChild)) { + if (!m_database->parseFile(name, m_currentPath, generateChild)) { m_error = QStringLiteral("Failed to parse: '%1'").arg(name); return false; } @@ -1947,7 +1960,7 @@ bool Handler::startElement(const QStringRef &n, const QXmlStreamAttributes &atts if (m_generate != TypeEntry::GenerateForSubclass && m_generate != TypeEntry::GenerateNothing && !file_name.isEmpty()) { - const QString resolved = m_database->modifiedTypesystemFilepath(file_name, false); + const QString resolved = m_database->modifiedTypesystemFilepath(file_name, m_currentPath); if (QFile::exists(resolved)) { QFile codeFile(resolved); if (codeFile.open(QIODevice::Text | QIODevice::ReadOnly)) { -- cgit v1.2.3