diff --git a/src/shared/proparser/abstractproitemvisitor.h b/src/shared/proparser/abstractproitemvisitor.h deleted file mode 100644 index 18b7f535edd614e3a2908602fa230ba436898eb5..0000000000000000000000000000000000000000 --- a/src/shared/proparser/abstractproitemvisitor.h +++ /dev/null @@ -1,59 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** Commercial Usage -** -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Commercial License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Nokia. -** -** GNU Lesser General Public License Usage -** -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at http://qt.nokia.com/contact. -** -**************************************************************************/ - -#ifndef ABSTRACTPROITEMVISITOR -#define ABSTRACTPROITEMVISITOR - -#include "proitems.h" - -QT_BEGIN_NAMESPACE - -struct AbstractProItemVisitor -{ - virtual ~AbstractProItemVisitor() {} - - virtual ProItem::ProItemReturn visitBeginProBlock(ProBlock *block) = 0; - virtual void visitEndProBlock(ProBlock *block) = 0; - - virtual ProItem::ProItemReturn visitProLoopIteration() = 0; - virtual void visitProLoopCleanup() = 0; - - virtual ProItem::ProItemReturn visitBeginProFile(ProFile *value) = 0; - virtual ProItem::ProItemReturn visitEndProFile(ProFile *value) = 0; - - virtual void visitProVariable(ProVariable *variable) = 0; - virtual ProItem::ProItemReturn visitProFunction(ProFunction *function) = 0; - virtual void visitProOperator(ProOperator *function) = 0; - virtual void visitProCondition(ProCondition *function) = 0; -}; - -QT_END_NAMESPACE - -#endif // ABSTRACTPROITEMVISITOR - diff --git a/src/shared/proparser/profileevaluator.cpp b/src/shared/proparser/profileevaluator.cpp index ff31a48e1b88c83356ec46f828ced6e109bb003f..8301832971f72dfe438d137c56b7edb9065d8fd2 100644 --- a/src/shared/proparser/profileevaluator.cpp +++ b/src/shared/proparser/profileevaluator.cpp @@ -180,7 +180,7 @@ QString ProFileOption::field_sep; // /////////////////////////////////////////////////////////////////////// -class ProFileEvaluator::Private : public AbstractProItemVisitor +class ProFileEvaluator::Private { public: Private(ProFileEvaluator *q_, ProFileOption *option); @@ -210,13 +210,11 @@ public: /////////////// Evaluating pro file contents - // implementation of AbstractProItemVisitor - ProItem::ProItemReturn visitBeginProBlock(ProBlock *block); - void visitEndProBlock(ProBlock *block); + ProItem::ProItemReturn visitProFile(ProFile *pro); + ProItem::ProItemReturn visitProBlock(ProBlock *block); + ProItem::ProItemReturn visitProItem(ProItem *item); ProItem::ProItemReturn visitProLoopIteration(); void visitProLoopCleanup(); - ProItem::ProItemReturn visitBeginProFile(ProFile *value); - ProItem::ProItemReturn visitEndProFile(ProFile *value); void visitProVariable(ProVariable *variable); ProItem::ProItemReturn visitProFunction(ProFunction *function); void visitProOperator(ProOperator *oper); @@ -812,7 +810,27 @@ static QString fixPathToLocalOS(const QString &str) //////// Evaluator ///////// -ProItem::ProItemReturn ProFileEvaluator::Private::visitBeginProBlock(ProBlock *block) +ProItem::ProItemReturn ProFileEvaluator::Private::visitProItem(ProItem *item) +{ + switch (item->kind()) { + case ProItem::BlockKind: // This is never a ProFile + return visitProBlock(static_cast<ProBlock*>(item)); + case ProItem::VariableKind: + visitProVariable(static_cast<ProVariable*>(item)); + break; + case ProItem::ConditionKind: + visitProCondition(static_cast<ProCondition*>(item)); + break; + case ProItem::FunctionKind: + return visitProFunction(static_cast<ProFunction*>(item)); + case ProItem::OperatorKind: + visitProOperator(static_cast<ProOperator*>(item)); + break; + } + return ProItem::ReturnTrue; +} + +ProItem::ProItemReturn ProFileEvaluator::Private::visitProBlock(ProBlock *block) { if (block->blockKind() & ProBlock::ScopeContentsKind) { if (!m_definingFunc.isEmpty()) { @@ -827,7 +845,7 @@ ProItem::ProItemReturn ProFileEvaluator::Private::visitBeginProBlock(ProBlock *b block->setBlockKind(block->blockKind() | ProBlock::FunctionBodyKind); } m_definingFunc.clear(); - return ProItem::ReturnSkip; + return ProItem::ReturnTrue; } else if (!(block->blockKind() & ProBlock::FunctionBodyKind)) { if (!m_sts.condition) { if (m_skipLevel || m_hadCondition) @@ -847,11 +865,32 @@ ProItem::ProItemReturn ProFileEvaluator::Private::visitBeginProBlock(ProBlock *b Q_ASSERT(!m_sts.condition); } } - return ProItem::ReturnTrue; -} - -void ProFileEvaluator::Private::visitEndProBlock(ProBlock *block) -{ + ProItem::ProItemReturn rt = ProItem::ReturnTrue; + QList<ProItem *> items = block->items(); + for (int i = 0; i < items.count(); ++i) { + rt = visitProItem(items.at(i)); + if (rt != ProItem::ReturnTrue && rt != ProItem::ReturnFalse) { + if (rt == ProItem::ReturnLoop) { + rt = ProItem::ReturnTrue; + while (visitProLoopIteration()) + for (int j = i; ++j < items.count(); ) { + rt = visitProItem(items.at(j)); + if (rt != ProItem::ReturnTrue && rt != ProItem::ReturnFalse) { + if (rt == ProItem::ReturnNext) { + rt = ProItem::ReturnTrue; + break; + } + if (rt == ProItem::ReturnBreak) + rt = ProItem::ReturnTrue; + goto do_break; + } + } + do_break: + visitProLoopCleanup(); + } + break; + } + } if ((block->blockKind() & ProBlock::ScopeContentsKind) && !(block->blockKind() & ProBlock::FunctionBodyKind)) { if (m_skipLevel) { @@ -863,6 +902,7 @@ void ProFileEvaluator::Private::visitEndProBlock(ProBlock *block) m_sts.condition = true; } } + return rt; } ProItem::ProItemReturn ProFileEvaluator::Private::visitProLoopIteration() @@ -1001,7 +1041,7 @@ void ProFileEvaluator::Private::visitProCondition(ProCondition *cond) m_invertNext = false; } -ProItem::ProItemReturn ProFileEvaluator::Private::visitBeginProFile(ProFile * pro) +ProItem::ProItemReturn ProFileEvaluator::Private::visitProFile(ProFile *pro) { m_lineNo = pro->lineNumber(); @@ -1124,11 +1164,8 @@ ProItem::ProItemReturn ProFileEvaluator::Private::visitBeginProFile(ProFile * pr } } - return ProItem::ReturnTrue; -} + visitProBlock(pro); -ProItem::ProItemReturn ProFileEvaluator::Private::visitEndProFile(ProFile * pro) -{ m_lineNo = pro->lineNumber(); if (m_profileStack.count() == 1) { @@ -1668,7 +1705,7 @@ QStringList ProFileEvaluator::Private::evaluateFunction( m_valuemap[QString::number(i+1)] = argumentsList[i]; } m_valuemap[QLatin1String("ARGS")] = args; - oki = (funcPtr->Accept(this) != ProItem::ReturnFalse); // True || Return + oki = (visitProBlock(funcPtr) != ProItem::ReturnFalse); // True || Return ret = m_returnValue; m_returnValue.clear(); @@ -2237,7 +2274,7 @@ ProItem::ProItemReturn ProFileEvaluator::Private::evaluateConditionalFunction( delete pro; return ProItem::ReturnFalse; } - bool ret = pro->Accept(this); + bool ret = visitProBlock(pro); pro->deref(); return returnBool(ret); } @@ -2813,7 +2850,7 @@ bool ProFileEvaluator::Private::evaluateFile(const QString &fileName) } if (ProFile *pro = parsedProFile(fileName, true)) { q->aboutToEval(pro); - bool ok = (pro->Accept(this) == ProItem::ReturnTrue); + bool ok = (visitProFile(pro) == ProItem::ReturnTrue); pro->deref(); return ok; } else { @@ -2869,7 +2906,7 @@ bool ProFileEvaluator::Private::evaluateFeatureFile( // The path is fully normalized already. bool ok = false; if (ProFile *pro = parsedProFile(fn, true)) { - ok = (pro->Accept(this) == ProItem::ReturnTrue); + ok = (visitProFile(pro) == ProItem::ReturnTrue); pro->deref(); } @@ -3039,7 +3076,7 @@ ProFile *ProFileEvaluator::parsedProFile(const QString &fileName, const QString bool ProFileEvaluator::accept(ProFile *pro) { - return pro->Accept(d); + return d->visitProFile(pro); } QString ProFileEvaluator::propertyValue(const QString &name) const diff --git a/src/shared/proparser/profileevaluator.h b/src/shared/proparser/profileevaluator.h index efe3af5e6f5ee22afa63fb89fb60ea22de40315d..c6ba33eb801dfe9158c4d0b783640d516029989e 100644 --- a/src/shared/proparser/profileevaluator.h +++ b/src/shared/proparser/profileevaluator.h @@ -31,7 +31,6 @@ #define PROFILEEVALUATOR_H #include "proitems.h" -#include "abstractproitemvisitor.h" #include <QtCore/QIODevice> #include <QtCore/QHash> diff --git a/src/shared/proparser/proitems.cpp b/src/shared/proparser/proitems.cpp index f39816a2b1029ecbc08656cac3b9cdc8bf98c0ae..09838f12fd858662a5066233d9bcdf2f44ec78ea 100644 --- a/src/shared/proparser/proitems.cpp +++ b/src/shared/proparser/proitems.cpp @@ -28,7 +28,6 @@ **************************************************************************/ #include "proitems.h" -#include "abstractproitemvisitor.h" #include <QtCore/QFileInfo> @@ -92,39 +91,6 @@ ProItem::ProItemKind ProBlock::kind() const return ProItem::BlockKind; } -ProItem::ProItemReturn ProBlock::Accept(AbstractProItemVisitor *visitor) -{ - if (visitor->visitBeginProBlock(this) == ReturnSkip) - return ReturnTrue; - ProItemReturn rt = ReturnTrue; - for (int i = 0; i < m_proitems.count(); ++i) { - rt = m_proitems.at(i)->Accept(visitor); - if (rt != ReturnTrue && rt != ReturnFalse) { - if (rt == ReturnLoop) { - rt = ReturnTrue; - while (visitor->visitProLoopIteration()) - for (int j = i; ++j < m_proitems.count(); ) { - rt = m_proitems.at(j)->Accept(visitor); - if (rt != ReturnTrue && rt != ReturnFalse) { - if (rt == ReturnNext) { - rt = ReturnTrue; - break; - } - if (rt == ReturnBreak) - rt = ReturnTrue; - goto do_break; - } - } - do_break: - visitor->visitProLoopCleanup(); - } - break; - } - } - visitor->visitEndProBlock(this); - return rt; -} - // --------------- ProVariable ---------------- ProVariable::ProVariable(const QString &name) { @@ -167,12 +133,6 @@ ProItem::ProItemKind ProVariable::kind() const return ProItem::VariableKind; } -ProItem::ProItemReturn ProVariable::Accept(AbstractProItemVisitor *visitor) -{ - visitor->visitProVariable(this); - return ReturnTrue; -} - // --------------- ProFunction ---------------- ProFunction::ProFunction(const QString &text) { @@ -194,11 +154,6 @@ ProItem::ProItemKind ProFunction::kind() const return ProItem::FunctionKind; } -ProItem::ProItemReturn ProFunction::Accept(AbstractProItemVisitor *visitor) -{ - return visitor->visitProFunction(this); -} - // --------------- ProCondition ---------------- ProCondition::ProCondition(const QString &text) { @@ -220,12 +175,6 @@ ProItem::ProItemKind ProCondition::kind() const return ProItem::ConditionKind; } -ProItem::ProItemReturn ProCondition::Accept(AbstractProItemVisitor *visitor) -{ - visitor->visitProCondition(this); - return ReturnTrue; -} - // --------------- ProOperator ---------------- ProOperator::ProOperator(OperatorKind operatorKind) { @@ -247,12 +196,6 @@ ProItem::ProItemKind ProOperator::kind() const return ProItem::OperatorKind; } -ProItem::ProItemReturn ProOperator::Accept(AbstractProItemVisitor *visitor) -{ - visitor->visitProOperator(this); - return ReturnTrue; -} - // --------------- ProFile ---------------- ProFile::ProFile(const QString &fileName) : ProBlock(0) @@ -286,13 +229,4 @@ QString ProFile::directoryName() const return m_directoryName; } -ProItem::ProItemReturn ProFile::Accept(AbstractProItemVisitor *visitor) -{ - ProItemReturn rt; - if ((rt = visitor->visitBeginProFile(this)) != ReturnTrue) - return rt; - ProBlock::Accept(visitor); // cannot fail - return visitor->visitEndProFile(this); -} - QT_END_NAMESPACE diff --git a/src/shared/proparser/proitems.h b/src/shared/proparser/proitems.h index 1611e6b9494c7f6d1f540e2c64737337c659afee..8130e1e3c38b84606de7f019e62364928bafd537 100644 --- a/src/shared/proparser/proitems.h +++ b/src/shared/proparser/proitems.h @@ -35,8 +35,6 @@ QT_BEGIN_NAMESPACE -struct AbstractProItemVisitor; - class ProItem { public: @@ -64,7 +62,6 @@ public: virtual ProItemKind kind() const = 0; - virtual ProItemReturn Accept(AbstractProItemVisitor *visitor) = 0; int lineNumber() const { return m_lineNumber; } void setLineNumber(int lineNumber) { m_lineNumber = lineNumber; } @@ -102,11 +99,9 @@ public: ProItem::ProItemKind kind() const; - virtual ProItemReturn Accept(AbstractProItemVisitor *visitor); -protected: - QList<ProItem *> m_proitems; private: ProBlock *m_parent; + QList<ProItem *> m_proitems; int m_blockKind; int m_refCount; }; @@ -135,7 +130,6 @@ public: ProItem::ProItemKind kind() const; - virtual ProItemReturn Accept(AbstractProItemVisitor *visitor); private: VariableOperator m_variableKind; QString m_variable; @@ -152,7 +146,6 @@ public: ProItem::ProItemKind kind() const; - virtual ProItemReturn Accept(AbstractProItemVisitor *visitor); private: QString m_text; }; @@ -167,7 +160,6 @@ public: ProItem::ProItemKind kind() const; - virtual ProItemReturn Accept(AbstractProItemVisitor *visitor); private: QString m_text; }; @@ -187,7 +179,6 @@ public: ProItem::ProItemKind kind() const; - virtual ProItemReturn Accept(AbstractProItemVisitor *visitor); private: OperatorKind m_operatorKind; }; @@ -202,8 +193,6 @@ public: QString fileName() const; QString directoryName() const; - virtual ProItemReturn Accept(AbstractProItemVisitor *visitor); - private: QString m_fileName; QString m_displayFileName; diff --git a/src/shared/proparser/proparser.pri b/src/shared/proparser/proparser.pri index 353f1cc18e70223af7375bd7954693c1f6df7ead..8c8b4d8eeffb8730a76e646c62c77fc8a122cdbc 100644 --- a/src/shared/proparser/proparser.pri +++ b/src/shared/proparser/proparser.pri @@ -6,7 +6,6 @@ DEPENDPATH *= $$PWD $$PWD/.. # Input HEADERS += \ - abstractproitemvisitor.h \ profileevaluator.h \ proitems.h \ prowriter.h \ diff --git a/tests/manual/proparser/testreader.pro b/tests/manual/proparser/testreader.pro index 794d1ba10d37b392acc370eadbdfc9fc4c7ba45a..83893560e81e82de45f174e7ba9359b36e0e5ba2 100644 --- a/tests/manual/proparser/testreader.pro +++ b/tests/manual/proparser/testreader.pro @@ -15,6 +15,6 @@ build_all:!build_pass { } SOURCES = main.cpp profileevaluator.cpp proitems.cpp ioutils.cpp -HEADERS = profileevaluator.h proitems.h abstractproitemvisitor.h ioutils.h +HEADERS = profileevaluator.h proitems.h ioutils.h DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII