summaryrefslogtreecommitdiffstats
path: root/languages/cpp/tag_creator.h
blob: 425d7135089ef6be3da97a7f84d554e47d5cc9b9 (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
/***************************************************************************
*   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 __tag_creator_h
#define __tag_creator_h

#include "tree_parser.h"

#include <tqstringlist.h>
#include <tqvaluestack.h>

class Catalog;
class Tag;

namespace TagUtils
{
	int stringToAccess( const TQString& access );
	TQString accessToString( int id );
}

class TagCreator: public TreeParser
{
public:
	TagCreator( const TQString& fileName, Catalog* c );
	virtual ~TagCreator();

	// translation-unit
	virtual void parseTranslationUnit( const ParsedFile& );

	// declarations
	virtual void parseDeclaration( DeclarationAST* );
	virtual void parseNamespace( NamespaceAST* );
    virtual void parseNamespaceAlias( NamespaceAliasAST* decl );
	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* );

	// type-specifier
	virtual void parseClassSpecifier( ClassSpecifierAST* );
	virtual void parseEnumSpecifier( EnumSpecifierAST* );
	virtual void parseElaboratedTypeSpecifier( ElaboratedTypeSpecifierAST* );

	virtual void parseMyDeclaration( GroupAST* funSpec, GroupAST* storageSpec, TypeSpecifierAST* typeSpec, InitDeclaratorAST* decl );
	virtual void parseFunctionDeclaration( GroupAST* funSpec, GroupAST* storageSpec, TypeSpecifierAST* typeSpec, InitDeclaratorAST* decl );
	virtual void parseFunctionArguments( Tag& tag, DeclaratorAST* declarator );
	virtual void parseBaseClause( const TQString& className, BaseClauseAST* baseClause );

	/**
	 call this function after the last use of a TagCreator object, to do cleanup work
	*/
	static void destroyDocumentation();

	/**
	This sets the directories, where the doxygen documentation should be searched in.
	@param dirs TQStringList containing strings, which define the pathes, where documentation is searched in
	*/
	static void setDocumentationDirectories( const TQStringList& dirs );


private:
	TQString scopeOfDeclarator( DeclaratorAST* d );
	TQString typeOfDeclaration( TypeSpecifierAST* typeSpec, DeclaratorAST* declarator );

private:
    
    void takeTemplateParams( Tag& target, TemplateDeclarationAST* ast );
    void checkTemplateDeclarator( Tag& tag );
    
    class CommentPusher {
        TagCreator& m_ref;
    public:
    CommentPusher( TagCreator& 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();
        }
    }
    
    void pushComment( TQString comm ) {
        m_comments.push_front( comm );
    }
    
    void popComment() {
        m_comments.pop_front();
    }
    
	Catalog* m_catalog;
	TQString m_fileName;
	TQStringList m_currentScope;
	TQValueList<TQStringList> m_imports;
	TQString m_currentAccess;
	bool m_inClass;
	bool m_inSlots;
	bool m_inSignals;
	int m_anon;

    TQValueStack<TemplateDeclarationAST*> m_currentTemplateDeclarator;
    
	static class DoxyDoc* m_documentation;

private:
	TagCreator( const TagCreator& source );
	void operator = ( const TagCreator& source );
};

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