#include <string>
#include <vector>
#include <msp/core/refptr.h>
+#include <msp/core/variant.h>
#include "features.h"
#include "glsl_error.h"
#include "sourcemap.h"
enum
{
+ INTERNAL_SOURCE = -2,
BUILTIN_SOURCE = -1,
GENERATED_SOURCE = 0
};
class NodeArray: public NodeContainer<std::vector<RefPtr<T> > >
{ };
-struct StructDeclaration;
+struct TypeDeclaration;
struct VariableDeclaration;
struct InterfaceBlock;
struct FunctionDeclaration;
{
const Operator *oper;
+ TypeDeclaration *type;
+ bool lvalue;
+
Expression();
virtual Expression *clone() const = 0;
struct Literal: Expression
{
std::string token;
+ Variant value;
virtual Literal *clone() const { return new Literal(*this); }
virtual void visit(NodeVisitor &);
{
Block members;
+ InterfaceBlock *interface_block;
+
StructDeclaration();
+ StructDeclaration(const StructDeclaration &);
+ ~StructDeclaration();
virtual StructDeclaration *clone() const { return new StructDeclaration(*this); }
virtual void visit(NodeVisitor &);
{
std::string interface;
std::string name;
- Block members;
+ NodePtr<Block> members;
std::string instance_name;
bool array;
+ /* An interface block's ultimate base type is always a struct. The
+ immediate type may be either that same struct or an array of it. */
+ TypeDeclaration *type_declaration;
+ StructDeclaration *struct_declaration;
InterfaceBlock *linked_block;
InterfaceBlock();