summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2010-11-26 15:50:55 +0100
committerRoberto Raggi <roberto.raggi@nokia.com>2010-11-26 15:52:59 +0100
commitb19b2a71672ee172786e5d3c2c1ff307f9745a68 (patch)
treee9c341304b0aece191fb8a38337eebb4f552a520
parent30e74df0baedcd3a5e2aa309892e2b98d435b0b0 (diff)
downloadqt-creator-b19b2a71672ee172786e5d3c2c1ff307f9745a68.tar.gz
Store the numbers and the identifiers in two different sets.
-rw-r--r--src/libs/glsl/glslengine.cpp25
-rw-r--r--src/libs/glsl/glslengine.h5
-rw-r--r--src/libs/glsl/glsllexer.cpp5
-rw-r--r--src/plugins/glsleditor/glslcodecompletion.cpp17
-rw-r--r--src/plugins/glsleditor/glslcodecompletion.h2
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