Skip to content
Snippets Groups Projects
Commit acea5c55 authored by Roberto Raggi's avatar Roberto Raggi
Browse files

Some work on the syntax checker.

parent cf09ca0f
No related branches found
No related tags found
No related merge requests found
...@@ -32,6 +32,13 @@ ...@@ -32,6 +32,13 @@
#include "qtscripthighlighter.h" #include "qtscripthighlighter.h"
#include "qtscripteditorplugin.h" #include "qtscripteditorplugin.h"
#include "parser/javascriptengine_p.h"
#include "parser/javascriptparser_p.h"
#include "parser/javascriptlexer_p.h"
#include "parser/javascriptnodepool_p.h"
#include "parser/javascriptastvisitor_p.h"
#include "parser/javascriptast_p.h"
#include <indenter.h> #include <indenter.h>
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
...@@ -42,6 +49,11 @@ ...@@ -42,6 +49,11 @@
#include <texteditor/texteditorconstants.h> #include <texteditor/texteditorconstants.h>
#include <QtGui/QMenu> #include <QtGui/QMenu>
#include <QtCore/QTimer>
enum {
UPDATE_DOCUMENT_DEFAULT_INTERVAL = 100
};
namespace QtScriptEditor { namespace QtScriptEditor {
namespace Internal { namespace Internal {
...@@ -64,6 +76,14 @@ ScriptEditor::ScriptEditor(const Context &context, ...@@ -64,6 +76,14 @@ ScriptEditor::ScriptEditor(const Context &context,
setCodeFoldingVisible(true); setCodeFoldingVisible(true);
setMimeType(QtScriptEditor::Constants::C_QTSCRIPTEDITOR_MIMETYPE); setMimeType(QtScriptEditor::Constants::C_QTSCRIPTEDITOR_MIMETYPE);
m_updateDocumentTimer = new QTimer(this);
m_updateDocumentTimer->setInterval(UPDATE_DOCUMENT_DEFAULT_INTERVAL);
m_updateDocumentTimer->setSingleShot(true);
connect(m_updateDocumentTimer, SIGNAL(timeout()), this, SLOT(updateDocumentNow()));
connect(this, SIGNAL(textChanged()), this, SLOT(updateDocument()));
baseTextDocument()->setSyntaxHighlighter(new QtScriptHighlighter); baseTextDocument()->setSyntaxHighlighter(new QtScriptHighlighter);
} }
...@@ -94,6 +114,55 @@ ScriptEditor::Context ScriptEditorEditable::context() const ...@@ -94,6 +114,55 @@ ScriptEditor::Context ScriptEditorEditable::context() const
return m_context; return m_context;
} }
void ScriptEditor::updateDocument()
{
m_updateDocumentTimer->start(UPDATE_DOCUMENT_DEFAULT_INTERVAL);
}
void ScriptEditor::updateDocumentNow()
{
// ### move in the parser thread.
m_updateDocumentTimer->stop();
const QString fileName = file()->fileName();
const QString code = toPlainText();
JavaScriptParser parser;
JavaScriptEnginePrivate driver;
JavaScript::NodePool nodePool(fileName, &driver);
driver.setNodePool(&nodePool);
JavaScript::Lexer lexer(&driver);
lexer.setCode(code, /*line = */ 1);
driver.setLexer(&lexer);
QList<QTextEdit::ExtraSelection> selections;
if (parser.parse(&driver)) {
// do something here
} else {
QTextEdit::ExtraSelection sel;
sel.format.setUnderlineColor(Qt::red);
sel.format.setUnderlineStyle(QTextCharFormat::WaveUnderline);
const int line = parser.errorLineNumber();
QTextCursor c(document()->findBlockByNumber(line - 1));
sel.cursor = c;
if (parser.errorColumnNumber() > 1)
sel.cursor.setPosition(c.position() + parser.errorColumnNumber() - 1);
sel.cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor);
selections.append(sel);
}
setExtraSelections(CodeWarningsSelection, selections);
}
void ScriptEditor::setFontSettings(const TextEditor::FontSettings &fs) void ScriptEditor::setFontSettings(const TextEditor::FontSettings &fs)
{ {
TextEditor::BaseTextEditor::setFontSettings(fs); TextEditor::BaseTextEditor::setFontSettings(fs);
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#define QTSCRIPTDITORW_H #define QTSCRIPTDITORW_H
#include <texteditor/basetexteditor.h> #include <texteditor/basetexteditor.h>
#include <QTimer>
namespace Core { namespace Core {
class ICore; class ICore;
...@@ -76,6 +77,10 @@ public: ...@@ -76,6 +77,10 @@ public:
public slots: public slots:
virtual void setFontSettings(const TextEditor::FontSettings &); virtual void setFontSettings(const TextEditor::FontSettings &);
private slots:
void updateDocument();
void updateDocumentNow();
protected: protected:
void contextMenuEvent(QContextMenuEvent *e); void contextMenuEvent(QContextMenuEvent *e);
TextEditor::BaseTextEditorEditable *createEditableInterface() { return new ScriptEditorEditable(this, m_context); } TextEditor::BaseTextEditorEditable *createEditableInterface() { return new ScriptEditorEditable(this, m_context); }
...@@ -86,6 +91,8 @@ private: ...@@ -86,6 +91,8 @@ private:
const Context m_context; const Context m_context;
TextEditor::TextEditorActionHandler *m_ah; TextEditor::TextEditorActionHandler *m_ah;
QTimer *m_updateDocumentTimer;
}; };
} // namespace Internal } // namespace Internal
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment