summaryrefslogtreecommitdiffstats
path: root/languages/cpp/store_walker.h
blob: 488e692bbd7b056f0fdb297890361dd1e8faa4ea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
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;