LookupContext.h 5.11 KB
Newer Older
1
/**************************************************************************
con's avatar
con committed
2
3
4
**
** This file is part of Qt Creator
**
5
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
con's avatar
con committed
6
7
8
**
** Contact:  Qt Software Information (qt-info@nokia.com)
**
9
** Commercial Usage
10
**
11
12
13
14
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia.
15
**
16
** GNU Lesser General Public License Usage
17
**
18
19
20
21
22
23
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file.  Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24
**
25
26
** If you are unsure which license is appropriate for your use, please
** contact the sales department at qt-sales@nokia.com.
con's avatar
con committed
27
**
28
**************************************************************************/
hjk's avatar
hjk committed
29

con's avatar
con committed
30
31
32
#ifndef CPLUSPLUS_LOOKUPCONTEXT_H
#define CPLUSPLUS_LOOKUPCONTEXT_H

33
#include "CppDocument.h"
Roberto Raggi's avatar
Roberto Raggi committed
34
#include <QPair>
con's avatar
con committed
35
36
37

namespace CPlusPlus {

Roberto Raggi's avatar
Roberto Raggi committed
38
class CPLUSPLUS_EXPORT LookupContext
con's avatar
con committed
39
40
41
42
43
44
45
{
public:
    LookupContext(Control *control = 0);

    LookupContext(Symbol *symbol,
                  Document::Ptr expressionDocument,
                  Document::Ptr thisDocument,
Roberto Raggi's avatar
Roberto Raggi committed
46
                  const Snapshot &snapshot);
con's avatar
con committed
47
48
49
50
51
52
53
54

    bool isValid() const;

    Control *control() const;
    Symbol *symbol() const;
    Document::Ptr expressionDocument() const;
    Document::Ptr thisDocument() const;
    Document::Ptr document(const QString &fileName) const;
Roberto Raggi's avatar
Roberto Raggi committed
55
    Snapshot snapshot() const;
con's avatar
con committed
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

    QList<Symbol *> resolve(Name *name) const
    { return resolve(name, visibleScopes()); }

    QList<Symbol *> resolveNamespace(Name *name) const
    { return resolveNamespace(name, visibleScopes()); }

    QList<Symbol *> resolveClass(Name *name) const
    { return resolveClass(name, visibleScopes()); }

    QList<Symbol *> resolveClassOrNamespace(Name *name) const
    { return resolveClassOrNamespace(name, visibleScopes()); }

    enum ResolveMode {
        ResolveSymbol           = 0x01,
        ResolveClass            = 0x02,
        ResolveNamespace        = 0x04,
        ResolveClassOrNamespace = ResolveClass  | ResolveNamespace,
        ResolveAll              = ResolveSymbol | ResolveClassOrNamespace
    };

    QList<Symbol *> resolve(Name *name, const QList<Scope *> &visibleScopes,
                            ResolveMode mode = ResolveAll) const;

    QList<Symbol *> resolveNamespace(Name *name, const QList<Scope *> &visibleScopes) const
    { return resolve(name, visibleScopes, ResolveNamespace); }

    QList<Symbol *> resolveClass(Name *name, const QList<Scope *> &visibleScopes) const
    { return resolve(name, visibleScopes, ResolveClass); }

    QList<Symbol *> resolveClassOrNamespace(Name *name, const QList<Scope *> &visibleScopes) const
    { return resolve(name, visibleScopes, ResolveClassOrNamespace); }

    QList<Scope *> visibleScopes() const
    { return _visibleScopes; }

    QList<Scope *> visibleScopes(const QPair<FullySpecifiedType, Symbol *> &result) const;

    QList<Scope *> expand(const QList<Scope *> &scopes) const;

    void expand(const QList<Scope *> &scopes, QList<Scope *> *expandedScopes) const;

    void expand(Scope *scope, const QList<Scope *> &visibleScopes,
                QList<Scope *> *expandedScopes) const;

101
    void expandNamespace(Namespace *namespaceSymbol,
102
103
104
                         const QList<Scope *> &visibleScopes,
                         QList<Scope *> *expandedScopes) const;

105
    void expandClass(Class *classSymbol,
106
107
108
                     const QList<Scope *> &visibleScopes,
                     QList<Scope *> *expandedScopes) const;

109
    void expandBlock(Block *blockSymbol,
110
111
112
                     const QList<Scope *> &visibleScopes,
                     QList<Scope *> *expandedScopes) const;

113
    void expandFunction(Function *functionSymbol,
114
115
116
                        const QList<Scope *> &visibleScopes,
                        QList<Scope *> *expandedScopes) const;

con's avatar
con committed
117
private:
Roberto Raggi's avatar
Roberto Raggi committed
118
119
    Identifier *identifier(const Name *name) const;

con's avatar
con committed
120
    QList<Scope *> buildVisibleScopes();
121
122
123
124

    void buildVisibleScopes_helper(Document::Ptr doc, QList<Scope *> *scopes,
                                   QSet<QString> *processed);

Roberto Raggi's avatar
Roberto Raggi committed
125
    static bool isNameCompatibleWithIdentifier(Name *name, Identifier *id);
126

127
128
129
130
    static bool maybeValidSymbol(Symbol *symbol,
                                 ResolveMode mode,
                                 const QList<Symbol *> &candidates);

con's avatar
con committed
131
132
133
134
135
136
137
138
139
140
141
142
143
private:
    Control *_control;

    // The current symbol.
    Symbol *_symbol;

    // The current expression.
    Document::Ptr _expressionDocument;

    // The current document.
    Document::Ptr _thisDocument;

    // All documents.
Roberto Raggi's avatar
Roberto Raggi committed
144
    Snapshot _snapshot;
con's avatar
con committed
145
146
147
148
149
150
151
152

    // Visible scopes.
    QList<Scope *> _visibleScopes;
};

} // end of namespace CPlusPlus

#endif // CPLUSPLUS_LOOKUPCONTEXT_H