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.1.2.