KDevelop API Documentation

driver.h

Go to the documentation of this file.
00001 /* This file is part of KDevelop
00002     Copyright (C) 2002,2003 Roberto Raggi <roberto@kdevelop.org>
00003 
00004     This library is free software; you can redistribute it and/or
00005     modify it under the terms of the GNU Library General Public
00006     License as published by the Free Software Foundation; either
00007     version 2 of the License, or (at your option) any later version.
00008 
00009     This library is distributed in the hope that it will be useful,
00010     but WITHOUT ANY WARRANTY; without even the implied warranty of
00011     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012     Library General Public License for more details.
00013 
00014     You should have received a copy of the GNU Library General Public License
00015     along with this library; see the file COPYING.LIB.  If not, write to
00016     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00017     Boston, MA 02111-1307, USA.
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
KDE Logo
This file is part of the documentation for KDevelop Version 3.1.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Mar 23 00:03:51 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003