summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools/cppcodecompletion.cpp
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2009-02-20 12:55:01 +0100
committerRoberto Raggi <roberto.raggi@nokia.com>2009-02-20 12:55:18 +0100
commita976385b440d08ad9c894b2acae2cba8d224510e (patch)
treee6b3f513dca82d13fa11b265fb589ecc715c8408 /src/plugins/cpptools/cppcodecompletion.cpp
parent5205d86aa26db832909c16cd066af2f43130cc92 (diff)
downloadqt-creator-a976385b440d08ad9c894b2acae2cba8d224510e.tar.gz
Code completion of doxygen tags.
Diffstat (limited to 'src/plugins/cpptools/cppcodecompletion.cpp')
-rw-r--r--src/plugins/cpptools/cppcodecompletion.cpp72
1 files changed, 48 insertions, 24 deletions
diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp
index 2a1e13ae3f..65802dd61b 100644
--- a/src/plugins/cpptools/cppcodecompletion.cpp
+++ b/src/plugins/cpptools/cppcodecompletion.cpp
@@ -32,8 +32,8 @@
***************************************************************************/
#include "cppcodecompletion.h"
-
#include "cppmodelmanager.h"
+#include "cppdoxygen.h"
#include <Control.h>
#include <AST.h>
@@ -371,46 +371,54 @@ static int startOfOperator(TextEditor::ITextEditable *editor,
const QChar ch3 = pos > 1 ? editor->characterAt(pos - 3) : QChar();
int start = pos;
+ int k = T_EOF_SYMBOL;
if (ch2 != QLatin1Char('.') && ch == QLatin1Char('.')) {
- if (kind)
- *kind = T_DOT;
+ k = T_DOT;
--start;
} else if (wantFunctionCall && ch == QLatin1Char('(')) {
- if (kind)
- *kind = T_LPAREN;
+ k = T_LPAREN;
--start;
} else if (ch2 == QLatin1Char(':') && ch == QLatin1Char(':')) {
- if (kind)
- *kind = T_COLON_COLON;
+ k = T_COLON_COLON;
start -= 2;
} else if (ch2 == QLatin1Char('-') && ch == QLatin1Char('>')) {
- if (kind)
- *kind = T_ARROW;
+ k = T_ARROW;
start -= 2;
} else if (ch2 == QLatin1Char('.') && ch == QLatin1Char('*')) {
- if (kind)
- *kind = T_DOT_STAR;
+ k = T_DOT_STAR;
start -= 2;
} else if (ch3 == QLatin1Char('-') && ch2 == QLatin1Char('>') && ch == QLatin1Char('*')) {
- if (kind)
- *kind = T_ARROW_STAR;
+ k = T_ARROW_STAR;
start -= 3;
+ } else if (ch == QLatin1Char('@') || ch == QLatin1Char('\\')) {
+ k = T_DOXY_COMMENT;
+ --start;
}
- if (start != pos) {
- TextEditor::BaseTextEditor *edit = qobject_cast<TextEditor::BaseTextEditor *>(editor->widget());
- QTextCursor tc(edit->textCursor());
- tc.setPosition(pos);
- static CPlusPlus::TokenUnderCursor tokenUnderCursor;
- const SimpleToken tk = tokenUnderCursor(tc);
- if (tk.isComment() || tk.isLiteral()) {
- if (kind)
- *kind = T_EOF_SYMBOL;
- return pos;
- }
+ if (start == pos)
+ return start;
+
+ TextEditor::BaseTextEditor *edit = qobject_cast<TextEditor::BaseTextEditor *>(editor->widget());
+ QTextCursor tc(edit->textCursor());
+ tc.setPosition(pos);
+
+ static CPlusPlus::TokenUnderCursor tokenUnderCursor;
+ const SimpleToken tk = tokenUnderCursor(tc);
+
+ if (k == T_DOXY_COMMENT && tk.isNot(T_DOXY_COMMENT)) {
+ k = T_EOF_SYMBOL;
+ start = pos;
}
+ else if (tk.is(T_COMMENT) || tk.isLiteral()) {
+ k = T_EOF_SYMBOL;
+ start = pos;
+ }
+
+ if (kind)
+ *kind = k;
+
return start;
}
@@ -457,15 +465,31 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
ExpressionUnderCursor expressionUnderCursor;
QString expression;
+
+ if (m_completionOperator == T_DOXY_COMMENT) {
+ for (int i = 1; i < T_DOXY_LAST_TAG; ++i) {
+ TextEditor::CompletionItem item(this);
+ item.m_text.append(QString::fromLatin1(doxygenTagSpell(i)));
+ m_completions.append(item);
+ }
+
+ return m_startPosition;
+ }
+
+
if (m_completionOperator) {
QTextCursor tc(edit->document());
tc.setPosition(endOfExpression);
+
expression = expressionUnderCursor(tc);
+
if (m_completionOperator == T_LPAREN) {
if (expression.endsWith(QLatin1String("SIGNAL")))
m_completionOperator = T_SIGNAL;
+
else if (expression.endsWith(QLatin1String("SLOT")))
m_completionOperator = T_SLOT;
+
else if (editor->position() != endOfOperator) {
// We don't want a function completion when the cursor isn't at the opening brace
expression.clear();