Add support for C++ snippets.

This commit is contained in:
Leandro Melo
2010-09-24 20:16:34 +02:00
parent f64cf427f2
commit cafcce0c37
11 changed files with 248 additions and 119 deletions

View File

@@ -75,6 +75,7 @@
#include <QtGui/QTextDocument> // Qt::escape()
#include <QtGui/QToolButton>
#include <QtGui/QVBoxLayout>
#include <QtAlgorithms>
namespace {
const bool debug = ! qgetenv("CPLUSPLUS_DEBUG").isEmpty();
@@ -460,7 +461,8 @@ CppCodeCompletion::CppCodeCompletion(CppModelManager *manager)
m_shouldRestartCompletion(false),
m_automaticCompletion(false),
m_completionOperator(T_EOF_SYMBOL),
m_objcEnabled(true)
m_objcEnabled(true),
m_snippetsParser(Core::ICore::instance()->resourcePath() + QLatin1String("/snippets/cpp.xml"))
{
}
@@ -1123,7 +1125,10 @@ void CppCodeCompletion::globalCompletion(Scope *currentScope)
foreach (ClassOrNamespace *b, usingBindings)
completeNamespace(b);
addSnippets();
addKeywords();
qStableSort(m_completions.begin(), m_completions.end(), completionItemLessThan);
addMacros(QLatin1String("<configuration>"), context.snapshot());
addMacros(context.thisDocument()->fileName(), context.snapshot());
}
@@ -1759,18 +1764,19 @@ void CppCodeCompletion::completions(QList<TextEditor::CompletionItem> *completio
QList<TextEditor::CompletionItem> CppCodeCompletion::removeDuplicates(const QList<TextEditor::CompletionItem> &items)
{
// Remove duplicates
// Duplicates are kept only if they are snippets.
QList<TextEditor::CompletionItem> uniquelist;
QSet<QString> processed;
foreach (const TextEditor::CompletionItem &item, items) {
if (! processed.contains(item.text)) {
processed.insert(item.text);
if (!processed.contains(item.text) || item.isSnippet) {
uniquelist.append(item);
if (Symbol *symbol = qvariant_cast<Symbol *>(item.data)) {
if (Function *funTy = symbol->type()->asFunctionType()) {
if (funTy->hasArguments())
++uniquelist.back().duplicateCount;
if (!item.isSnippet) {
processed.insert(item.text);
if (Symbol *symbol = qvariant_cast<Symbol *>(item.data)) {
if (Function *funTy = symbol->type()->asFunctionType()) {
if (funTy->hasArguments())
++uniquelist.back().duplicateCount;
}
}
}
}
@@ -2018,4 +2024,10 @@ bool CppCodeCompletion::objcKeywordsWanted() const
return mdb->findByFile(fileName).type() == CppTools::Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE;
}
void CppCodeCompletion::addSnippets()
{
static const QIcon icon(QLatin1String(":/texteditor/images/snippet.png"));
m_completions.append(m_snippetsParser.execute(this, icon));
}
#include "cppcodecompletion.moc"