From b19b2a71672ee172786e5d3c2c1ff307f9745a68 Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Fri, 26 Nov 2010 15:50:55 +0100 Subject: [PATCH] Store the numbers and the identifiers in two different sets. --- src/libs/glsl/glslengine.cpp | 25 ++++++++++++++++++++----- src/libs/glsl/glslengine.h | 5 +++++ src/libs/glsl/glsllexer.cpp | 5 ++++- src/plugins/glsleditor/glslcodecompletion.cpp | 17 +++++++++++++++-- src/plugins/glsleditor/glslcodecompletion.h | 2 ++ 5 files changed, 46 insertions(+), 8 deletions(-) diff --git a/src/libs/glsl/glslengine.cpp b/src/libs/glsl/glslengine.cpp index 2c6b228cfe..73938e947e 100644 --- a/src/libs/glsl/glslengine.cpp +++ b/src/libs/glsl/glslengine.cpp @@ -99,6 +99,26 @@ const QString *Engine::identifier(const char *s, int n) return &(*_identifiers.insert(QString::fromLatin1(s, n))); } +QSet Engine::identifiers() const +{ + return _identifiers; +} + +const QString *Engine::number(const QString &s) +{ + return &(*_numbers.insert(s)); +} + +const QString *Engine::number(const char *s, int n) +{ + return &(*_numbers.insert(QString::fromLatin1(s, n))); +} + +QSet Engine::numbers() const +{ + return _numbers; +} + MemoryPool *Engine::pool() { return &_pool; @@ -199,11 +219,6 @@ void Engine::error(int line, const QString &message) addDiagnosticMessage(m); } -QSet Engine::identifiers() const -{ - return _identifiers; -} - bool DiagnosticMessage::isError() const { return _kind == Error; diff --git a/src/libs/glsl/glslengine.h b/src/libs/glsl/glslengine.h index b348042e6d..ab73debf9e 100644 --- a/src/libs/glsl/glslengine.h +++ b/src/libs/glsl/glslengine.h @@ -98,6 +98,10 @@ public: const QString *identifier(const char *s, int n); QSet identifiers() const; + const QString *number(const QString &s); + const QString *number(const char *s, int n); + QSet numbers() const; + // types const UndefinedType *undefinedType(); const VoidType *voidType(); @@ -129,6 +133,7 @@ public: private: QSet _identifiers; + QSet _numbers; TypeTable _vectorTypes; TypeTable _matrixTypes; TypeTable _samplerTypes; diff --git a/src/libs/glsl/glsllexer.cpp b/src/libs/glsl/glsllexer.cpp index 3651d94f5d..ba67c865c5 100644 --- a/src/libs/glsl/glsllexer.cpp +++ b/src/libs/glsl/glsllexer.cpp @@ -207,9 +207,12 @@ int Lexer::yylex_helper(const char **position, int *line) // float constant case '.': if (std::isdigit(_yychar)) { + const char *word = _it - 2; while (std::isalnum(_yychar)) { yyinp(); } + if (_engine) + _yyval.string = _engine->number(word, _it - word - 1); return Parser::T_NUMBER; } return Parser::T_DOT; @@ -378,7 +381,7 @@ int Lexer::yylex_helper(const char **position, int *line) yyinp(); } if (_engine) - _yyval.string = _engine->identifier(word, _it - word - 1); + _yyval.string = _engine->number(word, _it - word - 1); return Parser::T_NUMBER; } diff --git a/src/plugins/glsleditor/glslcodecompletion.cpp b/src/plugins/glsleditor/glslcodecompletion.cpp index cfdc3a1f5f..a2ebe3e25c 100644 --- a/src/plugins/glsleditor/glslcodecompletion.cpp +++ b/src/plugins/glsleditor/glslcodecompletion.cpp @@ -28,12 +28,15 @@ **************************************************************************/ #include "glslcodecompletion.h" #include "glsleditor.h" +#include "glsleditorplugin.h" +#include #include #include #include #include using namespace GLSLEditor; +using namespace GLSLEditor::Internal; static bool isIdentifierChar(QChar ch) { @@ -310,14 +313,24 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor) int pos = editor->position() - 1; QChar ch = editor->characterAt(pos); - while (ch.isLetterOrNumber()) + while (ch.isLetterOrNumber() || ch == QLatin1Char('_')) ch = editor->characterAt(--pos); const QIcon symbolIcon = iconForColor(Qt::darkCyan); m_completions += m_keywordCompletions; if (GLSLTextEditor *ed = qobject_cast(m_editor->widget())) { - foreach (const QString &id, ed->identifiers()) { + QSet identifiers = ed->identifiers(); + + identifiers += GLSLEditorPlugin::instance()->shaderInit()->engine->identifiers(); + + if (ed->isVertexShader()) + identifiers += GLSLEditorPlugin::instance()->vertexShaderInit()->engine->identifiers(); + + if (ed->isFragmentShader()) + identifiers += GLSLEditorPlugin::instance()->fragmentShaderInit()->engine->identifiers(); + + foreach (const QString &id, identifiers) { TextEditor::CompletionItem item(this); item.text = id; item.icon = symbolIcon; diff --git a/src/plugins/glsleditor/glslcodecompletion.h b/src/plugins/glsleditor/glslcodecompletion.h index 3b7b665e6a..4e2d424ae4 100644 --- a/src/plugins/glsleditor/glslcodecompletion.h +++ b/src/plugins/glsleditor/glslcodecompletion.h @@ -32,6 +32,7 @@ #include namespace GLSLEditor { +namespace Internal { class CodeCompletion: public TextEditor::ICompletionCollector { @@ -100,6 +101,7 @@ private: bool m_restartCompletion; }; +} // namespace Internal } // namespace GLSLEditor #endif // GLSLCODECOMPLETION_H -- 2.11.0