summaryrefslogtreecommitdiffstats
path: root/languages/cpp/computerecoverypoints.h
diff options
context:
space:
mode:
Diffstat (limited to 'languages/cpp/computerecoverypoints.h')
-rw-r--r--languages/cpp/computerecoverypoints.h190
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
+ copyright : (C) 2002,2003 by Roberto Raggi
+ copyright : (C) 2005 by Adam Treat
+ copyright : (C) 2006 by David Nolden
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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;