summaryrefslogtreecommitdiffstats
path: root/languages/cpp/store_walker.h
blob: 1e646d7942cf8ccb001e56017d98b83dad3aea07 (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 <tqstringlist.h>
#include <tqvaluestack.h>
#include <hashedstring.h>

class StoreWalker: public TreeParser
{
public:
    StoreWalker( const TQString& 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 TQString& name );
	TQString typeOfDeclaration( TypeSpecifierAST* typeSpec, DeclaratorAST* declarator );
	TQStringList scopeOfName( NameAST* id, const TQStringList& scope );
	TQStringList scopeOfDeclarator( DeclaratorAST* d, const TQStringList& scope );
    ClassDom classFromScope(const TQStringList& scope);
    ClassDom findClassFromScope(const TQStringList& scope);
    void checkTemplateDeclarator( TemplateModelItem* item );
private:
    
    class CommentPusher {
        StoreWalker& m_ref;
    public:
        CommentPusher( StoreWalker& ref, TQString comment ) : m_ref( ref ) {
            m_ref.pushComment( comment );
        }
        ~CommentPusher() {
            m_ref.popComment();
        }
    };
    
    TQStringList m_comments;
    
    TQString 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( TQString comm ) {
        m_comments.push_front( comm );
    }
    
    void popComment() {
        m_comments.pop_front();
    }

    void setOverrides( const TQMap<TQString, FileDom>& overrides ) {
      m_overrides = overrides;
    }
private:

    TQMap<TQString, FileDom> m_overrides;
    
	FileDom m_file;
	TQString m_fileName;
    HashedString m_hashedFileName;
	TQStringList m_currentScope;
	CodeModel* m_store;
	TQValueList<TQPair<TQMap<TQString, ClassDom>, TQStringList> > m_imports;
	int m_currentAccess;
	bool m_inSlots;
	bool m_inSignals;
	int m_anon;
	bool m_inStorageSpec;
	bool m_inTypedef;

	DeclaratorAST* m_currentDeclarator;
    TQValueStack<TemplateDeclarationAST*> m_currentTemplateDeclarator;
	TQValueStack<NamespaceDom> m_currentNamespace;
	TQValueStack<ClassDom> m_currentClass;

    TQStringList findScope( const TQStringList& scope );
    
    
private:
	StoreWalker( const StoreWalker& source );
	void operator = ( const StoreWalker& source );
};

#endif // __store_walker_h 
// kate: indent-mode csands; tab-width 4;