forked from qt-creator/qt-creator
Merge remote branch 'origin/1.3'
Conflicts: src/plugins/cpptools/cppcodecompletion.cpp src/plugins/debugger/gdb/remotegdbadapter.cpp
This commit is contained in:
@@ -565,63 +565,63 @@ static int startOfOperator(TextEditor::ITextEditable *editor,
|
||||
const QChar ch3 = pos > 1 ? editor->characterAt(pos - 3) : QChar();
|
||||
|
||||
int start = pos;
|
||||
int k = T_EOF_SYMBOL;
|
||||
int completionKind = T_EOF_SYMBOL;
|
||||
|
||||
switch (ch.toLatin1()) {
|
||||
case '.':
|
||||
if (ch2 != QLatin1Char('.')) {
|
||||
k = T_DOT;
|
||||
completionKind = T_DOT;
|
||||
--start;
|
||||
}
|
||||
break;
|
||||
case ',':
|
||||
k = T_COMMA;
|
||||
completionKind = T_COMMA;
|
||||
--start;
|
||||
break;
|
||||
case '(':
|
||||
if (wantFunctionCall) {
|
||||
k = T_LPAREN;
|
||||
completionKind = T_LPAREN;
|
||||
--start;
|
||||
}
|
||||
break;
|
||||
case ':':
|
||||
if (ch3 != QLatin1Char(':') && ch2 == QLatin1Char(':')) {
|
||||
k = T_COLON_COLON;
|
||||
completionKind = T_COLON_COLON;
|
||||
start -= 2;
|
||||
}
|
||||
break;
|
||||
case '>':
|
||||
if (ch2 == QLatin1Char('-')) {
|
||||
k = T_ARROW;
|
||||
completionKind = T_ARROW;
|
||||
start -= 2;
|
||||
}
|
||||
break;
|
||||
case '*':
|
||||
if (ch2 == QLatin1Char('.')) {
|
||||
k = T_DOT_STAR;
|
||||
completionKind = T_DOT_STAR;
|
||||
start -= 2;
|
||||
} else if (ch3 == QLatin1Char('-') && ch2 == QLatin1Char('>')) {
|
||||
k = T_ARROW_STAR;
|
||||
completionKind = T_ARROW_STAR;
|
||||
start -= 3;
|
||||
}
|
||||
break;
|
||||
case '\\':
|
||||
case '@':
|
||||
if (ch2.isNull() || ch2.isSpace()) {
|
||||
k = T_DOXY_COMMENT;
|
||||
completionKind = T_DOXY_COMMENT;
|
||||
--start;
|
||||
}
|
||||
break;
|
||||
case '<':
|
||||
k = T_ANGLE_STRING_LITERAL;
|
||||
completionKind = T_ANGLE_STRING_LITERAL;
|
||||
--start;
|
||||
break;
|
||||
case '"':
|
||||
k = T_STRING_LITERAL;
|
||||
completionKind = T_STRING_LITERAL;
|
||||
--start;
|
||||
break;
|
||||
case '/':
|
||||
k = T_SLASH;
|
||||
completionKind = T_SLASH;
|
||||
--start;
|
||||
break;
|
||||
}
|
||||
@@ -634,20 +634,20 @@ static int startOfOperator(TextEditor::ITextEditable *editor,
|
||||
tc.setPosition(pos);
|
||||
|
||||
// Include completion: make sure the quote character is the first one on the line
|
||||
if (k == T_STRING_LITERAL) {
|
||||
if (completionKind == T_STRING_LITERAL) {
|
||||
QTextCursor s = tc;
|
||||
s.movePosition(QTextCursor::StartOfLine, QTextCursor::KeepAnchor);
|
||||
QString sel = s.selectedText();
|
||||
if (sel.indexOf(QLatin1Char('"')) < sel.length() - 1) {
|
||||
k = T_EOF_SYMBOL;
|
||||
completionKind = T_EOF_SYMBOL;
|
||||
start = pos;
|
||||
}
|
||||
}
|
||||
|
||||
if (k == T_COMMA) {
|
||||
if (completionKind == T_COMMA) {
|
||||
ExpressionUnderCursor expressionUnderCursor;
|
||||
if (expressionUnderCursor.startOfFunctionCall(tc) == -1) {
|
||||
k = T_EOF_SYMBOL;
|
||||
completionKind = T_EOF_SYMBOL;
|
||||
start = pos;
|
||||
}
|
||||
}
|
||||
@@ -655,24 +655,24 @@ static int startOfOperator(TextEditor::ITextEditable *editor,
|
||||
static CPlusPlus::TokenUnderCursor tokenUnderCursor;
|
||||
const SimpleToken tk = tokenUnderCursor(tc);
|
||||
|
||||
if (k == T_DOXY_COMMENT && tk.isNot(T_DOXY_COMMENT)) {
|
||||
k = T_EOF_SYMBOL;
|
||||
if (completionKind == T_DOXY_COMMENT && !(tk.is(T_DOXY_COMMENT) || tk.is(T_CPP_DOXY_COMMENT))) {
|
||||
completionKind = T_EOF_SYMBOL;
|
||||
start = pos;
|
||||
}
|
||||
// Don't complete in comments or strings, but still check for include completion
|
||||
else if (tk.is(T_COMMENT) || (tk.isLiteral() &&
|
||||
(k != T_STRING_LITERAL
|
||||
&& k != T_ANGLE_STRING_LITERAL
|
||||
&& k != T_SLASH))) {
|
||||
k = T_EOF_SYMBOL;
|
||||
else if (tk.is(T_COMMENT) || tk.is(T_CPP_COMMENT) ||
|
||||
(tk.isLiteral() && (completionKind != T_STRING_LITERAL
|
||||
&& completionKind != T_ANGLE_STRING_LITERAL
|
||||
&& completionKind != T_SLASH))) {
|
||||
completionKind = T_EOF_SYMBOL;
|
||||
start = pos;
|
||||
}
|
||||
// Include completion: can be triggered by slash, but only in a string
|
||||
else if (k == T_SLASH && (tk.isNot(T_STRING_LITERAL) && tk.isNot(T_ANGLE_STRING_LITERAL))) {
|
||||
k = T_EOF_SYMBOL;
|
||||
else if (completionKind == T_SLASH && (tk.isNot(T_STRING_LITERAL) && tk.isNot(T_ANGLE_STRING_LITERAL))) {
|
||||
completionKind = T_EOF_SYMBOL;
|
||||
start = pos;
|
||||
}
|
||||
else if (k == T_LPAREN) {
|
||||
else if (completionKind == T_LPAREN) {
|
||||
const QList<SimpleToken> &tokens = tokenUnderCursor.tokens();
|
||||
int i = 0;
|
||||
for (; i < tokens.size(); ++i) {
|
||||
@@ -688,12 +688,12 @@ static int startOfOperator(TextEditor::ITextEditable *editor,
|
||||
}
|
||||
|
||||
if (i == tokens.size()) {
|
||||
k = T_EOF_SYMBOL;
|
||||
completionKind = T_EOF_SYMBOL;
|
||||
start = pos;
|
||||
}
|
||||
}
|
||||
// Check for include preprocessor directive
|
||||
else if (k == T_STRING_LITERAL || k == T_ANGLE_STRING_LITERAL || k == T_SLASH) {
|
||||
else if (completionKind == T_STRING_LITERAL || completionKind == T_ANGLE_STRING_LITERAL || completionKind == T_SLASH) {
|
||||
bool include = false;
|
||||
const QList<SimpleToken> &tokens = tokenUnderCursor.tokens();
|
||||
if (tokens.size() >= 3) {
|
||||
@@ -709,13 +709,13 @@ static int startOfOperator(TextEditor::ITextEditable *editor,
|
||||
}
|
||||
|
||||
if (!include) {
|
||||
k = T_EOF_SYMBOL;
|
||||
completionKind = T_EOF_SYMBOL;
|
||||
start = pos;
|
||||
}
|
||||
}
|
||||
|
||||
if (kind)
|
||||
*kind = k;
|
||||
*kind = completionKind;
|
||||
|
||||
return start;
|
||||
}
|
||||
@@ -1022,8 +1022,13 @@ bool CppCodeCompletion::completeConstructorOrFunction(const QList<TypeOfExpressi
|
||||
|
||||
// find a scope that encloses the current location, starting from the lastVisibileSymbol
|
||||
// and moving outwards
|
||||
Scope *sc = context.symbol()->scope();
|
||||
while (sc->enclosingScope()) {
|
||||
Scope *sc = 0;
|
||||
if (context.symbol())
|
||||
sc = context.symbol()->scope();
|
||||
else if (context.thisDocument())
|
||||
sc = context.thisDocument()->globalSymbols();
|
||||
|
||||
while (sc && sc->enclosingScope()) {
|
||||
unsigned startLine, startColumn;
|
||||
context.thisDocument()->translationUnit()->getPosition(sc->owner()->startOffset(), &startLine, &startColumn);
|
||||
unsigned endLine, endColumn;
|
||||
@@ -1037,7 +1042,7 @@ bool CppCodeCompletion::completeConstructorOrFunction(const QList<TypeOfExpressi
|
||||
sc = sc->enclosingScope();
|
||||
}
|
||||
|
||||
if (sc->isClassScope() || sc->isNamespaceScope())
|
||||
if (sc && (sc->isClassScope() || sc->isNamespaceScope()))
|
||||
{
|
||||
// It may still be a function call. If the whole line parses as a function
|
||||
// declaration, we should be certain that it isn't.
|
||||
@@ -1066,10 +1071,18 @@ bool CppCodeCompletion::completeConstructorOrFunction(const QList<TypeOfExpressi
|
||||
Overview overview;
|
||||
overview.setShowArgumentNames(true);
|
||||
|
||||
TextEditor::CompletionItem item(this);
|
||||
item.text = overview(f->type());
|
||||
item.text = item.text.mid(1, item.text.size()-2);
|
||||
m_completions.append(item);
|
||||
// get rid of parentheses and cv-qualifiers
|
||||
QString completion = overview(f->type());
|
||||
if (f->isVolatile() || f->isConst())
|
||||
completion = completion.mid(1, completion.lastIndexOf(')') - 1);
|
||||
else
|
||||
completion = completion.mid(1, completion.size() - 2);
|
||||
|
||||
if (completion.size()) {
|
||||
TextEditor::CompletionItem item(this);
|
||||
item.text = completion;
|
||||
m_completions.append(item);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user