summaryrefslogtreecommitdiffstats
path: root/languages/cpp/store_walker.h
diff options
context:
space:
mode:
Diffstat (limited to 'languages/cpp/store_walker.h')
-rw-r--r--languages/cpp/store_walker.h141
1 files changed, 141 insertions, 0 deletions
diff --git a/languages/cpp/store_walker.h b/languages/cpp/store_walker.h
new file mode 100644
index 00000000..488e692b
--- /dev/null
+++ b/languages/cpp/store_walker.h
@@ -0,0 +1,141 @@
+/***************************************************************************
+* Copyright (C) 2003 by Roberto Raggi *
+* roberto@kdevelop.org *
+* *
+* 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 __store_walker_h
+#define __store_walker_h
+
+#include "tree_parser.h"
+#include <codemodel.h>
+#include <qstringlist.h>
+#include <qvaluestack.h>
+#include <hashedstring.h>
+
+class StoreWalker: public TreeParser
+{
+public:
+ StoreWalker( const QString& fileName, CodeModel* store );
+ virtual ~StoreWalker();
+
+ FileDom file()
+ {
+ return m_file;
+ }
+
+ // translation-unit
+ virtual void parseTranslationUnit( const ParsedFile& );
+
+ // declarations
+ virtual void parseDeclaration( DeclarationAST* );
+ virtual void parseLinkageSpecification( LinkageSpecificationAST* );
+ virtual void parseNamespace( NamespaceAST* );
+ virtual void parseNamespaceAlias( NamespaceAliasAST* );
+ virtual void parseUsing( UsingAST* );
+ virtual void parseUsingDirective( UsingDirectiveAST* );
+ virtual void parseTypedef( TypedefAST* );
+ virtual void parseTemplateDeclaration( TemplateDeclarationAST* );
+ virtual void parseSimpleDeclaration( SimpleDeclarationAST* );
+ virtual void parseFunctionDefinition( FunctionDefinitionAST* );
+ virtual void parseLinkageBody( LinkageBodyAST* );
+ virtual void parseAccessDeclaration( AccessDeclarationAST* );
+
+ void takeTemplateParams( TemplateModelItem& target, TemplateDeclarationAST*);
+
+ // type-specifier
+ virtual void parseTypeSpecifier( TypeSpecifierAST* );
+ virtual void parseClassSpecifier( ClassSpecifierAST* );
+ virtual void parseEnumSpecifier( EnumSpecifierAST* );
+ virtual void parseElaboratedTypeSpecifier( ElaboratedTypeSpecifierAST* );
+
+ virtual void parseTypeDeclaratation( TypeSpecifierAST* typeSpec );
+ virtual void parseDeclaration( GroupAST* funSpec, GroupAST* storageSpec, TypeSpecifierAST* typeSpec, InitDeclaratorAST* decl );
+ virtual void parseFunctionDeclaration( GroupAST* funSpec, GroupAST* storageSpec, TypeSpecifierAST* typeSpec, InitDeclaratorAST* decl );
+ virtual void parseFunctionArguments( DeclaratorAST* declarator, FunctionDom method );
+ virtual void parseBaseClause( BaseClauseAST* baseClause, ClassDom klass );
+
+private:
+ NamespaceDom findOrInsertNamespace( NamespaceAST* ast, const QString& name );
+ QString typeOfDeclaration( TypeSpecifierAST* typeSpec, DeclaratorAST* declarator );
+ QStringList scopeOfName( NameAST* id, const QStringList& scope );
+ QStringList scopeOfDeclarator( DeclaratorAST* d, const QStringList& scope );
+ ClassDom classFromScope(const QStringList& scope);
+ ClassDom findClassFromScope(const QStringList& scope);
+ void checkTemplateDeclarator( TemplateModelItem* item );
+private:
+
+ class CommentPusher {
+ StoreWalker& m_ref;
+ public:
+ CommentPusher( StoreWalker& ref, QString comment ) : m_ref( ref ) {
+ m_ref.pushComment( comment );
+ }
+ ~CommentPusher() {
+ m_ref.popComment();
+ }
+ };
+
+ QStringList m_comments;
+
+ QString comment() {
+ if( m_comments.isEmpty() ) {
+ return "";
+ } else {
+ return m_comments.front();
+ }
+ }
+
+ //Own implementation that also merges the groups of the overrides
+ int mergeGroups( int g1, int g2 );
+
+public:
+ void pushComment( QString comm ) {
+ m_comments.push_front( comm );
+ }
+
+ void popComment() {
+ m_comments.pop_front();
+ }
+
+ void setOverrides( const QMap<QString, FileDom>& overrides ) {
+ m_overrides = overrides;
+ }
+private:
+
+ QMap<QString, FileDom> m_overrides;
+
+ FileDom m_file;
+ QString m_fileName;
+ HashedString m_hashedFileName;
+ QStringList m_currentScope;
+ CodeModel* m_store;
+ QValueList<QPair<QMap<QString, ClassDom>, QStringList> > m_imports;
+ int m_currentAccess;
+ bool m_inSlots;
+ bool m_inSignals;
+ int m_anon;
+ bool m_inStorageSpec;
+ bool m_inTypedef;
+
+ DeclaratorAST* m_currentDeclarator;
+ QValueStack<TemplateDeclarationAST*> m_currentTemplateDeclarator;
+ QValueStack<NamespaceDom> m_currentNamespace;
+ QValueStack<ClassDom> m_currentClass;
+
+ QStringList findScope( const QStringList& scope );
+
+
+private:
+ StoreWalker( const StoreWalker& source );
+ void operator = ( const StoreWalker& source );
+};
+
+#endif // __store_walker_h
+// kate: indent-mode csands; tab-width 4;
+