introduce QMakeHandler

this is QMakeEvaluatorHandler, but derived from QMakeParserHandler.
the idea is that the parser can be used stand-alone, while the evaluator
needs the parser as well.
we will need it in QMakeGlobals as well, so put it there, as that is the
most central place.

Change-Id: I6ee46c0e4b2e044bf3bfc6e4235b53525ddfc875
Reviewed-by: Daniel Teske <daniel.teske@nokia.com>
This commit is contained in:
Oswald Buddenhagen
2012-06-11 20:28:16 +02:00
parent 6d63786f92
commit ac297f8e6b
7 changed files with 28 additions and 35 deletions

View File

@@ -48,8 +48,7 @@ namespace Internal {
class QtSupportPlugin;
}
class QTSUPPORT_EXPORT ProMessageHandler : public QObject,
public QMakeParserHandler, public QMakeEvaluatorHandler
class QTSUPPORT_EXPORT ProMessageHandler : public QObject, public QMakeHandler
{
Q_OBJECT

View File

@@ -46,7 +46,7 @@ void ProFileEvaluator::initialize()
}
ProFileEvaluator::ProFileEvaluator(QMakeGlobals *option, QMakeParser *parser,
QMakeEvaluatorHandler *handler)
QMakeHandler *handler)
: d(new QMakeEvaluator(option, parser, handler))
{
}
@@ -187,7 +187,7 @@ ProFileEvaluator::TemplateType ProFileEvaluator::templateType() const
bool ProFileEvaluator::accept(ProFile *pro, QMakeEvaluator::LoadFlags flags)
{
return d->visitProFile(pro, QMakeEvaluatorHandler::EvalProjectFile, flags) == QMakeEvaluator::ReturnTrue;
return d->visitProFile(pro, QMakeHandler::EvalProjectFile, flags) == QMakeEvaluator::ReturnTrue;
}
QString ProFileEvaluator::propertyValue(const QString &name) const

View File

