summaryrefslogtreecommitdiffstats
path: root/languages/java/driver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'languages/java/driver.cpp')
-rw-r--r--languages/java/driver.cpp227
1 files changed, 227 insertions, 0 deletions
diff --git a/languages/java/driver.cpp b/languages/java/driver.cpp
new file mode 100644
index 00000000..f5bb6bfc
--- /dev/null
+++ b/languages/java/driver.cpp
@@ -0,0 +1,227 @@
+/* This file is part of KDevelop
+ Copyright (C) 2002,2003 Roberto Raggi <[email protected]>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#include "JavaAST.hpp"
+#include "JavaLexer.hpp"
+#include "JavaRecognizer.hpp"
+
+#include <kdebug.h>
+#include <stdlib.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qdir.h>
+
+#include <string>
+#include <sstream>
+
+class DefaultSourceProvider: public SourceProvider
+{
+public:
+ DefaultSourceProvider() {}
+
+ virtual QString contents( const QString& fileName )
+ {
+ QString source;
+
+ QFile f( fileName );
+ if( f.open(IO_ReadOnly) ){
+ QTextStream s( &f );
+ source = s.read();
+ f.close();
+ }
+ return source;
+ }
+
+ virtual bool isModified( const QString& fileName )
+ {
+ Q_UNUSED( fileName );
+ return true;
+ }
+
+private:
+ DefaultSourceProvider( const DefaultSourceProvider& source );
+ void operator = ( const DefaultSourceProvider& source );
+};
+
+
+Driver::Driver()
+ : lexer( 0 )
+{
+ m_sourceProvider = new DefaultSourceProvider();
+}
+
+Driver::~Driver()
+{
+ reset();
+ delete( m_sourceProvider );
+}
+
+SourceProvider* Driver::sourceProvider()
+{
+ return m_sourceProvider;
+}
+
+void Driver::setSourceProvider( SourceProvider* sourceProvider )
+{
+ if( m_sourceProvider )
+ delete( m_sourceProvider );
+ m_sourceProvider = sourceProvider;
+}
+
+void Driver::reset( )
+{
+ m_problems.clear();
+ m_includePaths.clear();
+
+ while( m_parsedUnits.size() ){
+ RefJavaAST unit = *m_parsedUnits.begin();
+ m_parsedUnits.remove( m_parsedUnits.begin() );
+ delete( unit );
+ }
+}
+
+void Driver::remove( const QString & fileName )
+{
+ m_problems.remove( fileName );
+
+ QMap<QString, RefJavaAST>::Iterator it = m_parsedUnits.find( fileName );
+ if( it != m_parsedUnits.end() ){
+ RefJavaAST unit = *it;
+ m_parsedUnits.remove( it );
+ delete( unit );
+ }
+}
+
+RefJavaAST Driver::takeTranslationUnit( const QString& fileName )
+{
+ QMap<QString, RefJavaAST>::Iterator it = m_parsedUnits.find( fileName );
+ RefJavaAST unit( *it );
+ //m_parsedUnits.remove( it );
+ m_parsedUnits[ fileName] = 0;
+ return unit;
+}
+
+RefJavaAST Driver::translationUnit( const QString& fileName ) const
+{
+ QMap<QString, RefJavaAST>::ConstIterator it = m_parsedUnits.find( fileName );
+ return it != m_parsedUnits.end() ? *it : RefJavaAST();
+}
+
+void Driver::addProblem( const QString & fileName, const Problem & problem )
+{
+ findOrInsertProblemList( fileName ).append( problem );
+}
+
+QValueList < Problem >& Driver::findOrInsertProblemList( const QString & fileName )
+{
+ QMap<QString, QValueList<Problem> >::Iterator it = m_problems.find( fileName );
+ if( it != m_problems.end() )
+ return it.data();
+
+ QValueList<Problem> l;
+ m_problems.insert( fileName, l );
+ return m_problems[ fileName ];
+}
+
+QValueList < Problem > Driver::problems( const QString & fileName ) const
+{
+ QMap<QString, QValueList<Problem> >::ConstIterator it = m_problems.find( fileName );
+ if( it != m_problems.end() )
+ return it.data();
+ return QValueList<Problem>();
+}
+
+void Driver::parseFile( const QString& fileName, bool onlyPreProcess, bool force )
+{
+ QFileInfo fileInfo( fileName );
+ QString absFilePath = fileInfo.absFilePath();
+
+ QMap<QString, RefJavaAST>::Iterator it = m_parsedUnits.find( absFilePath );
+
+ if( force && it != m_parsedUnits.end() ){
+ takeTranslationUnit( absFilePath );
+ } else if( it != m_parsedUnits.end() && *it != 0 ){
+ // file already processed
+ return;
+ }
+
+ m_problems.remove( fileName );
+
+ m_currentFileName = fileName;
+
+ std::string source( sourceProvider()->contents(fileName).utf8() );
+ std::istringstream in( source.c_str() );
+
+ JavaLexer lex( in );
+ lex.setDriver( this );
+ lexer = &lex;
+ setupLexer( &lex );
+
+
+ /// @todo lex.setSource( sourceProvider()->contents(fileName) );
+
+ RefJavaAST translationUnit;
+ if( !onlyPreProcess ){
+ JavaRecognizer parser( lex );
+ parser.setDriver( this );
+ setupParser( &parser );
+
+
+ try{
+ // make an ast factory
+ ANTLR_USE_NAMESPACE(antlr)JavaASTFactory ast_factory;
+ // initialize and put it in the parser...
+ parser.initializeASTFactory (ast_factory);
+ parser.setASTFactory (&ast_factory);
+
+ parser.compilationUnit();
+
+ RefJavaAST translationUnit = RefJavaAST( parser.getAST() );
+ m_parsedUnits.insert( fileName, translationUnit );
+
+ } catch( ANTLR_USE_NAMESPACE(antlr)ANTLRException& ex ){}
+
+ }
+
+ m_currentFileName = QString::null;
+ lexer = 0;
+
+ fileParsed( fileName );
+}
+
+void Driver::setupLexer( JavaLexer * // lexer
+ )
+{
+}
+
+void Driver::setupParser( JavaRecognizer * parser )
+{
+ Q_UNUSED( parser );
+}
+
+void Driver::addIncludePath( const QString &path )
+{
+ if( !path.stripWhiteSpace().isEmpty() )
+ m_includePaths << path;
+}
+
+void Driver::fileParsed( const QString & fileName )
+{
+ Q_UNUSED( fileName );
+}