~ubuntu-branches/ubuntu/utopic/kdevplatform/utopic-proposed

« back to all changes in this revision

Viewing changes to shell/documentationcontroller.cpp

  • Committer: Package Import Robot
  • Author(s): Scarlett Clark
  • Date: 2014-08-30 03:52:11 UTC
  • mfrom: (0.3.26)
  • Revision ID: package-import@ubuntu.com-20140830035211-wndqlc843eu2v8nk
Tags: 1.7.0-0ubuntu1
* New upstream release
* Add XS-Testsuite: autopkgtest

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
#include <interfaces/iplugincontroller.h>
26
26
#include <interfaces/iuicontroller.h>
27
27
#include <shell/core.h>
28
 
#include <sublime/view.h>
29
28
 
30
29
#include <ktexteditor/document.h>
31
30
#include <ktexteditor/view.h>
38
37
#include <language/duchain/duchain.h>
39
38
#include <language/duchain/duchainlock.h>
40
39
#include <language/duchain/duchainutils.h>
 
40
#include <language/duchain/types/identifiedtype.h>
 
41
#include <language/duchain/types/typeutils.h>
41
42
#include <documentation/documentationview.h>
42
43
#include <KParts/MainWindow>
43
44
#include <KActionCollection>
44
45
 
45
46
using namespace KDevelop;
46
47
 
 
48
namespace {
 
49
 
 
50
/**
 
51
 * Return a "more useful" declaration that documentation providers can look-up
 
52
 *
 
53
 * @code
 
54
 *   QPoint point;
 
55
 *            ^-- cursor here
 
56
 * @endcode
 
57
 *
 
58
 * In this case, this method returns a Declaration pointer to the *type*
 
59
 * instead of a pointer to the instance, which is more useful when looking for help
 
60
 *
 
61
 * @return A more appropriate Declaration pointer or the given parameter @p decl
 
62
 */
 
63
Declaration* usefulDeclaration(Declaration* decl)
 
64
{
 
65
    if (!decl)
 
66
        return nullptr;
 
67
 
 
68
    // First: Attempt to find the declaration of a definition
 
69
    decl = DUChainUtils::declarationForDefinition(decl);
 
70
 
 
71
    // Convenience feature: Retrieve the type declaration of instances,
 
72
    // it makes no sense to pass the declaration pointer of instances of types
 
73
    if (decl->kind() == Declaration::Instance) {
 
74
        AbstractType::Ptr type = TypeUtils::targetTypeKeepAliases(decl->abstractType(), decl->topContext());
 
75
        IdentifiedType* idType = dynamic_cast<IdentifiedType*>(type.unsafeData());
 
76
        Declaration* idDecl = idType ? idType->declaration(decl->topContext()) : 0;
 
77
        if (idDecl) {
 
78
            decl = idDecl;
 
79
        }
 
80
    }
 
81
    return decl;
 
82
}
 
83
 
 
84
}
 
85
 
47
86
class DocumentationViewFactory: public KDevelop::IToolViewFactory
48
87
{
49
88
    public:
103
142
    
104
143
    KDevelop::DUChainReadLocker lock( DUChain::lock() );
105
144
    
106
 
    Declaration *dec = DUChainUtils::declarationForDefinition( DUChainUtils::itemUnderCursor( doc->url(), SimpleCursor(view->cursorPosition()) ) );
107
 
    
108
 
    if(dec) {
109
 
        KSharedPtr< IDocumentation > documentation = documentationForDeclaration(dec);
110
 
        if(documentation) {
111
 
            showDocumentation(documentation);
112
 
        }
 
145
    Declaration* decl = usefulDeclaration(DUChainUtils::itemUnderCursor(doc->url(), SimpleCursor(view->cursorPosition())));
 
146
    KSharedPtr<IDocumentation> documentation = documentationForDeclaration(decl);
 
147
    if(documentation) {
 
148
        showDocumentation(documentation);
113
149
    }
114
150
}
115
151
 
139
175
 
140
176
KSharedPtr< KDevelop::IDocumentation > DocumentationController::documentationForDeclaration(Declaration* decl)
141
177
{
 
178
    if (!decl)
 
179
        return KSharedPtr<IDocumentation>();
 
180
 
142
181
    KSharedPtr<KDevelop::IDocumentation> ret;
143
 
    
144
182
    foreach(IDocumentationProvider* doc, documentationProviders())
145
183
    {
146
184
        kDebug(9529) << "Documentation provider found:" << doc;
150
188
        if(ret)
151
189
            break;
152
190
    }
153
 
    
154
191
    return ret;
155
192
}
156
193