Commit f8959aa7 authored by Oswald Buddenhagen's avatar Oswald Buddenhagen
Browse files

hide includes from within feature files

this fixes the recent appearance of qt_webkit_version.pri in all qt 4.7
based projects.

in fact, the patch does somewhat more: it makes the evaluator provide
the information to the higher layers which is necessary for a truly
hierarchical display of includes. TBD later.

Reviewed-by: dt
Task-number: QTCREATORBUG-1590
parent 4b2bbfe6
......@@ -48,7 +48,8 @@ ProFileReader::~ProFileReader()
bool ProFileReader::readProFile(const QString &fileName)
{
if (ProFile *pro = parsedProFile(fileName)) {
aboutToEval(pro);
m_ignoreLevel = 0;
aboutToEval(0, pro, EvalIncludeFile);
bool ok = accept(pro);
pro->deref();
return ok;
......@@ -56,15 +57,23 @@ bool ProFileReader::readProFile(const QString &fileName)
return false;
}
void ProFileReader::aboutToEval(ProFile *pro)
void ProFileReader::aboutToEval(ProFile *, ProFile *pro, EvalFileType type)
{
if (!m_includeFiles.contains(pro->fileName())) {
if (m_ignoreLevel || type == EvalFeatureFile) {
m_ignoreLevel++;
} else if (!m_includeFiles.contains(pro->fileName())) {
m_includeFiles.insert(pro->fileName(), pro);
m_proFiles.append(pro);
pro->ref();
}
}
void ProFileReader::doneWithEval(ProFile *)
{
if (m_ignoreLevel)
m_ignoreLevel--;
}
QList<ProFile*> ProFileReader::includeFiles() const
{
QString qmakeMkSpecDir = QFileInfo(propertyValue("QMAKE_MKSPECS")).absoluteFilePath();
......
......@@ -58,7 +58,8 @@ signals:
void errorFound(const QString &error);
private:
virtual void aboutToEval(ProFile *proFile);
virtual void aboutToEval(ProFile *parent, ProFile *proFile, EvalFileType type);
virtual void doneWithEval(ProFile *parent);
virtual void logMessage(const QString &msg);
virtual void fileMessage(const QString &msg);
virtual void errorMessage(const QString &msg);
......@@ -66,6 +67,7 @@ private:
private:
QMap<QString, ProFile *> m_includeFiles;
QList<ProFile *> m_proFiles;
int m_ignoreLevel;
};
class ProFileCacheManager : public QObject
......
......@@ -260,6 +260,7 @@ public:
ProItem::ProItemReturn evaluateConditionalFunction(const QString &function, const QString &arguments);
ProFile *parsedProFile(const QString &fileName, bool cache,
const QString &contents = QString());
bool evaluateFileDirect(const QString &fileName, ProFileEvaluator::EvalFileType type);
bool evaluateFile(const QString &fileName);
bool evaluateFeatureFile(const QString &fileName,
QHash<QString, QStringList> *values = 0, FunctionDefs *defs = 0);
......@@ -3120,6 +3121,20 @@ ProFile *ProFileEvaluator::Private::parsedProFile(const QString &fileName, bool
return pro;
}
bool ProFileEvaluator::Private::evaluateFileDirect(
const QString &fileName, ProFileEvaluator::EvalFileType type)
{
if (ProFile *pro = parsedProFile(fileName, true)) {
q->aboutToEval(currentProFile(), pro, type);
bool ok = (visitProFile(pro) == ProItem::ReturnTrue);
q->doneWithEval(currentProFile());
pro->deref();
return ok;
} else {
return false;
}
}
bool ProFileEvaluator::Private::evaluateFile(const QString &fileName)
{
if (fileName.isEmpty())
......@@ -3129,14 +3144,7 @@ bool ProFileEvaluator::Private::evaluateFile(const QString &fileName)
errorMessage(format("circular inclusion of %1").arg(fileName));
return false;
}
if (ProFile *pro = parsedProFile(fileName, true)) {
q->aboutToEval(pro);
bool ok = (visitProFile(pro) == ProItem::ReturnTrue);
pro->deref();
return ok;
} else {
return false;
}
return evaluateFileDirect(fileName, ProFileEvaluator::EvalIncludeFile);
}
bool ProFileEvaluator::Private::evaluateFeatureFile(
......@@ -3183,13 +3191,8 @@ bool ProFileEvaluator::Private::evaluateFeatureFile(
bool cumulative = m_cumulative;
m_cumulative = false;
// Don't use evaluateFile() here to avoid calling aboutToEval().
// The path is fully normalized already.
bool ok = false;
if (ProFile *pro = parsedProFile(fn, true)) {
ok = (visitProFile(pro) == ProItem::ReturnTrue);
pro->deref();
}
bool ok = evaluateFileDirect(fn, ProFileEvaluator::EvalFeatureFile);
m_cumulative = cumulative;
return ok;
......@@ -3371,7 +3374,11 @@ QString ProFileEvaluator::propertyValue(const QString &name) const
return d->propertyValue(name);
}
void ProFileEvaluator::aboutToEval(ProFile *)
void ProFileEvaluator::aboutToEval(ProFile *, ProFile *, EvalFileType)
{
}
void ProFileEvaluator::doneWithEval(ProFile *)
{
}
......
......@@ -94,7 +94,9 @@ public:
QString propertyValue(const QString &val) const;
// for our descendents
virtual void aboutToEval(ProFile *proFile); // only .pri, but not .prf. or .pro
enum EvalFileType { EvalFeatureFile, EvalIncludeFile };
virtual void aboutToEval(ProFile *parent, ProFile *proFile, EvalFileType type);
virtual void doneWithEval(ProFile *parent);
virtual void logMessage(const QString &msg);
virtual void errorMessage(const QString &msg); // .pro parse errors
virtual void fileMessage(const QString &msg); // error() and message() from .pro file
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment