diff --git a/src/plugins/duieditor/duicodecompletion.cpp b/src/plugins/duieditor/duicodecompletion.cpp index c0b0de1af748965fb3e587a148a3c4a0bd39c5b8..cceca642d2f4bdf09e2b659e124e6e8e0e041e7b 100644 --- a/src/plugins/duieditor/duicodecompletion.cpp +++ b/src/plugins/duieditor/duicodecompletion.cpp @@ -49,10 +49,13 @@ int DuiCodeCompletion::startCompletion(TextEditor::ITextEditable *editor) m_startPosition = pos; m_completions.clear(); - foreach (const QString &word, edit->words()) { - if (word.isEmpty()) - continue; + foreach (const QString &word, edit->keywords()) { + TextEditor::CompletionItem item(this); + item.m_text = word; + m_completions.append(item); + } + foreach (const QString &word, edit->words()) { TextEditor::CompletionItem item(this); item.m_text = word; m_completions.append(item); diff --git a/src/plugins/duieditor/duieditor.cpp b/src/plugins/duieditor/duieditor.cpp index 134baa059fddb40f33503e485c87e7ae923449f6..e07dd584744c502eecf3a494878fa7f575fbad4f 100644 --- a/src/plugins/duieditor/duieditor.cpp +++ b/src/plugins/duieditor/duieditor.cpp @@ -577,6 +577,19 @@ void ScriptEditor::renameIdUnderCursor() } } +QStringList ScriptEditor::keywords() const +{ + QStringList words; + + if (DuiHighlighter *highlighter = qobject_cast<DuiHighlighter*>(baseTextDocument()->syntaxHighlighter())) { + words = highlighter->keywords().toList(); + words.append(QLatin1String("property")); // ### move + words.append(QLatin1String("signal")); // ### move + } + + return words; +} + void ScriptEditor::setFontSettings(const TextEditor::FontSettings &fs) { TextEditor::BaseTextEditor::setFontSettings(fs); @@ -696,12 +709,12 @@ void ScriptEditor::contextMenuEvent(QContextMenuEvent *e) const QList<AST::SourceLocation> &locations = m_ids.value(id); if (! locations.isEmpty()) { menu->addSeparator(); - QAction *a = menu->addAction(tr("Rename '%1'...").arg(wordUnderCursor())); + QAction *a = menu->addAction(tr("Rename id '%1'...").arg(id)); connect(a, SIGNAL(triggered()), this, SLOT(renameIdUnderCursor())); } menu->exec(e->globalPos()); - delete menu; + menu->deleteLater(); } } // namespace Internal diff --git a/src/plugins/duieditor/duieditor.h b/src/plugins/duieditor/duieditor.h index 6807c3ff4270de5d4a8e977dd867f7301d819ce5..33d52bc95251ae9bb3416aa617aba6fd4f40cb16 100644 --- a/src/plugins/duieditor/duieditor.h +++ b/src/plugins/duieditor/duieditor.h @@ -96,6 +96,7 @@ public: QList<Declaration> declarations() const; QStringList words() const; + QStringList keywords() const; QList<JavaScriptParser::DiagnosticMessage> diagnosticMessages() const { return m_diagnosticMessages; } diff --git a/src/shared/qscripthighlighter/qscripthighlighter.cpp b/src/shared/qscripthighlighter/qscripthighlighter.cpp index f56ccd6dceadeb45b382da4756255b64798982d5..f01047117e510ecbde29aeca3abf41185c14e1bb 100644 --- a/src/shared/qscripthighlighter/qscripthighlighter.cpp +++ b/src/shared/qscripthighlighter/qscripthighlighter.cpp @@ -32,82 +32,75 @@ #include <QtCore/QSet> #include <QtCore/QtAlgorithms> -static const QSet<QString> &qscriptKeywords() { - static QSet<QString> keywords; - if (keywords.empty()) { - keywords.insert(QLatin1String("Infinity")); - keywords.insert(QLatin1String("NaN")); - keywords.insert(QLatin1String("abstract")); - keywords.insert(QLatin1String("boolean")); - keywords.insert(QLatin1String("break")); - keywords.insert(QLatin1String("byte")); - keywords.insert(QLatin1String("case")); - keywords.insert(QLatin1String("catch")); - keywords.insert(QLatin1String("char")); - keywords.insert(QLatin1String("class")); - keywords.insert(QLatin1String("const")); - keywords.insert(QLatin1String("constructor")); - keywords.insert(QLatin1String("continue")); - keywords.insert(QLatin1String("debugger")); - keywords.insert(QLatin1String("default")); - keywords.insert(QLatin1String("delete")); - keywords.insert(QLatin1String("do")); - keywords.insert(QLatin1String("double")); - keywords.insert(QLatin1String("else")); - keywords.insert(QLatin1String("enum")); - keywords.insert(QLatin1String("export")); - keywords.insert(QLatin1String("extends")); - keywords.insert(QLatin1String("false")); - keywords.insert(QLatin1String("final")); - keywords.insert(QLatin1String("finally")); - keywords.insert(QLatin1String("float")); - keywords.insert(QLatin1String("for")); - keywords.insert(QLatin1String("function")); - keywords.insert(QLatin1String("goto")); - keywords.insert(QLatin1String("if")); - keywords.insert(QLatin1String("implements")); - keywords.insert(QLatin1String("import")); - keywords.insert(QLatin1String("in")); - keywords.insert(QLatin1String("instanceof")); - keywords.insert(QLatin1String("int")); - keywords.insert(QLatin1String("interface")); - keywords.insert(QLatin1String("long")); - keywords.insert(QLatin1String("native")); - keywords.insert(QLatin1String("new")); - keywords.insert(QLatin1String("package")); - keywords.insert(QLatin1String("private")); - keywords.insert(QLatin1String("protected")); - keywords.insert(QLatin1String("public")); - keywords.insert(QLatin1String("return")); - keywords.insert(QLatin1String("short")); - keywords.insert(QLatin1String("static")); - keywords.insert(QLatin1String("super")); - keywords.insert(QLatin1String("switch")); - keywords.insert(QLatin1String("synchronized")); - keywords.insert(QLatin1String("this")); - keywords.insert(QLatin1String("throw")); - keywords.insert(QLatin1String("throws")); - keywords.insert(QLatin1String("transient")); - keywords.insert(QLatin1String("true")); - keywords.insert(QLatin1String("try")); - keywords.insert(QLatin1String("typeof")); - keywords.insert(QLatin1String("undefined")); - keywords.insert(QLatin1String("var")); - keywords.insert(QLatin1String("void")); - keywords.insert(QLatin1String("volatile")); - keywords.insert(QLatin1String("while")); - keywords.insert(QLatin1String("with")); // end - } - return keywords; -} - - namespace SharedTools { QScriptHighlighter::QScriptHighlighter(QTextDocument *parent) : QSyntaxHighlighter(parent), m_duiEnabled(false) { + qscriptKeywords.insert(QLatin1String("Infinity")); + qscriptKeywords.insert(QLatin1String("NaN")); + qscriptKeywords.insert(QLatin1String("abstract")); + qscriptKeywords.insert(QLatin1String("boolean")); + qscriptKeywords.insert(QLatin1String("break")); + qscriptKeywords.insert(QLatin1String("byte")); + qscriptKeywords.insert(QLatin1String("case")); + qscriptKeywords.insert(QLatin1String("catch")); + qscriptKeywords.insert(QLatin1String("char")); + qscriptKeywords.insert(QLatin1String("class")); + qscriptKeywords.insert(QLatin1String("const")); + qscriptKeywords.insert(QLatin1String("constructor")); + qscriptKeywords.insert(QLatin1String("continue")); + qscriptKeywords.insert(QLatin1String("debugger")); + qscriptKeywords.insert(QLatin1String("default")); + qscriptKeywords.insert(QLatin1String("delete")); + qscriptKeywords.insert(QLatin1String("do")); + qscriptKeywords.insert(QLatin1String("double")); + qscriptKeywords.insert(QLatin1String("else")); + qscriptKeywords.insert(QLatin1String("enum")); + qscriptKeywords.insert(QLatin1String("export")); + qscriptKeywords.insert(QLatin1String("extends")); + qscriptKeywords.insert(QLatin1String("false")); + qscriptKeywords.insert(QLatin1String("final")); + qscriptKeywords.insert(QLatin1String("finally")); + qscriptKeywords.insert(QLatin1String("float")); + qscriptKeywords.insert(QLatin1String("for")); + qscriptKeywords.insert(QLatin1String("function")); + qscriptKeywords.insert(QLatin1String("goto")); + qscriptKeywords.insert(QLatin1String("if")); + qscriptKeywords.insert(QLatin1String("implements")); + qscriptKeywords.insert(QLatin1String("import")); + qscriptKeywords.insert(QLatin1String("in")); + qscriptKeywords.insert(QLatin1String("instanceof")); + qscriptKeywords.insert(QLatin1String("int")); + qscriptKeywords.insert(QLatin1String("interface")); + qscriptKeywords.insert(QLatin1String("long")); + qscriptKeywords.insert(QLatin1String("native")); + qscriptKeywords.insert(QLatin1String("new")); + qscriptKeywords.insert(QLatin1String("package")); + qscriptKeywords.insert(QLatin1String("private")); + qscriptKeywords.insert(QLatin1String("protected")); + qscriptKeywords.insert(QLatin1String("public")); + qscriptKeywords.insert(QLatin1String("return")); + qscriptKeywords.insert(QLatin1String("short")); + qscriptKeywords.insert(QLatin1String("static")); + qscriptKeywords.insert(QLatin1String("super")); + qscriptKeywords.insert(QLatin1String("switch")); + qscriptKeywords.insert(QLatin1String("synchronized")); + qscriptKeywords.insert(QLatin1String("this")); + qscriptKeywords.insert(QLatin1String("throw")); + qscriptKeywords.insert(QLatin1String("throws")); + qscriptKeywords.insert(QLatin1String("transient")); + qscriptKeywords.insert(QLatin1String("true")); + qscriptKeywords.insert(QLatin1String("try")); + qscriptKeywords.insert(QLatin1String("typeof")); + qscriptKeywords.insert(QLatin1String("undefined")); + qscriptKeywords.insert(QLatin1String("var")); + qscriptKeywords.insert(QLatin1String("void")); + qscriptKeywords.insert(QLatin1String("volatile")); + qscriptKeywords.insert(QLatin1String("while")); + qscriptKeywords.insert(QLatin1String("with")); // end + setFormats(defaultFormats()); } @@ -266,10 +259,13 @@ void QScriptHighlighter::highlightBlock(const QString &text) nextChar = text.at(i + 1); if (state == StateStandard && !questionMark && lastChar != ':' && nextChar != ':') { - for (int j = 0; j < i; ++j) { - if (format(j) == emptyFormat) - setFormat(j, 1, m_formats[LabelFormat]); + int start = i - 1; + for (; start != -1; --start) { + if (text.at(start).isSpace()) + break; } + ++start; + setFormat(start, i - start, m_formats[LabelFormat]); } break; } @@ -438,7 +434,7 @@ void QScriptHighlighter::highlightKeyword(int currentPos, const QString &buffer) if (m_duiEnabled && buffer.at(0).isUpper() || (! m_duiEnabled && buffer.at(0) == QLatin1Char('Q'))) { setFormat(currentPos - buffer.length(), buffer.length(), m_formats[TypeFormat]); } else { - if (qscriptKeywords().contains(buffer)) + if (qscriptKeywords.contains(buffer)) setFormat(currentPos - buffer.length(), buffer.length(), m_formats[KeywordFormat]); } } diff --git a/src/shared/qscripthighlighter/qscripthighlighter.h b/src/shared/qscripthighlighter/qscripthighlighter.h index 8917af0ee3e60bca0848a1cc82711c5f243845d7..3a91a8400835e233e49e2af5df8a4c30419a3513 100644 --- a/src/shared/qscripthighlighter/qscripthighlighter.h +++ b/src/shared/qscripthighlighter/qscripthighlighter.h @@ -30,7 +30,8 @@ #ifndef QSCRIPTSYNTAXHIGHLIGHTER_H #define QSCRIPTSYNTAXHIGHLIGHTER_H -#include <QVector> +#include <QtCore/QVector> +#include <QtCore/QSet> #include <QtGui/QSyntaxHighlighter> namespace SharedTools { @@ -56,7 +57,10 @@ public: QTextCharFormat labelTextCharFormat() const { return m_formats[LabelFormat]; } -private: + const QSet<QString> &keywords() const + { return qscriptKeywords; } + +protected: // The functions are notified whenever parentheses are encountered. // Custom behaviour can be added, for example storing info for indenting. virtual int onBlockStart(); // returns the blocks initial state @@ -69,6 +73,7 @@ private: bool m_duiEnabled; QTextCharFormat m_formats[NumFormats]; + QSet<QString> qscriptKeywords; }; } // namespace SharedTools