driver.cpp
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 #include "JavaAST.hpp"
00021 #include "JavaLexer.hpp"
00022 #include "JavaRecognizer.hpp"
00023
00024 #include <kdebug.h>
00025 #include <stdlib.h>
00026 #include <qfile.h>
00027 #include <qfileinfo.h>
00028 #include <qdir.h>
00029
00030 #include <string>
00031 #include <strstream>
00032
00033 class DefaultSourceProvider: public SourceProvider
00034 {
00035 public:
00036 DefaultSourceProvider() {}
00037
00038 virtual QString contents( const QString& fileName )
00039 {
00040 QString source;
00041
00042 QFile f( fileName );
00043 if( f.open(IO_ReadOnly) ){
00044 QTextStream s( &f );
00045 source = s.read();
00046 f.close();
00047 }
00048 return source;
00049 }
00050
00051 virtual bool isModified( const QString& fileName )
00052 {
00053 Q_UNUSED( fileName );
00054 return true;
00055 }
00056
00057 private:
00058 DefaultSourceProvider( const DefaultSourceProvider& source );
00059 void operator = ( const DefaultSourceProvider& source );
00060 };
00061
00062
00063 Driver::Driver()
00064 : lexer( 0 )
00065 {
00066 m_sourceProvider = new DefaultSourceProvider();
00067 }
00068
00069 Driver::~Driver()
00070 {
00071 reset();
00072 delete( m_sourceProvider );
00073 }
00074
00075 SourceProvider* Driver::sourceProvider()
00076 {
00077 return m_sourceProvider;
00078 }
00079
00080 void Driver::setSourceProvider( SourceProvider* sourceProvider )
00081 {
00082 if( m_sourceProvider )
00083 delete( m_sourceProvider );
00084 m_sourceProvider = sourceProvider;
00085 }
00086
00087 void Driver::reset( )
00088 {
00089 m_problems.clear();
00090 m_includePaths.clear();
00091
00092 while( m_parsedUnits.size() ){
00093 RefJavaAST unit = *m_parsedUnits.begin();
00094 m_parsedUnits.remove( m_parsedUnits.begin() );
00095 delete( unit );
00096 }
00097 }
00098
00099 void Driver::remove( const QString & fileName )
00100 {
00101 m_problems.remove( fileName );
00102
00103 QMap<QString, RefJavaAST>::Iterator it = m_parsedUnits.find( fileName );
00104 if( it != m_parsedUnits.end() ){
00105 RefJavaAST unit = *it;
00106 m_parsedUnits.remove( it );
00107 delete( unit );
00108 }
00109 }
00110
00111 RefJavaAST Driver::takeTranslationUnit( const QString& fileName )
00112 {
00113 QMap<QString, RefJavaAST>::Iterator it = m_parsedUnits.find( fileName );
00114 RefJavaAST unit( *it );
00115
00116 m_parsedUnits[ fileName] = 0;
00117 return unit;
00118 }
00119
00120 RefJavaAST Driver::translationUnit( const QString& fileName ) const
00121 {
00122 QMap<QString, RefJavaAST>::ConstIterator it = m_parsedUnits.find( fileName );
00123 return it != m_parsedUnits.end() ? *it : RefJavaAST();
00124 }
00125
00126 void Driver::addProblem( const QString & fileName, const Problem & problem )
00127 {
00128 findOrInsertProblemList( fileName ).append( problem );
00129 }
00130
00131 QValueList < Problem >& Driver::findOrInsertProblemList( const QString & fileName )
00132 {
00133 QMap<QString, QValueList<Problem> >::Iterator it = m_problems.find( fileName );
00134 if( it != m_problems.end() )
00135 return it.data();
00136
00137 QValueList<Problem> l;
00138 m_problems.insert( fileName, l );
00139 return m_problems[ fileName ];
00140 }
00141
00142 QValueList < Problem > Driver::problems( const QString & fileName ) const
00143 {
00144 QMap<QString, QValueList<Problem> >::ConstIterator it = m_problems.find( fileName );
00145 if( it != m_problems.end() )
00146 return it.data();
00147 return QValueList<Problem>();
00148 }
00149
00150 void Driver::parseFile( const QString& fileName, bool onlyPreProcess, bool force )
00151 {
00152 QFileInfo fileInfo( fileName );
00153 QString absFilePath = fileInfo.absFilePath();
00154
00155 QMap<QString, RefJavaAST>::Iterator it = m_parsedUnits.find( absFilePath );
00156
00157 if( force && it != m_parsedUnits.end() ){
00158 takeTranslationUnit( absFilePath );
00159 } else if( it != m_parsedUnits.end() && *it != 0 ){
00160
00161 return;
00162 }
00163
00164 m_problems.remove( fileName );
00165
00166 m_currentFileName = fileName;
00167
00168 std::string source( sourceProvider()->contents(fileName).utf8() );
00169 std::istrstream in( source.c_str() );
00170
00171 JavaLexer lex( in );
00172 lex.setDriver( this );
00173 lexer = &lex;
00174 setupLexer( &lex );
00175
00176
00178
00179 RefJavaAST translationUnit;
00180 if( !onlyPreProcess ){
00181 JavaRecognizer parser( lex );
00182 parser.setDriver( this );
00183 setupParser( &parser );
00184
00185
00186 try{
00187
00188 ANTLR_USE_NAMESPACE(antlr)JavaASTFactory ast_factory;
00189
00190 parser.initializeASTFactory (ast_factory);
00191 parser.setASTFactory (&ast_factory);
00192
00193 parser.compilationUnit();
00194
00195 RefJavaAST translationUnit = parser.getAST();
00196 m_parsedUnits.insert( fileName, translationUnit );
00197
00198 } catch( ANTLR_USE_NAMESPACE(antlr)ANTLRException& ex ){}
00199
00200 }
00201
00202 m_currentFileName = QString::null;
00203 lexer = 0;
00204
00205 fileParsed( fileName );
00206 }
00207
00208 void Driver::setupLexer( JavaLexer * lexer )
00209 {
00210 }
00211
00212 void Driver::setupParser( JavaRecognizer * parser )
00213 {
00214 Q_UNUSED( parser );
00215 }
00216
00217 void Driver::addIncludePath( const QString &path )
00218 {
00219 if( !path.stripWhiteSpace().isEmpty() )
00220 m_includePaths << path;
00221 }
00222
00223 void Driver::fileParsed( const QString & fileName )
00224 {
00225 Q_UNUSED( fileName );
00226 }
This file is part of the documentation for KDevelop Version 3.1.2.