OSDN Git Service

Store the numbers and the identifiers in two different sets.
authorRoberto Raggi <roberto.raggi@nokia.com>
Fri, 26 Nov 2010 14:50:55 +0000 (15:50 +0100)
committerRoberto Raggi <roberto.raggi@nokia.com>
Fri, 26 Nov 2010 14:52:59 +0000 (15:52 +0100)
src/libs/glsl/glslengine.cpp
src/libs/glsl/glslengine.h
src/libs/glsl/glsllexer.cpp
src/plugins/glsleditor/glslcodecompletion.cpp
src/plugins/glsleditor/glslcodecompletion.h

index 2c6b228..73938e9 100644 (file)
@@ -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;
index b348042..ab73deb 100644 (file)
@@ -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;
index 3651d94..ba67c86 100644 (file)
@@ -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;
         }
 
index cfdc3a1..a2ebe3e 100644 (file)
 **************************************************************************/
 #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;
index 3b7b665..4e2d424 100644 (file)
@@ -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