Commit e117f04f authored by Rhys Weatherley's avatar Rhys Weatherley

Show different icons for GLSL variable categories

Attributes, uniforms, varyings, and constants are shown with a
distinguished icon that is different from regular variables.
parent ecf4baec
...@@ -266,11 +266,12 @@ Argument *Engine::newArgument(Function *function, const QString &name, const Typ ...@@ -266,11 +266,12 @@ Argument *Engine::newArgument(Function *function, const QString &name, const Typ
return a; return a;
} }
Variable *Engine::newVariable(Scope *scope, const QString &name, const Type *type) Variable *Engine::newVariable(Scope *scope, const QString &name, const Type *type, int qualifiers)
{ {
Variable *var = new Variable(scope); Variable *var = new Variable(scope);
var->setName(name); var->setName(name);
var->setType(type); var->setType(type);
var->setQualifiers(qualifiers);
_symbols.append(var); _symbols.append(var);
return var; return var;
} }
......
...@@ -120,7 +120,7 @@ public: ...@@ -120,7 +120,7 @@ public:
Block *newBlock(Scope *scope = 0); Block *newBlock(Scope *scope = 0);
Function *newFunction(Scope *scope = 0); Function *newFunction(Scope *scope = 0);
Argument *newArgument(Function *function, const QString &name, const Type *type); Argument *newArgument(Function *function, const QString &name, const Type *type);
Variable *newVariable(Scope *scope, const QString &name, const Type *type); Variable *newVariable(Scope *scope, const QString &name, const Type *type, int qualifiers = 0);
MemoryPool *pool(); MemoryPool *pool();
......
...@@ -751,7 +751,11 @@ bool Semantic::visit(VariableDeclarationAST *ast) ...@@ -751,7 +751,11 @@ bool Semantic::visit(VariableDeclarationAST *ast)
const Type *ty = type(ast->type); const Type *ty = type(ast->type);
ExprResult initializer = expression(ast->initializer); ExprResult initializer = expression(ast->initializer);
if (ast->name) { if (ast->name) {
Variable *var = _engine->newVariable(_scope, *ast->name, ty); QualifiedTypeAST *qtype = ast->type->asQualifiedType();
int qualifiers = 0;
if (qtype)
qualifiers = qtype->qualifiers;
Variable *var = _engine->newVariable(_scope, *ast->name, ty, qualifiers);
_scope->add(var); _scope->add(var);
} }
return false; return false;
......
...@@ -78,6 +78,7 @@ Symbol *Block::find(const QString &name) const ...@@ -78,6 +78,7 @@ Symbol *Block::find(const QString &name) const
Variable::Variable(Scope *scope) Variable::Variable(Scope *scope)
: Symbol(scope) : Symbol(scope)
, _type(0) , _type(0)
, _qualifiers(0)
{ {
} }
......
...@@ -59,10 +59,14 @@ public: ...@@ -59,10 +59,14 @@ public:
virtual const Type *type() const; virtual const Type *type() const;
void setType(const Type *type); void setType(const Type *type);
int qualifiers() const { return _qualifiers; }
void setQualifiers(int qualifiers) { _qualifiers = qualifiers; }
virtual Variable *asVariable() { return this; } virtual Variable *asVariable() { return this; }
private: private:
const Type *_type; const Type *_type;
int _qualifiers;
}; };
class GLSL_EXPORT Block: public Scope class GLSL_EXPORT Block: public Scope
......
...@@ -492,6 +492,10 @@ CodeCompletion::CodeCompletion(QObject *parent) ...@@ -492,6 +492,10 @@ CodeCompletion::CodeCompletion(QObject *parent)
m_varIcon(":/glsleditor/images/var.png"), m_varIcon(":/glsleditor/images/var.png"),
m_functionIcon(":/glsleditor/images/func.png"), m_functionIcon(":/glsleditor/images/func.png"),
m_typeIcon(":/glsleditor/images/type.png"), m_typeIcon(":/glsleditor/images/type.png"),
m_constIcon(":/glsleditor/images/const.png"),
m_attributeIcon(":/glsleditor/images/attribute.png"),
m_uniformIcon(":/glsleditor/images/uniform.png"),
m_varyingIcon(":/glsleditor/images/varying.png"),
m_otherIcon(":/glsleditor/images/other.png") m_otherIcon(":/glsleditor/images/other.png")
{ {
const QIcon keywordIcon(QLatin1String(":/glsleditor/images/keyword.png")); const QIcon keywordIcon(QLatin1String(":/glsleditor/images/keyword.png"));
...@@ -678,14 +682,28 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor) ...@@ -678,14 +682,28 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
foreach (GLSL::Symbol *s, members) { foreach (GLSL::Symbol *s, members) {
TextEditor::CompletionItem item(this); TextEditor::CompletionItem item(this);
if (s->asVariable() || s->asArgument()) GLSL::Variable *var = s->asVariable();
if (var) {
int storageType = var->qualifiers() & GLSL::QualifiedTypeAST::StorageMask;
if (storageType == GLSL::QualifiedTypeAST::Attribute)
item.icon = m_attributeIcon;
else if (storageType == GLSL::QualifiedTypeAST::Uniform)
item.icon = m_uniformIcon;
else if (storageType == GLSL::QualifiedTypeAST::Varying)
item.icon = m_varyingIcon;
else if (storageType == GLSL::QualifiedTypeAST::Const)
item.icon = m_constIcon;
else
item.icon = m_varIcon;
} else if (s->asArgument()) {
item.icon = m_varIcon; item.icon = m_varIcon;
else if (s->asFunction() || s->asOverloadSet()) } else if (s->asFunction() || s->asOverloadSet()) {
item.icon = m_functionIcon; item.icon = m_functionIcon;
else if (s->asStruct()) } else if (s->asStruct()) {
item.icon = m_typeIcon; item.icon = m_typeIcon;
else } else {
item.icon = m_otherIcon; item.icon = m_otherIcon;
}
item.text = s->name(); item.text = s->name();
if (specialMembers.contains(item.text)) if (specialMembers.contains(item.text))
item.order = SpecialMemberOrder; item.order = SpecialMemberOrder;
......
...@@ -110,6 +110,10 @@ private: ...@@ -110,6 +110,10 @@ private:
QIcon m_varIcon; QIcon m_varIcon;
QIcon m_functionIcon; QIcon m_functionIcon;
QIcon m_typeIcon; QIcon m_typeIcon;
QIcon m_constIcon;
QIcon m_attributeIcon;
QIcon m_uniformIcon;
QIcon m_varyingIcon;
QIcon m_otherIcon; QIcon m_otherIcon;
}; };
......
...@@ -6,6 +6,10 @@ ...@@ -6,6 +6,10 @@
<file>images/var.png</file> <file>images/var.png</file>
<file>images/func.png</file> <file>images/func.png</file>
<file>images/type.png</file> <file>images/type.png</file>
<file>images/const.png</file>
<file>images/attribute.png</file>
<file>images/uniform.png</file>
<file>images/varying.png</file>
<file>images/other.png</file> <file>images/other.png</file>
</qresource> </qresource>
</RCC> </RCC>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment