lib/cppparser/driver.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
#ifndef DRIVER_H
00021
#define DRIVER_H
00022
00023
#include "ast.h"
00024
00025
#include <qpair.h>
00026
#include <qvaluestack.h>
00027
#include <qstringlist.h>
00028
#include <qmap.h>
00029
00030
class Lexer;
00031
class Parser;
00032
00033 class Problem
00034 {
00035
public:
00036
enum
00037 {
00038
Level_Error = 0,
00039
Level_Warning,
00040
Level_Todo,
00041
Level_Fixme
00042 };
00043
00044
public:
00045 Problem() {}
00046 Problem(
const Problem& source )
00047 :
m_text( source.
m_text ),
m_line( source.
m_line ),
00048
m_column( source.
m_column ),
m_level( source.
m_level ) {}
00049 Problem(
const QString& text,
int line,
int column,
int level=Level_Error )
00050 :
m_text(
text ),
m_line( line ),
m_column( column ),
m_level(
level) {}
00051
00052 Problem& operator = (
const Problem& source )
00053 {
00054
m_text = source.
m_text;
00055
m_line = source.
m_line;
00056
m_column = source.
m_column;
00057
m_level = source.
m_level;
00058
return( *this );
00059 }
00060
00061 bool operator == (
const Problem& p )
const
00062
{
00063
return m_text == p.
m_text &&
m_line == p.
m_line &&
m_column == p.
m_column &&
m_level == p.
m_level;
00064 }
00065
00066 QString text()
const {
return m_text; }
00067 int line()
const {
return m_line; }
00068 int column()
const {
return m_column; }
00069 int level()
const {
return m_level; }
00070
00071
private:
00072
QString m_text;
00073
int m_line;
00074
int m_column;
00075
int m_level;
00076 };
00077
00078
enum
00079 {
00080
Dep_Global,
00081
Dep_Local
00082 };
00083
00084 typedef QPair<QString, int> Dependence;
00085
00086 class Macro
00087 {
00088
public:
00089 typedef QString Argument;
00090
00091
public:
00092 Macro(
bool hasArguments =
false ):
m_hasArguments(
hasArguments ) {}
00093 Macro(
const QString &n,
const QString &b ) :
m_name( n ),
m_body( b ),
m_hasArguments( false ) {}
00094
00095 Macro(
const Macro& source )
00096 :
m_name( source.
m_name),
00097
m_fileName( source.
m_fileName ),
00098
m_body( source.
m_body ),
00099
m_hasArguments( source.
m_hasArguments ),
00100
m_argumentList( source.
m_argumentList ) {}
00101
00102 Macro& operator = (
const Macro& source )
00103 {
00104
m_name = source.
m_name;
00105
m_body = source.
m_body;
00106
m_fileName = source.
m_fileName;
00107
m_hasArguments = source.
m_hasArguments;
00108
m_argumentList = source.
m_argumentList;
00109
return *
this;
00110 }
00111
00112 bool operator == (
const Macro& source )
const
00113
{
00114
return
00115
m_name == source.
m_name &&
00116
m_fileName == source.
m_fileName &&
00117
m_body == source.
m_body &&
00118
m_hasArguments == source.
m_hasArguments &&
00119
m_argumentList == source.
m_argumentList;
00120 }
00121
00122 QString name()
const {
return m_name; }
00123 void setName(
const QString& name ) {
m_name = name; }
00124
00125 QString fileName()
const {
return m_fileName; }
00126 void setFileName(
const QString& fileName ) {
m_fileName = fileName; }
00127
00128 QString body()
const {
return m_body; }
00129 void setBody(
const QString& body ) {
m_body = body; }
00130
00131 bool hasArguments()
const {
return m_hasArguments; }
00132 void setHasArguments(
bool hasArguments ) {
m_hasArguments = hasArguments; }
00133 QValueList<Argument> argumentList()
const {
return m_argumentList; }
00134
00135 void clearArgumentList() {
m_argumentList.clear();
m_hasArguments =
false; }
00136 void addArgument(
const Argument& argument ) {
m_argumentList << argument; }
00137 void addArgumentList(
const QValueList<Argument>& arguments ) {
m_argumentList += arguments; }
00138
00139
private:
00140 QString m_name;
00141 QString m_fileName;
00142 QString m_body;
00143 bool m_hasArguments;
00144 QValueList<Argument> m_argumentList;
00145 };
00146
00147 class SourceProvider
00148 {
00149
public:
00150 SourceProvider() {}
00151 virtual ~SourceProvider() {}
00152
00153
virtual QString contents(
const QString& fileName ) = 0;
00154
virtual bool isModified(
const QString& fileName ) = 0;
00155
00156
private:
00157
SourceProvider(
const SourceProvider& source );
00158
void operator = (
const SourceProvider& source );
00159 };
00160
00161 class Driver
00162 {
00163
public:
00164
Driver();
00165
virtual ~Driver();
00166
00167
SourceProvider*
sourceProvider();
00168
void setSourceProvider(
SourceProvider* sourceProvider );
00169
00170
virtual void reset();
00171
00172
virtual void parseFile(
const QString& fileName,
bool onlyPreProcesss=
false,
bool force=
false );
00173
virtual void fileParsed(
const QString& fileName );
00174
virtual void remove(
const QString& fileName );
00175
00176
virtual void addDependence(
const QString& fileName,
const Dependence& dep );
00177
virtual void addMacro(
const Macro&
macro );
00178
virtual void addProblem(
const QString& fileName,
const Problem& problem );
00179
00180
00181 QString currentFileName()
const {
return m_currentFileName; }
00182 TranslationUnitAST::Node takeTranslationUnit(
const QString& fileName );
00183
TranslationUnitAST* translationUnit(
const QString& fileName )
const;
00184
QMap<QString, Dependence> dependences(
const QString& fileName )
const;
00185
QMap<QString, Macro> macros() const;
00186
QValueList<
Problem> problems( const
QString& fileName ) const;
00187
00188 bool hasMacro( const
QString& name )
const {
return m_macros.contains( name ); }
00189 const Macro& macro(
const QString& name )
const {
return m_macros[ name ]; }
00190 Macro& macro(
const QString& name ) {
return m_macros[ name ]; }
00191
00192
virtual void removeMacro(
const QString& macroName );
00193
virtual void removeAllMacrosInFile(
const QString& fileName );
00194
00195 QStringList includePaths()
const {
return m_includePaths; }
00196
virtual void addIncludePath(
const QString &path );
00197
00199 const QMap<QString, TranslationUnitAST*> &
parsedUnits()
const {
return m_parsedUnits; }
00200
00201
virtual void setResolveDependencesEnabled(
bool enabled );
00202 bool isResolveDependencesEnabled()
const {
return depresolv; }
00203
00204
protected:
00205
virtual void setupLexer(
Lexer* lexer );
00206
virtual void setupParser(
Parser* parser );
00207
virtual void setupPreProcessor();
00208
00209
private:
00210
QMap<QString, Dependence>& findOrInsertDependenceList(
const QString& fileName );
00211
QValueList<Problem>& findOrInsertProblemList(
const QString& fileName );
00212
QString findIncludeFile(
const Dependence& dep )
const;
00213
00214
private:
00215
QString m_currentFileName;
00216 QMap< QString, QMap<QString, Dependence> >
m_dependences;
00217 QMap<QString, Macro> m_macros;
00218 QMap< QString, QValueList<Problem> >
m_problems;
00219 QMap<QString, TranslationUnitAST*> m_parsedUnits;
00220
QStringList m_includePaths;
00221 uint
depresolv : 1;
00222 Lexer *
lexer;
00223 SourceProvider*
m_sourceProvider;
00224
00225
private:
00226
Driver(
const Driver& source );
00227
void operator = (
const Driver& source );
00228 };
00229
00230
#endif
This file is part of the documentation for KDevelop Version 3.0.4.