diff options
author | Roberto Raggi <roberto.raggi@nokia.com> | 2010-11-26 15:50:55 +0100 |
---|---|---|
committer | Roberto Raggi <roberto.raggi@nokia.com> | 2010-11-26 15:52:59 +0100 |
commit | b19b2a71672ee172786e5d3c2c1ff307f9745a68 (patch) | |
tree | e9c341304b0aece191fb8a38337eebb4f552a520 | |
parent | 30e74df0baedcd3a5e2aa309892e2b98d435b0b0 (diff) | |
download | qt-creator-b19b2a71672ee172786e5d3c2c1ff307f9745a68.tar.gz |
Store the numbers and the identifiers in two different sets.
-rw-r--r-- | src/libs/glsl/glslengine.cpp | 25 | ||||
-rw-r--r-- | src/libs/glsl/glslengine.h | 5 | ||||
-rw-r--r-- | src/libs/glsl/glsllexer.cpp | 5 | ||||
-rw-r--r-- | src/plugins/glsleditor/glslcodecompletion.cpp | 17 | ||||
-rw-r--r-- | 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<QString> 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<QString> 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<QString> 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<QString> identifiers() const; + const QString *number(const QString &s); + const QString *number(const char *s, int n); + QSet<QString> numbers() const; + // types const UndefinedType *undefinedType(); const VoidType *voidType(); @@ -129,6 +133,7 @@ public: private: QSet<QString> _identifiers; + QSet<QString> _numbers; TypeTable<VectorType> _vectorTypes; TypeTable<MatrixType> _matrixTypes; TypeTable<SamplerType> _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 <glsl/glslengine.h> #include <texteditor/completionsettings.h> #include <QtGui/QIcon> #include <QtGui/QPainter> #include <QtCore/QDebug> 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<GLSLTextEditor *>(m_editor->widget())) { - foreach (const QString &id, ed->identifiers()) { + QSet<QString> 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 <texteditor/icompletioncollector.h> namespace GLSLEditor { +namespace Internal { class CodeCompletion: public TextEditor::ICompletionCollector { @@ -100,6 +101,7 @@ private: bool m_restartCompletion; }; +} // namespace Internal } // namespace GLSLEditor #endif // GLSLCODECOMPLETION_H |