diff options
Diffstat (limited to 'languages/cpp/computerecoverypoints.h')
-rw-r--r-- | languages/cpp/computerecoverypoints.h | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/languages/cpp/computerecoverypoints.h b/languages/cpp/computerecoverypoints.h new file mode 100644 index 00000000..eccd44f6 --- /dev/null +++ b/languages/cpp/computerecoverypoints.h @@ -0,0 +1,190 @@ +/*************************************************************************** + begin : Sat Jul 21 2001 + copyright : (C) 2001 by Victor R�er + email : victor_roeder@gmx.de + copyright : (C) 2002,2003 by Roberto Raggi + email : roberto@kdevelop.org + copyright : (C) 2005 by Adam Treat + email : manyoso@yahoo.com + copyright : (C) 2006 by David Nolden + email : david.nolden.kdevelop@art-master.de +***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef __COMPUTERECOVERYPOINTS_H__ +#define __COMPUTERECOVERYPOINTS_H__ + +#include <qvaluestack.h> + +#include "simpletype.h" +#include "simpletypenamespace.h" +#include "tree_parser.h" + +static QString toSimpleName( NameAST* name ) +{ + if ( !name ) + return QString::null; + + QString s; + QPtrList<ClassOrNamespaceNameAST> l = name->classOrNamespaceNameList(); + QPtrListIterator<ClassOrNamespaceNameAST> nameIt( l ); + while ( nameIt.current() ) + { + if ( nameIt.current() ->name() ) + { + s += nameIt.current() ->name() ->text() + "::"; + } + ++nameIt; + } + + if ( name->unqualifiedName() && name->unqualifiedName() ->name() ) + s += name->unqualifiedName() ->name() ->text(); + + return s; +} + + +struct RecoveryPoint +{ + int kind; + QStringList scope; + QValueList<QStringList> imports; + + int startLine, startColumn; + int endLine, endColumn; + + RecoveryPoint() + : kind( 0 ), startLine( 0 ), startColumn( 0 ), + endLine( 0 ), endColumn( 0 ) + {} + + ///Registers the recovery-points imports into the given namespace + void registerImports( SimpleType ns, QString hardCodedAliases ) { + SimpleTypeNamespace* n = dynamic_cast<SimpleTypeNamespace*>( &(*ns) ); + if( !n ) { + kdDebug( 9007 ) << "the global namespace was not resolved correctly " << endl; + } else { + ///put the imports into the global namespace + for( QValueList<QStringList>::iterator it = imports.begin(); it != imports.end(); ++it ) { + kdDebug( 9007 ) << "inserting import " << *it << " into the global scope" << endl; + n->addAliasMap( QString(""), (*it).join("::"), IncludeFiles() ); ///@TODO: remove this + } + n->addAliases( hardCodedAliases ); + } + } + +private: + RecoveryPoint( const RecoveryPoint& source ); + void operator = ( const RecoveryPoint& source ); +}; + + +// namespace? +class ComputeRecoveryPoints: public TreeParser +{ +public: + ComputeRecoveryPoints( QPtrList<RecoveryPoint>& points ) + : recoveryPoints( points ) + {} + + virtual void parseTranslationUnit( const ParsedFile& ast ) + { + QValueList<QStringList> dummy; + + m_imports.push( dummy ); + TreeParser::parseTranslationUnit( ast ); + m_imports.pop(); + + kdDebug( 9007 ) << "found " << recoveryPoints.count() << " recovery points" << endl; + } + + virtual void parseUsingDirective( UsingDirectiveAST* ast ) + { + if ( !ast->name() ) + return ; + + //QStringList type = CppCodeCompletion::typeName( ast->name() ->text() ).scope(); + m_imports.top().push_back( ast->name() ->text() ); + } + + virtual void parseNamespace( NamespaceAST* ast ) + { + m_currentScope.push_back( ast->namespaceName() ->text() ); + insertRecoveryPoint( ast ); + + m_imports.push( m_imports.top() ); // dup + // m_imports.top().push_back( m_currentScope ); + + TreeParser::parseNamespace( ast ); + + m_imports.pop(); + m_currentScope.pop_back(); + } + + void parseTemplateDeclaration( TemplateDeclarationAST* ast ) + { + if ( ast->declaration() ) + parseDeclaration( ast->declaration() ); + + TreeParser::parseTemplateDeclaration( ast ); + } + + + virtual void parseSimpleDeclaration( SimpleDeclarationAST* ast ) + { + TypeSpecifierAST * typeSpec = ast->typeSpec(); + //InitDeclaratorListAST* declarators = ast->initDeclaratorList(); + + if ( typeSpec ) + parseTypeSpecifier( typeSpec ); + + //insertRecoveryPoint( ast ); + TreeParser::parseSimpleDeclaration( ast ); + } + + virtual void parseFunctionDefinition( FunctionDefinitionAST* ast ) + { + m_imports.push( m_imports.top() ); // dup + insertRecoveryPoint( ast ); + m_imports.pop(); + } + + virtual void parseClassSpecifier( ClassSpecifierAST* ast ) + { + insertRecoveryPoint( ast ); + m_currentScope.push_back( toSimpleName( ast->name() ) ); + TreeParser::parseClassSpecifier( ast ); + m_currentScope.pop_back(); + } + + void insertRecoveryPoint( AST* ast ) + { + if ( !ast ) + return ; + + RecoveryPoint* pt = new RecoveryPoint(); + pt->kind = ast->nodeType(); + pt->scope = m_currentScope; + ast->getStartPosition( &pt->startLine, &pt->startColumn ); + ast->getEndPosition( &pt->endLine, &pt->endColumn ); + pt->imports = m_imports.top(); + + recoveryPoints.append( pt ); + } + +private: + QPtrList<RecoveryPoint>& recoveryPoints; + QValueStack< QValueList<QStringList> > m_imports; + QStringList m_currentScope; +}; + +#endif +// kate: indent-mode csands; tab-width 4; |