File: codecontext.cpp

package info (click to toggle)
kdevelop 4%3A22.12.2-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 70,096 kB
  • sloc: cpp: 284,635; javascript: 3,558; python: 3,422; sh: 1,319; ansic: 685; xml: 331; php: 95; lisp: 66; makefile: 39; sed: 12
file content (132 lines) | stat: -rw-r--r-- 3,624 bytes parent folder | download | duplicates (3)
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
/*
    SPDX-FileCopyrightText: 2001-2002 Matthias Hoelzer-Kluepfel <hoelzer@kde.org>
    SPDX-FileCopyrightText: 2001-2002 Bernd Gehrmann <bernd@kdevelop.org>
    SPDX-FileCopyrightText: 2001 Sandy Meier <smeier@kdevelop.org>
    SPDX-FileCopyrightText: 2002 Daniel Engelschalt <daniel.engelschalt@gmx.net>
    SPDX-FileCopyrightText: 2002 Simon Hausmann <hausmann@kde.org>
    SPDX-FileCopyrightText: 2002-2003 Roberto Raggi <roberto@kdevelop.org>
    SPDX-FileCopyrightText: 2003 Mario Scalas <mario.scalas@libero.it>
    SPDX-FileCopyrightText: 2003 Harald Fernengel <harry@kdevelop.org>
    SPDX-FileCopyrightText: 2003, 2006, 2008 Hamish Rodda <rodda@kde.org>
    SPDX-FileCopyrightText: 2004 Alexander Dymo <adymo@kdevelop.org>
    SPDX-FileCopyrightText: 2006 Adam Treat <treat@kde.org>

    SPDX-License-Identifier: LGPL-2.0-or-later
*/

#include "codecontext.h"

#include <duchain/declaration.h>
#include <duchain/ducontext.h>
#include <duchain/duchainlock.h>
#include <duchain/duchain.h>
#include <duchain/duchainutils.h>
#include <duchain/use.h>

#include <KTextEditor/Document>
#include <KTextEditor/View>

namespace KDevelop {
class DUContextContextPrivate
{
public:
    explicit DUContextContextPrivate(const IndexedDUContext& item)
        : m_item(item)
    {}

    IndexedDUContext m_item;
};

DUContextContext::DUContextContext(const IndexedDUContext& item)
    : Context()
    , d_ptr(new DUContextContextPrivate(item))
{}

DUContextContext::~DUContextContext() = default;

int DUContextContext::type() const
{
    return Context::CodeContext;
}

QList<QUrl> DUContextContext::urls() const
{
    Q_D(const DUContextContext);

    DUChainReadLocker lock;
    if (auto context = d->m_item.context()) {
        return {
                   context->url().toUrl()
        };
    }
    return {};
}

IndexedDUContext DUContextContext::context() const
{
    Q_D(const DUContextContext);

    return d->m_item;
}
void DUContextContext::setContext(IndexedDUContext context)
{
    Q_D(DUContextContext);

    d->m_item = context;
}

class DeclarationContextPrivate
{
public:
    DeclarationContextPrivate(const IndexedDeclaration& declaration, const DocumentRange& use)
        : m_declaration(declaration)
        , m_use(use)
    {}

    IndexedDeclaration m_declaration;
    DocumentRange m_use;
};

DeclarationContext::DeclarationContext(const IndexedDeclaration& declaration, const DocumentRange& use,
                                       const IndexedDUContext& context)
    : DUContextContext(context)
    , d_ptr(new DeclarationContextPrivate(declaration, use))
{}

DeclarationContext::DeclarationContext(KTextEditor::View* view, const KTextEditor::Cursor& position) : DUContextContext(
        IndexedDUContext())
{
    const QUrl& url = view->document()->url();
    DUChainReadLocker lock;
    DUChainUtils::ItemUnderCursor item = DUChainUtils::itemUnderCursor(url, position);
    DocumentRange useRange = DocumentRange(IndexedString(url), item.range);
    Declaration* declaration = item.declaration;
    IndexedDeclaration indexed;
    if (declaration) {
        indexed = IndexedDeclaration(declaration);
    }
    d_ptr.reset(new DeclarationContextPrivate(declaration, useRange));
    setContext(IndexedDUContext(item.context));
}

DeclarationContext::~DeclarationContext() = default;

int DeclarationContext::type() const
{
    return Context::CodeContext;
}

IndexedDeclaration DeclarationContext::declaration() const
{
    Q_D(const DeclarationContext);

    return d->m_declaration;
}

DocumentRange DeclarationContext::use() const
{
    Q_D(const DeclarationContext);

    return d->m_use;
}
}