Add the JS keywords to the completion box and improved the highlighting of labels.

This commit is contained in:
Roberto Raggi
2009-05-06 18:22:42 +02:00
parent e5ad7f5bc0
commit 84d9d0c45a
5 changed files with 99 additions and 81 deletions

View File

@@ -49,10 +49,13 @@ int DuiCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
m_startPosition = pos; m_startPosition = pos;
m_completions.clear(); m_completions.clear();
foreach (const QString &word, edit->words()) { foreach (const QString &word, edit->keywords()) {
if (word.isEmpty()) TextEditor::CompletionItem item(this);
continue; item.m_text = word;
m_completions.append(item);
}
foreach (const QString &word, edit->words()) {
TextEditor::CompletionItem item(this); TextEditor::CompletionItem item(this);
item.m_text = word; item.m_text = word;
m_completions.append(item); m_completions.append(item);

View File

@@ -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) void ScriptEditor::setFontSettings(const TextEditor::FontSettings &fs)
{ {
TextEditor::BaseTextEditor::setFontSettings(fs); TextEditor::BaseTextEditor::setFontSettings(fs);
@@ -696,12 +709,12 @@ void ScriptEditor::contextMenuEvent(QContextMenuEvent *e)
const QList<AST::SourceLocation> &locations = m_ids.value(id); const QList<AST::SourceLocation> &locations = m_ids.value(id);
if (! locations.isEmpty()) { if (! locations.isEmpty()) {
menu->addSeparator(); 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())); connect(a, SIGNAL(triggered()), this, SLOT(renameIdUnderCursor()));
} }
menu->exec(e->globalPos()); menu->exec(e->globalPos());
delete menu; menu->deleteLater();
} }
} // namespace Internal } // namespace Internal

View File

@@ -96,6 +96,7 @@ public:
QList<Declaration> declarations() const; QList<Declaration> declarations() const;
QStringList words() const; QStringList words() const;
QStringList keywords() const;
QList<JavaScriptParser::DiagnosticMessage> diagnosticMessages() const QList<JavaScriptParser::DiagnosticMessage> diagnosticMessages() const
{ return m_diagnosticMessages; } { return m_diagnosticMessages; }

View File

@@ -32,82 +32,75 @@
#include <QtCore/QSet> #include <QtCore/QSet>
#include <QtCore/QtAlgorithms> #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 { namespace SharedTools {
QScriptHighlighter::QScriptHighlighter(QTextDocument *parent) QScriptHighlighter::QScriptHighlighter(QTextDocument *parent)
: QSyntaxHighlighter(parent), : QSyntaxHighlighter(parent),
m_duiEnabled(false) 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()); setFormats(defaultFormats());
} }
@@ -266,10 +259,13 @@ void QScriptHighlighter::highlightBlock(const QString &text)
nextChar = text.at(i + 1); nextChar = text.at(i + 1);
if (state == StateStandard && !questionMark && if (state == StateStandard && !questionMark &&
lastChar != ':' && nextChar != ':') { lastChar != ':' && nextChar != ':') {
for (int j = 0; j < i; ++j) { int start = i - 1;
if (format(j) == emptyFormat) for (; start != -1; --start) {
setFormat(j, 1, m_formats[LabelFormat]); if (text.at(start).isSpace())
break;
} }
++start;
setFormat(start, i - start, m_formats[LabelFormat]);
} }
break; 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'))) { if (m_duiEnabled && buffer.at(0).isUpper() || (! m_duiEnabled && buffer.at(0) == QLatin1Char('Q'))) {
setFormat(currentPos - buffer.length(), buffer.length(), m_formats[TypeFormat]); setFormat(currentPos - buffer.length(), buffer.length(), m_formats[TypeFormat]);
} else { } else {
if (qscriptKeywords().contains(buffer)) if (qscriptKeywords.contains(buffer))
setFormat(currentPos - buffer.length(), buffer.length(), m_formats[KeywordFormat]); setFormat(currentPos - buffer.length(), buffer.length(), m_formats[KeywordFormat]);
} }
} }

View File

@@ -30,7 +30,8 @@
#ifndef QSCRIPTSYNTAXHIGHLIGHTER_H #ifndef QSCRIPTSYNTAXHIGHLIGHTER_H
#define QSCRIPTSYNTAXHIGHLIGHTER_H #define QSCRIPTSYNTAXHIGHLIGHTER_H
#include <QVector> #include <QtCore/QVector>
#include <QtCore/QSet>
#include <QtGui/QSyntaxHighlighter> #include <QtGui/QSyntaxHighlighter>
namespace SharedTools { namespace SharedTools {
@@ -56,7 +57,10 @@ public:
QTextCharFormat labelTextCharFormat() const QTextCharFormat labelTextCharFormat() const
{ return m_formats[LabelFormat]; } { return m_formats[LabelFormat]; }
private: const QSet<QString> &keywords() const
{ return qscriptKeywords; }
protected:
// The functions are notified whenever parentheses are encountered. // The functions are notified whenever parentheses are encountered.
// Custom behaviour can be added, for example storing info for indenting. // Custom behaviour can be added, for example storing info for indenting.
virtual int onBlockStart(); // returns the blocks initial state virtual int onBlockStart(); // returns the blocks initial state
@@ -69,6 +73,7 @@ private:
bool m_duiEnabled; bool m_duiEnabled;
QTextCharFormat m_formats[NumFormats]; QTextCharFormat m_formats[NumFormats];
QSet<QString> qscriptKeywords;
}; };
} // namespace SharedTools } // namespace SharedTools