File indexing completed on 2024-05-05 04:40:21

0001 /*
0002     SPDX-FileCopyrightText: 2010 Milian Wolff <mail@milianw.de>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #ifndef QMAKEFILEVISITOR_H
0008 #define QMAKEFILEVISITOR_H
0009 
0010 #include "parser/qmakeastdefaultvisitor.h"
0011 
0012 #include "variablereferenceparser.h"
0013 
0014 #include <QHash>
0015 
0016 class QMakeVariableResolver {
0017 public:
0018     virtual ~QMakeVariableResolver() {}
0019     virtual QStringList resolveVariable(const QString& variable, VariableInfo::VariableType type) const = 0;
0020 
0021     using VariableMap = QHash<QString, QStringList>;
0022 };
0023 
0024 class QMakeFile;
0025 
0026 class QMakeFileVisitor : protected QMake::ASTDefaultVisitor, public QMakeVariableResolver {
0027 public:
0028     explicit QMakeFileVisitor(const QMakeVariableResolver* resolver, QMakeFile* baseFile);
0029     ~QMakeFileVisitor() override;
0030 
0031     QStringList resolveVariable(const QString& variable, VariableInfo::VariableType type) const override;
0032 
0033     // use this before visiting a file to set the default variables
0034     void setVariables(const VariableMap& vars);
0035     // visit whole file and return map of defined variables
0036     VariableMap visitFile(QMake::ProjectAST* node);
0037     // visit macro with given arguments and forward its returnvalue
0038     QStringList visitMacro(QMake::ScopeBodyAST* node, const QStringList& arguments);
0039 
0040 protected:
0041     void visitAssignment(QMake::AssignmentAST* node) override;
0042     void visitFunctionCall(QMake::FunctionCallAST* node) override;
0043 
0044 private:
0045     QStringList resolveVariables( const QString& value ) const;
0046 
0047     QStringList getValueList( const QList<QMake::ValueAST*>& list ) const;
0048 
0049     QStringList evaluateMacro( const QString& function, const QStringList& arguments ) const;
0050 
0051     const QMakeVariableResolver* const m_resolver;
0052     QMakeFile* m_baseFile;
0053     VariableMap m_variableValues;
0054 
0055     QHash<QString, QMake::ScopeBodyAST*> m_userMacros;
0056     QStringList m_arguments;
0057     QStringList m_lastReturn;
0058 };
0059 
0060 #endif // QMAKEFILEVISITOR_H