@@ -45,7 +45,7 @@ QT_BEGIN_NAMESPACE
class QMakeGlobals;
class QMakeParser;
class QMakeEvaluator;
class QMakeEvaluatorHandler;
class QMakeHandler;
class QMAKE_EXPORT ProFileEvaluator
{
@@ -62,7 +62,7 @@ public:
// Call this from a concurrency-free context
static void initialize();
ProFileEvaluator(QMakeGlobals *option, QMakeParser *parser, QMakeEvaluatorHandler *handler);
ProFileEvaluator(QMakeGlobals *option, QMakeParser *parser, QMakeHandler *handler);
~ProFileEvaluator();
ProFileEvaluator::TemplateType templateType() const;

View File

@@ -416,7 +416,7 @@ ProStringList QMakeEvaluator::evaluateExpandFunction(
QHash<ProString, ProStringList> vars;
QString fn = resolvePath(m_option->expandEnvVars(args.at(0).toQString(m_tmp1)));
fn.detach();
if (evaluateFileInto(fn, QMakeEvaluatorHandler::EvalAuxFile,
if (evaluateFileInto(fn, QMakeHandler::EvalAuxFile,
&vars, &m_functionDefs, EvalWithDefaults))
ret = vars.value(map(args.at(1)));
}
@@ -704,7 +704,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateConditionalFunction(
QHash<ProString, ProStringList> vars;
QString fn = resolvePath(m_option->expandEnvVars(args.at(0).toQString(m_tmp1)));
fn.detach();
if (!evaluateFileInto(fn, QMakeEvaluatorHandler::EvalAuxFile,
if (!evaluateFileInto(fn, QMakeHandler::EvalAuxFile,
&vars, &m_functionDefs, EvalWithDefaults))
return ReturnFalse;
if (args.count() == 2)
@@ -991,10 +991,10 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateConditionalFunction(
fn.detach();
bool ok;
if (parseInto.isEmpty()) {
ok = evaluateFile(fn, QMakeEvaluatorHandler::EvalIncludeFile, LoadProOnly);
ok = evaluateFile(fn, QMakeHandler::EvalIncludeFile, LoadProOnly);
} else {
QHash<ProString, ProStringList> symbols;
if ((ok = evaluateFileInto(fn, QMakeEvaluatorHandler::EvalAuxFile,
if ((ok = evaluateFileInto(fn, QMakeHandler::EvalAuxFile,
&symbols, 0, EvalWithSetup))) {
QHash<ProString, ProStringList> newMap;
for (QHash<ProString, ProStringList>::ConstIterator

View File

@@ -150,7 +150,7 @@ const ProString &QMakeEvaluator::map(const ProString &var)
QMakeEvaluator::QMakeEvaluator(QMakeGlobals *option,
QMakeParser *parser, QMakeEvaluatorHandler *handler)
QMakeParser *parser, QMakeHandler *handler)
: m_option(option), m_parser(parser), m_handler(handler)
{
// So that single-threaded apps don't have to call initialize() for now.
@@ -834,7 +834,7 @@ void QMakeEvaluator::visitCmdLine(const QString &cmds)
}
QMakeEvaluator::VisitReturn QMakeEvaluator::visitProFile(
ProFile *pro, QMakeEvaluatorHandler::EvalFileType type, LoadFlags flags)
ProFile *pro, QMakeHandler::EvalFileType type, LoadFlags flags)
{
if (!m_cumulative && !pro->isOk())
return ReturnFalse;
@@ -882,7 +882,7 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::visitProFile(
if (!qmake_cache.isEmpty()) {
qmake_cache = resolvePath(qmake_cache);
QHash<ProString, ProStringList> cache_valuemap;
if (evaluateFileInto(qmake_cache, QMakeEvaluatorHandler::EvalConfigFile,
if (evaluateFileInto(qmake_cache, QMakeHandler::EvalConfigFile,
&cache_valuemap, 0, EvalProOnly)) {
if (m_option->qmakespec.isEmpty()) {
const ProStringList &vals = cache_valuemap.value(ProString("QMAKESPEC"));
@@ -939,13 +939,12 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::visitProFile(
m_option->qmakespec = QDir::cleanPath(qmakespec);
QString spec = m_option->qmakespec + QLatin1String("/qmake.conf");
if (!evaluateFileDirect(spec,
QMakeEvaluatorHandler::EvalConfigFile, LoadProOnly)) {
if (!evaluateFileDirect(spec, QMakeHandler::EvalConfigFile, LoadProOnly)) {
m_handler->configError(
fL1S("Could not read qmake configuration file %1").arg(spec));
} else if (!m_option->cachefile.isEmpty()) {
evaluateFileDirect(m_option->cachefile,
QMakeEvaluatorHandler::EvalConfigFile, LoadProOnly);
QMakeHandler::EvalConfigFile, LoadProOnly);
}
m_option->qmakespec_name = IoUtils::fileName(m_option->qmakespec).toString();
if (m_option->qmakespec_name == QLatin1String("default")) {
@@ -1884,7 +1883,7 @@ ProString QMakeEvaluator::first(const ProString &variableName) const
}
bool QMakeEvaluator::evaluateFileDirect(
const QString &fileName, QMakeEvaluatorHandler::EvalFileType type, LoadFlags flags)
const QString &fileName, QMakeHandler::EvalFileType type, LoadFlags flags)
{
if (ProFile *pro = m_parser->parsedProFile(fileName, true)) {
m_locationStack.push(m_current);
@@ -1898,7 +1897,7 @@ bool QMakeEvaluator::evaluateFileDirect(
}
bool QMakeEvaluator::evaluateFile(
const QString &fileName, QMakeEvaluatorHandler::EvalFileType type, LoadFlags flags)
const QString &fileName, QMakeHandler::EvalFileType type, LoadFlags flags)
{
if (fileName.isEmpty())
return false;
@@ -1955,7 +1954,7 @@ bool QMakeEvaluator::evaluateFeatureFile(const QString &fileName)
#endif
// The path is fully normalized already.
bool ok = evaluateFileDirect(fn, QMakeEvaluatorHandler::EvalFeatureFile, LoadProOnly);
bool ok = evaluateFileDirect(fn, QMakeHandler::EvalFeatureFile, LoadProOnly);
#ifdef PROEVALUATOR_CUMULATIVE
m_cumulative = cumulative;
@@ -1964,7 +1963,7 @@ bool QMakeEvaluator::evaluateFeatureFile(const QString &fileName)
}
bool QMakeEvaluator::evaluateFileInto(
const QString &fileName, QMakeEvaluatorHandler::EvalFileType type,
const QString &fileName, QMakeHandler::EvalFileType type,
QHash<ProString, ProStringList> *values, ProFunctionDefs *funcs, EvalIntoMode mode)
{
ProFileEvaluator visitor(m_option, m_parser, m_handler);

View File

@@ -33,6 +33,7 @@
#ifndef QMAKEEVALUATOR_H
#define QMAKEEVALUATOR_H
#include "qmakeparser.h"
#include "qmakeglobals.h"
#include "ioutils.h"
@@ -44,9 +45,7 @@
QT_BEGIN_NAMESPACE
class QMakeParser;
class QMAKE_EXPORT QMakeEvaluatorHandler
class QMAKE_EXPORT QMakeHandler : public QMakeParserHandler
{
public:
// qmake/project configuration error
@@ -75,7 +74,7 @@ public:
static void initStatics();
static void initFunctionStatics();
QMakeEvaluator(QMakeGlobals *option, QMakeParser *parser,
QMakeEvaluatorHandler *handler);
QMakeHandler *handler);
~QMakeEvaluator();
ProStringList values(const ProString &variableName) const;
@@ -103,7 +102,7 @@ public:
void skipExpression(const ushort *&tokPtr);
void visitCmdLine(const QString &cmds);
VisitReturn visitProFile(ProFile *pro, QMakeEvaluatorHandler::EvalFileType type,
VisitReturn visitProFile(ProFile *pro, QMakeHandler::EvalFileType type,
LoadFlags flags);
VisitReturn visitProBlock(ProFile *pro, const ushort *tokPtr);
VisitReturn visitProBlock(const ushort *tokPtr);
@@ -127,13 +126,13 @@ public:
QString resolvePath(const QString &fileName) const
{ return ProFileEvaluatorInternal::IoUtils::resolvePath(currentDirectory(), fileName); }
bool evaluateFileDirect(const QString &fileName, QMakeEvaluatorHandler::EvalFileType type,
bool evaluateFileDirect(const QString &fileName, QMakeHandler::EvalFileType type,
LoadFlags flags);
bool evaluateFile(const QString &fileName, QMakeEvaluatorHandler::EvalFileType type,
bool evaluateFile(const QString &fileName, QMakeHandler::EvalFileType type,
LoadFlags flags);
bool evaluateFeatureFile(const QString &fileName);
enum EvalIntoMode { EvalProOnly, EvalWithDefaults, EvalWithSetup };
bool evaluateFileInto(const QString &fileName, QMakeEvaluatorHandler::EvalFileType type,
bool evaluateFileInto(const QString &fileName, QMakeHandler::EvalFileType type,
QHash<ProString, ProStringList> *values, ProFunctionDefs *defs,
EvalIntoMode mode); // values are output-only, defs are input-only
void evalError(const QString &msg) const;
@@ -201,7 +200,7 @@ public:
QMakeGlobals *m_option;
QMakeParser *m_parser;
QMakeEvaluatorHandler *m_handler;
QMakeHandler *m_handler;
enum VarName {
V_LITERAL_DOLLAR, V_LITERAL_HASH, V_LITERAL_WHITESPACE,

View File

@@ -53,14 +53,11 @@ static void print(const QString &fileName, int lineNo, const QString &msg)
qWarning("%s", qPrintable(msg));
}
class ParseHandler : public QMakeParserHandler {
class EvalHandler : public QMakeHandler {
public:
virtual void parseError(const QString &fileName, int lineNo, const QString &msg)
{ print(fileName, lineNo, msg); }
};
class EvalHandler : public QMakeEvaluatorHandler {
public:
virtual void configError(const QString &msg)
{ qWarning("%s", qPrintable(msg)); }
virtual void evalError(const QString &fileName, int lineNo, const QString &msg)
@@ -72,7 +69,6 @@ public:
virtual void doneWithEval(ProFile *) {}
};
static ParseHandler parseHandler;
static EvalHandler evalHandler;
static QString value(ProFileEvaluator &reader, const QString &variable)
@@ -165,7 +161,7 @@ int main(int argc, char **argv)
option.initProperties(QLibraryInfo::location(QLibraryInfo::BinariesPath) + QLatin1String("/qmake"));
if (args.count() >= 4)
option.setCommandLineArguments(args.mid(3));
QMakeParser parser(0, &parseHandler);
QMakeParser parser(0, &evalHandler);
bool cumulative = args[0] == QLatin1String("true");
QFileInfo infi(args[1]);