-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmodel.cpp
More file actions
105 lines (90 loc) · 4.45 KB
/
Copy pathmodel.cpp
File metadata and controls
105 lines (90 loc) · 4.45 KB
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
/*****************************************************************************
* Copyright (c) 2010-2014 Sven Brauch <svenbrauch@googlemail.com> *
* *
* 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. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
*****************************************************************************
*/
#include "model.h"
#include <KTextEditor/View>
#include <KTextEditor/Document>
#include <KTextEditor/CodeCompletionModelControllerInterface>
#include <QDebug>
#include "codecompletiondebug.h"
#include "context.h"
#include "worker.h"
namespace Python {
PythonCodeCompletionModel::PythonCodeCompletionModel(QObject* parent)
: CodeCompletionModel(parent)
{
// This avoids flickering of the completion-list when full code-completion mode is used
setForceWaitForModel(true);
}
PythonCodeCompletionModel::~PythonCodeCompletionModel() { }
bool PythonCodeCompletionModel::shouldStartCompletion(KTextEditor::View* view, const QString& inserted,
bool userInsertion, const KTextEditor::Cursor& position)
{
QList<QString> words;
words << "for" << "raise" << "except" << "in";
foreach ( const QString& word, words ) {
if ( view->document()->line(position.line()).mid(0, position.column()).endsWith(word + " ") ) {
return true;
}
}
// shebang / encoding lines
if ( view->document()->line(position.line()).mid(0, position.column()).endsWith("#") &&
position.line() < 2 )
{
return true;
}
// we're probably dealing with string formatting completion
// is there any other case where this condition is true?
if ( ! userInsertion && inserted.startsWith('{') ) {
return true;
}
return KDevelop::CodeCompletionModel::shouldStartCompletion(view, inserted, userInsertion, position);
}
bool PythonCodeCompletionModel::shouldAbortCompletion(KTextEditor::View* view, const KTextEditor::Range& range, const QString& currentCompletion)
{
const QString text = view->document()->text(range);
if ( completionContext() ) {
auto context = static_cast<PythonCodeCompletionContext*>(completionContext().data());
if ( context->completionContextType() == PythonCodeCompletionContext::StringFormattingCompletion ) {
if ( text.endsWith('"') || text.endsWith("'") || text.endsWith(' ') ) {
return true;
}
}
}
return KTextEditor::CodeCompletionModelControllerInterface::shouldAbortCompletion(view, range, currentCompletion);
}
QString PythonCodeCompletionModel::filterString(KTextEditor::View *view, const KTextEditor::Range &range, const KTextEditor::Cursor &position)
{
// TODO The completion context may be null, so we need to check it first. This might a bug.
if ( completionContext() ) {
auto context = static_cast<PythonCodeCompletionContext*>(completionContext().data());
if (context->completionContextType() == PythonCodeCompletionContext::StringFormattingCompletion) {
return QString();
}
}
return CodeCompletionModel::filterString(view, range, position);
}
KTextEditor::Range PythonCodeCompletionModel::completionRange(KTextEditor::View* view, const KTextEditor::Cursor& position)
{
m_currentDocument = view->document()->url();
return KTextEditor::CodeCompletionModelControllerInterface::completionRange(view, position);
}
KDevelop::CodeCompletionWorker* PythonCodeCompletionModel::createCompletionWorker()
{
return new PythonCodeCompletionWorker(this, m_currentDocument);
}
}