1
/* KDevelop CMake Support
3
* Copyright 2007 Aleix Pol <aleixpol@gmail.com>
5
* This program is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU General Public License
7
* as published by the Free Software Foundation; either version 2
8
* of the License, or (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21
#ifndef CMAKEPROJECTVISITOR_H
22
#define CMAKEPROJECTVISITOR_H
25
#include <QStringList>
30
#include "cmakeastvisitor.h"
31
#include "cmakelistsparser.h"
32
#include "cmaketypes.h"
33
#include <language/duchain/topducontext.h>
34
class CMakeFunctionDesc;
42
class KDEVCMAKECOMMON_EXPORT CMakeProjectVisitor : CMakeAstVisitor
45
explicit CMakeProjectVisitor(const QString& root, KDevelop::ReferencedTopDUContext parent);
46
virtual ~CMakeProjectVisitor() {}
48
virtual int visit( const CustomCommandAst * );
49
virtual int visit( const CustomTargetAst * );
50
virtual int visit( const AddDefinitionsAst * );
51
virtual int visit( const AddTestAst * );
52
virtual int visit( const AddExecutableAst * );
53
virtual int visit( const AddLibraryAst * );
54
virtual int visit( const AddSubdirectoryAst * );
55
virtual int visit( const IncludeDirectoriesAst * );
56
virtual int visit( const IncludeAst * );
57
virtual int visit( const MacroCallAst * call);
58
virtual int visit( const FindPackageAst * );
59
virtual int visit( const MarkAsAdvancedAst * );
60
virtual int visit( const FindProgramAst * );
61
virtual int visit( const FunctionAst * );
62
virtual int visit( const FindPathAst * );
63
virtual int visit( const FindLibraryAst * );
64
virtual int visit( const FindFileAst * );
65
virtual int visit( const IfAst * );
66
virtual int visit( const ExecProgramAst * );
67
virtual int visit( const ExecuteProcessAst * );
68
virtual int visit( const FileAst * );
69
virtual int visit( const MessageAst * );
70
virtual int visit( const MathAst * );
71
virtual int visit( const MacroAst * );
72
virtual int visit( const ListAst * );
73
virtual int visit( const GetDirPropertyAst * );
74
virtual int visit( const GetFilenameComponentAst * );
75
virtual int visit( const GetSourceFilePropAst * );
76
virtual int visit( const GetTargetPropAst * );
77
virtual int visit( const OptionAst * );
78
virtual int visit( const SetAst * );
79
virtual int visit( const ForeachAst * );
80
virtual int visit( const ProjectAst * );
81
virtual int visit( const SetPropertyAst* );
82
virtual int visit( const SetTargetPropsAst * );
83
virtual int visit( const SetDirectoryPropsAst * );
84
virtual int visit( const StringAst * );
85
virtual int visit( const SubdirsAst * );
86
virtual int visit( const TryCompileAst * );
87
virtual int visit( const TargetLinkLibrariesAst * );
88
virtual int visit( const GetCMakePropertyAst * );
89
virtual int visit( const GetPropertyAst* );
90
virtual int visit( const RemoveDefinitionsAst * );
91
virtual int visit( const SeparateArgumentsAst * );
92
virtual int visit( const WhileAst * );
93
virtual int visit( const CMakeAst * );
96
void setCacheValues( CacheValues* cache);
97
void setVariableMap( VariableMap* vars );
98
void setMacroMap( MacroMap* macros ) { m_macros=macros; }
99
void setModulePath(const QStringList& mp) { m_modulePath=mp; }
100
void setDefinitions(const CMakeDefinitions& defs) { m_defs=defs; }
102
const VariableMap* variables() const { return m_vars; }
103
const CMakeDefinitions& definitions() const { return m_defs; }
105
QString projectName() const { return m_projectName; }
106
QList<Subdirectory> subdirectories() const { return m_subdirectories; }
107
QList<Target> targets() const { return m_targetForId.values(); }
108
QStringList resolveDependencies(const QStringList& target) const;
109
QStringList includeDirectories() const { return m_includeDirectories; }
111
int walk(const CMakeFileContent& fc, int line, bool isClean=false);
113
// static VariableType hasVariable(const QString &name);
114
static QStringList envVarDirectories(const QString &varName);
116
// enum FileType { Location, File, Executable, Library };
117
static QString findFile(const QString& files, const QStringList &folders,
118
const QStringList& suffixes=QStringList(), bool location=false);
120
QString findExecutable(const QString& filenames, const QStringList& dirs,
121
const QStringList& pathSuffixes=QStringList()) const;
123
KDevelop::ReferencedTopDUContext context() const { return m_topctx; }
124
QStringList resolveVariable(const CMakeFunctionArgument &exp);
126
bool hasMacro(const QString& name) const;
130
const CMakeFileContent* code;
132
KDevelop::ReferencedTopDUContext context;
134
CMakeProperties properties() { return m_props; }
138
IntPair(int f, int s, int l) : first(f), second(s), level(l) {}
139
int first, second, level;
140
QString print() const { return QString("(%1, %2 : %3)").arg(first).arg(second).arg(level); }
141
static QStringList printList(const QList<IntPair>& l)
144
foreach(const IntPair& i, l)
150
static QList< IntPair > parseArgument(const QString &exp);
153
static KDevelop::ReferencedTopDUContext
154
createContext(const KUrl& path, KDevelop::ReferencedTopDUContext aux, int endl ,int endc, bool isClean);
156
void macroDeclaration(const CMakeFunctionDesc& def, const CMakeFunctionDesc& end, const QStringList& args);
157
CMakeFunctionDesc resolveVariables(const CMakeFunctionDesc &exp);
158
QStringList value(const QString& exp, const QList<IntPair>& poss, int& desired) const;
159
QStringList theValue(const QString& exp, const IntPair& p) const;
161
void defineTarget(const QString& id, const QStringList& sources, Target::Type t);
162
int notImplemented(const QString& n) const;
163
bool haveToFind(const QString &varName);
164
void createDefinitions(const CMakeAst* ast);
165
void createUses(const CMakeFunctionDesc& ast);
166
void printBacktrace(const QStack<VisitorState> &backtrace);
167
VisitorState stackTop() const;
168
QStringList dependees(const QString& s) const;
169
int declareFunction(Macro m, const CMakeFileContent& content, int initial, const QString& end);
171
CMakeProperties m_props;
172
QStringList m_modulePath;
173
QString m_projectName;
174
QList<Subdirectory> m_subdirectories;
175
QStringList m_includeDirectories;
176
QMap<QString, QStringList> m_generatedFiles;
177
QMap<QString, Target> m_targetForId;
179
QStack< VisitorState > m_backtrace;
183
const CacheValues* m_cache;
184
CMakeDefinitions m_defs;
185
KDevelop::ReferencedTopDUContext m_topctx;
186
KDevelop::ReferencedTopDUContext m_parentCtx;