1 /**************************************************************************
3 ** This file is part of Qt Creator
5 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
7 ** Contact: Nokia Corporation (info@qt.nokia.com)
10 ** GNU Lesser General Public License Usage
12 ** This file may be used under the terms of the GNU Lesser General Public
13 ** License version 2.1 as published by the Free Software Foundation and
14 ** appearing in the file LICENSE.LGPL included in the packaging of this file.
15 ** Please review the following information to ensure the GNU Lesser General
16 ** Public License version 2.1 requirements will be met:
17 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
19 ** In addition, as a special exception, Nokia gives you certain additional
20 ** rights. These rights are described in the Nokia Qt LGPL Exception
21 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
25 ** Alternatively, this file may be used in accordance with the terms and
26 ** conditions contained in a signed written agreement between you and Nokia.
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at qt-info@nokia.com.
31 **************************************************************************/
37 #include "glslmemorypool.h"
38 #include <QtCore/qstring.h>
43 class TranslationUnitAST;
45 class IdentifierExpressionAST;
46 class LiteralExpressionAST;
47 class BinaryExpressionAST;
48 class UnaryExpressionAST;
49 class TernaryExpressionAST;
50 class AssignmentExpressionAST;
51 class MemberAccessExpressionAST;
52 class FunctionCallExpressionAST;
53 class FunctionIdentifierAST;
54 class DeclarationExpressionAST;
56 class ExpressionStatementAST;
57 class CompoundStatementAST;
59 class WhileStatementAST;
61 class ForStatementAST;
62 class JumpStatementAST;
63 class ReturnStatementAST;
64 class SwitchStatementAST;
65 class CaseLabelStatementAST;
66 class DeclarationStatementAST;
72 class QualifiedTypeAST;
74 class PrecisionDeclarationAST;
75 class ParameterDeclarationAST;
76 class VariableDeclarationAST;
77 class TypeDeclarationAST;
78 class TypeAndVariableDeclarationAST;
79 class InvariantDeclarationAST;
80 class InitDeclarationAST;
81 class FunctionDeclarationAST;
85 class GLSL_EXPORT List: public Managed
89 : value(value), next(this), lineno(0) {}
91 List(List *previous, const T &value)
92 : value(value), lineno(0)
94 next = previous->next;
95 previous->next = this;
110 // Append two lists, which are assumed to still be circular, pre-finish.
111 template <typename T>
112 List<T> *appendLists(List<T> *first, List<T> *second)
118 List<T> *firstHead = first->next;
119 List<T> *secondHead = second->next;
120 first->next = secondHead;
121 second->next = firstHead;
125 class GLSL_EXPORT AST: public Managed
132 Kind_TranslationUnit,
134 // Primary expressions
148 // Binary expressions
175 Kind_MemberFunctionCall,
176 Kind_FunctionIdentifier,
177 Kind_DeclarationExpression,
179 // Assignment expressions
186 Kind_AssignShiftLeft,
187 Kind_AssignShiftRight,
193 Kind_ExpressionStatement,
194 Kind_CompoundStatement,
203 Kind_ReturnExpression,
207 Kind_DeclarationStatement,
215 Kind_AnonymousStructType,
220 Kind_PrecisionDeclaration,
221 Kind_ParameterDeclaration,
222 Kind_VariableDeclaration,
223 Kind_TypeDeclaration,
224 Kind_TypeAndVariableDeclaration,
225 Kind_InvariantDeclaration,
226 Kind_InitDeclaration,
227 Kind_FunctionDeclaration
230 virtual TranslationUnitAST *asTranslationUnit() { return 0; }
232 virtual ExpressionAST *asExpression() { return 0; }
233 virtual IdentifierExpressionAST *asIdentifierExpression() { return 0; }
234 virtual LiteralExpressionAST *asLiteralExpression() { return 0; }
235 virtual BinaryExpressionAST *asBinaryExpression() { return 0; }
236 virtual UnaryExpressionAST *asUnaryExpression() { return 0; }
237 virtual TernaryExpressionAST *asTernaryExpression() { return 0; }
238 virtual AssignmentExpressionAST *asAssignmentExpression() { return 0; }
239 virtual MemberAccessExpressionAST *asMemberAccessExpression() { return 0; }
240 virtual FunctionCallExpressionAST *asFunctionCallExpression() { return 0; }
241 virtual FunctionIdentifierAST *asFunctionIdentifier() { return 0; }
242 virtual DeclarationExpressionAST *asDeclarationExpression() { return 0; }
244 virtual StatementAST *asStatement() { return 0; }
245 virtual ExpressionStatementAST *asExpressionStatement() { return 0; }
246 virtual CompoundStatementAST *asCompoundStatement() { return 0; }
247 virtual IfStatementAST *asIfStatement() { return 0; }
248 virtual WhileStatementAST *asWhileStatement() { return 0; }
249 virtual DoStatementAST *asDoStatement() { return 0; }
250 virtual ForStatementAST *asForStatement() { return 0; }
251 virtual JumpStatementAST *asJumpStatement() { return 0; }
252 virtual ReturnStatementAST *asReturnStatement() { return 0; }
253 virtual SwitchStatementAST *asSwitchStatement() { return 0; }
254 virtual CaseLabelStatementAST *asCaseLabelStatement() { return 0; }
255 virtual DeclarationStatementAST *asDeclarationStatement() { return 0; }
257 virtual TypeAST *asType() { return 0; }
258 virtual BasicTypeAST *asBasicType() { return 0; }
259 virtual NamedTypeAST *asNamedType() { return 0; }
260 virtual ArrayTypeAST *asArrayType() { return 0; }
261 virtual StructTypeAST *asStructType() { return 0; }
262 virtual QualifiedTypeAST *asQualifiedType() { return 0; }
264 virtual DeclarationAST *asDeclaration() { return 0; }
265 virtual PrecisionDeclarationAST *asPrecisionDeclaration() { return 0; }
266 virtual ParameterDeclarationAST *asParameterDeclaration() { return 0; }
267 virtual VariableDeclarationAST *asVariableDeclaration() { return 0; }
268 virtual TypeDeclarationAST *asTypeDeclaration() { return 0; }
269 virtual TypeAndVariableDeclarationAST *asTypeAndVariableDeclaration() { return 0; }
270 virtual InvariantDeclarationAST *asInvariantDeclaration() { return 0; }
271 virtual InitDeclarationAST *asInitDeclaration() { return 0; }
272 virtual FunctionDeclarationAST *asFunctionDeclaration() { return 0; }
274 void accept(Visitor *visitor);
275 static void accept(AST *ast, Visitor *visitor);
277 template <typename T>
278 static void accept(List<T> *it, Visitor *visitor)
280 for (; it; it = it->next)
281 accept(it->value, visitor);
284 virtual void accept0(Visitor *visitor) = 0;
287 AST(Kind _kind) : kind(_kind), lineno(0) {}
289 template <typename T>
290 static List<T> *finish(List<T> *list)
294 return list->finish(); // convert the circular list with a linked list.
297 public: // attributes
302 ~AST() {} // Managed types cannot be deleted.
305 class GLSL_EXPORT TranslationUnitAST: public AST
308 TranslationUnitAST(List<DeclarationAST *> *declarations)
309 : AST(Kind_TranslationUnit), declarations(finish(declarations)) {}
311 virtual TranslationUnitAST *asTranslationUnit() { return this; }
313 virtual void accept0(Visitor *visitor);
315 public: // attributes
316 List<DeclarationAST *> *declarations;
319 class GLSL_EXPORT ExpressionAST: public AST
322 ExpressionAST(Kind _kind) : AST(_kind) {}
325 virtual ExpressionAST *asExpression() { return this; }
328 class GLSL_EXPORT IdentifierExpressionAST: public ExpressionAST
331 IdentifierExpressionAST(const QString *_name)
332 : ExpressionAST(Kind_Identifier), name(_name) {}
334 virtual IdentifierExpressionAST *asIdentifierExpression() { return this; }
336 virtual void accept0(Visitor *visitor);
338 public: // attributes
342 class GLSL_EXPORT LiteralExpressionAST: public ExpressionAST
345 LiteralExpressionAST(const QString *_value)
346 : ExpressionAST(Kind_Literal), value(_value) {}
348 virtual LiteralExpressionAST *asLiteralExpression() { return this; }
350 virtual void accept0(Visitor *visitor);
352 public: // attributes
353 const QString *value;
356 class GLSL_EXPORT BinaryExpressionAST: public ExpressionAST
359 BinaryExpressionAST(Kind _kind, ExpressionAST *_left, ExpressionAST *_right)
360 : ExpressionAST(_kind), left(_left), right(_right) {}
362 virtual BinaryExpressionAST *asBinaryExpression() { return this; }
364 virtual void accept0(Visitor *visitor);
366 public: // attributes
368 ExpressionAST *right;
371 class GLSL_EXPORT UnaryExpressionAST: public ExpressionAST
374 UnaryExpressionAST(Kind _kind, ExpressionAST *_expr)
375 : ExpressionAST(_kind), expr(_expr) {}
377 virtual UnaryExpressionAST *asUnaryExpression() { return this; }
379 virtual void accept0(Visitor *visitor);
381 public: // attributes
385 class GLSL_EXPORT TernaryExpressionAST: public ExpressionAST
388 TernaryExpressionAST(Kind _kind, ExpressionAST *_first, ExpressionAST *_second, ExpressionAST *_third)
389 : ExpressionAST(_kind), first(_first), second(_second), third(_third) {}
391 virtual TernaryExpressionAST *asTernaryExpression() { return this; }
393 virtual void accept0(Visitor *visitor);
395 public: // attributes
396 ExpressionAST *first;
397 ExpressionAST *second;
398 ExpressionAST *third;
401 class GLSL_EXPORT AssignmentExpressionAST: public ExpressionAST
404 AssignmentExpressionAST(Kind _kind, ExpressionAST *_variable, ExpressionAST *_value)
405 : ExpressionAST(_kind), variable(_variable), value(_value) {}
407 virtual AssignmentExpressionAST *asAssignmentExpression() { return this; }
409 virtual void accept0(Visitor *visitor);
411 public: // attributes
412 ExpressionAST *variable;
413 ExpressionAST *value;
416 class GLSL_EXPORT MemberAccessExpressionAST: public ExpressionAST
419 MemberAccessExpressionAST(ExpressionAST *_expr, const QString *_field)
420 : ExpressionAST(Kind_MemberAccess), expr(_expr), field(_field) {}
422 virtual MemberAccessExpressionAST *asMemberAccessExpression() { return this; }
424 virtual void accept0(Visitor *visitor);
426 public: // attributes
428 const QString *field;
431 class GLSL_EXPORT FunctionCallExpressionAST: public ExpressionAST
434 FunctionCallExpressionAST(FunctionIdentifierAST *_id,
435 List<ExpressionAST *> *_arguments)
436 : ExpressionAST(Kind_FunctionCall), expr(0), id(_id)
437 , arguments(finish(_arguments)) {}
438 FunctionCallExpressionAST(ExpressionAST *_expr, FunctionIdentifierAST *_id,
439 List<ExpressionAST *> *_arguments)
440 : ExpressionAST(Kind_MemberFunctionCall), expr(_expr), id(_id)
441 , arguments(finish(_arguments)) {}
443 virtual FunctionCallExpressionAST *asFunctionCallExpression() { return this; }
445 virtual void accept0(Visitor *visitor);
447 public: // attributes
449 FunctionIdentifierAST *id;
450 List<ExpressionAST *> *arguments;
453 class GLSL_EXPORT FunctionIdentifierAST: public AST
456 FunctionIdentifierAST(const QString *_name)
457 : AST(Kind_FunctionIdentifier), name(_name), type(0) {}
458 FunctionIdentifierAST(TypeAST *_type)
459 : AST(Kind_FunctionIdentifier), name(0), type(_type) {}
461 virtual FunctionIdentifierAST *asFunctionIdentifier() { return this; }
463 virtual void accept0(Visitor *visitor);
465 public: // attributes
470 class GLSL_EXPORT DeclarationExpressionAST: public ExpressionAST
473 DeclarationExpressionAST(TypeAST *_type, const QString *_name,
474 ExpressionAST *_initializer)
475 : ExpressionAST(Kind_DeclarationExpression), type(_type)
476 , name(_name), initializer(_initializer) {}
478 virtual DeclarationExpressionAST *asDeclarationExpression() { return this; }
480 virtual void accept0(Visitor *visitor);
482 public: // attributes
485 ExpressionAST *initializer;
488 class GLSL_EXPORT StatementAST: public AST
491 StatementAST(Kind _kind) : AST(_kind) {}
494 virtual StatementAST *asStatement() { return this; }
497 class GLSL_EXPORT ExpressionStatementAST: public StatementAST
500 ExpressionStatementAST(ExpressionAST *_expr)
501 : StatementAST(Kind_ExpressionStatement), expr(_expr) {}
503 virtual ExpressionStatementAST *asExpressionStatement() { return this; }
505 virtual void accept0(Visitor *visitor);
507 public: // attributes
511 class GLSL_EXPORT CompoundStatementAST: public StatementAST
514 CompoundStatementAST()
515 : StatementAST(Kind_CompoundStatement), statements(0)
516 , start(0), end(0), symbol(0) {}
517 CompoundStatementAST(List<StatementAST *> *_statements)
518 : StatementAST(Kind_CompoundStatement), statements(finish(_statements))
519 , start(0), end(0), symbol(0) {}
521 virtual CompoundStatementAST *asCompoundStatement() { return this; }
523 virtual void accept0(Visitor *visitor);
525 public: // attributes
526 List<StatementAST *> *statements;
529 Block *symbol; // decoration
532 class GLSL_EXPORT IfStatementAST: public StatementAST
535 IfStatementAST(ExpressionAST *_condition, StatementAST *_thenClause, StatementAST *_elseClause)
536 : StatementAST(Kind_If), condition(_condition)
537 , thenClause(_thenClause), elseClause(_elseClause) {}
539 virtual IfStatementAST *asIfStatement() { return this; }
541 virtual void accept0(Visitor *visitor);
543 public: // attributes
544 ExpressionAST *condition;
545 StatementAST *thenClause;
546 StatementAST *elseClause;
549 class GLSL_EXPORT WhileStatementAST: public StatementAST
552 WhileStatementAST(ExpressionAST *_condition, StatementAST *_body)
553 : StatementAST(Kind_While), condition(_condition), body(_body) {}
555 virtual WhileStatementAST *asWhileStatement() { return this; }
557 virtual void accept0(Visitor *visitor);
559 public: // attributes
560 ExpressionAST *condition;
564 class GLSL_EXPORT DoStatementAST: public StatementAST
567 DoStatementAST(StatementAST *_body, ExpressionAST *_condition)
568 : StatementAST(Kind_Do), body(_body), condition(_condition) {}
570 virtual DoStatementAST *asDoStatement() { return this; }
572 virtual void accept0(Visitor *visitor);
574 public: // attributes
576 ExpressionAST *condition;
579 class GLSL_EXPORT ForStatementAST: public StatementAST
582 ForStatementAST(StatementAST *_init, ExpressionAST *_condition, ExpressionAST *_increment, StatementAST *_body)
583 : StatementAST(Kind_For), init(_init), condition(_condition), increment(_increment), body(_body) {}
585 virtual ForStatementAST *asForStatement() { return this; }
587 virtual void accept0(Visitor *visitor);
589 public: // attributes
591 ExpressionAST *condition;
592 ExpressionAST *increment;
596 class GLSL_EXPORT JumpStatementAST: public StatementAST
599 JumpStatementAST(Kind _kind) : StatementAST(_kind) {}
601 virtual JumpStatementAST *asJumpStatement() { return this; }
603 virtual void accept0(Visitor *visitor);
606 class GLSL_EXPORT ReturnStatementAST: public StatementAST
609 ReturnStatementAST() : StatementAST(Kind_Return), expr(0) {}
610 ReturnStatementAST(ExpressionAST *_expr)
611 : StatementAST(Kind_ReturnExpression), expr(_expr) {}
613 virtual ReturnStatementAST *asReturnStatement() { return this; }
615 virtual void accept0(Visitor *visitor);
617 public: // attributes
621 class GLSL_EXPORT SwitchStatementAST: public StatementAST
624 SwitchStatementAST(ExpressionAST *_expr, StatementAST *_body)
625 : StatementAST(Kind_Switch), expr(_expr), body(_body) {}
627 virtual SwitchStatementAST *asSwitchStatement() { return this; }
629 virtual void accept0(Visitor *visitor);
631 public: // attributes
636 class GLSL_EXPORT CaseLabelStatementAST: public StatementAST
639 CaseLabelStatementAST() : StatementAST(Kind_DefaultLabel), expr(0) {}
640 CaseLabelStatementAST(ExpressionAST *_expr)
641 : StatementAST(Kind_CaseLabel), expr(_expr) {}
643 virtual CaseLabelStatementAST *asCaseLabelStatement() { return this; }
645 virtual void accept0(Visitor *visitor);
647 public: // attributes
651 class GLSL_EXPORT DeclarationStatementAST: public StatementAST
654 DeclarationStatementAST(DeclarationAST *_decl)
655 : StatementAST(Kind_DeclarationStatement), decl(_decl) {}
657 virtual DeclarationStatementAST *asDeclarationStatement() { return this; }
659 virtual void accept0(Visitor *visitor);
661 public: // attributes
662 DeclarationAST *decl;
665 class GLSL_EXPORT TypeAST: public AST
668 TypeAST(Kind _kind) : AST(_kind) {}
673 PrecNotValid, // Precision not valid (e.g. structs).
674 PrecUnspecified, // Precision not known, but can be validly set.
680 virtual TypeAST *asType() { return this; }
682 virtual Precision precision() const = 0;
684 // Set the precision for the innermost basic type. Returns false if it
685 // is not valid to set a precision (e.g. structs).
686 virtual bool setPrecision(Precision precision) = 0;
689 class GLSL_EXPORT BasicTypeAST: public TypeAST
692 // Pass the parser's token code: T_VOID, T_VEC4, etc.
693 BasicTypeAST(int _token, const char *_name);
695 virtual BasicTypeAST *asBasicType() { return this; }
697 virtual void accept0(Visitor *visitor);
699 virtual Precision precision() const;
700 virtual bool setPrecision(Precision precision);
702 public: // attributes
708 class GLSL_EXPORT NamedTypeAST: public TypeAST
711 NamedTypeAST(const QString *_name) : TypeAST(Kind_NamedType), name(_name) {}
713 virtual NamedTypeAST *asNamedType() { return this; }
715 virtual void accept0(Visitor *visitor);
717 virtual Precision precision() const;
718 virtual bool setPrecision(Precision precision);
720 public: // attributes
724 class GLSL_EXPORT ArrayTypeAST: public TypeAST
727 ArrayTypeAST(TypeAST *_elementType)
728 : TypeAST(Kind_OpenArrayType), elementType(_elementType), size(0) {}
729 ArrayTypeAST(TypeAST *_elementType, ExpressionAST *_size)
730 : TypeAST(Kind_ArrayType), elementType(_elementType), size(_size) {}
732 virtual ArrayTypeAST *asArrayType() { return this; }
734 virtual void accept0(Visitor *visitor);
736 virtual Precision precision() const;
737 virtual bool setPrecision(Precision precision);
739 public: // attributes
740 TypeAST *elementType;
744 class GLSL_EXPORT StructTypeAST: public TypeAST
747 class Field: public AST
750 Field(const QString *_name)
751 : AST(Kind_StructField), name(_name), type(0) {}
753 // Takes the outer shell of an array type with the innermost
754 // element type set to null. The fixInnerTypes() method will
755 // set the innermost element type to a meaningful value.
756 Field(const QString *_name, TypeAST *_type)
757 : AST(Kind_StructField), name(_name), type(_type) {}
759 virtual void accept0(Visitor *visitor);
761 void setInnerType(TypeAST *innerType);
767 StructTypeAST(List<Field *> *_fields)
768 : TypeAST(Kind_AnonymousStructType), fields(finish(_fields)) {}
769 StructTypeAST(const QString *_name, List<Field *> *_fields)
770 : TypeAST(Kind_StructType), name(_name), fields(finish(_fields)) {}
772 virtual StructTypeAST *asStructType() { return this; }
774 virtual void accept0(Visitor *visitor);
776 virtual Precision precision() const;
777 virtual bool setPrecision(Precision precision);
779 // Fix the inner types of a field list. The "innerType" will
780 // be copied into the "array holes" of all fields.
781 static List<Field *> *fixInnerTypes(TypeAST *innerType, List<Field *> *fields);
783 public: // attributes
785 List<Field *> *fields;
788 class GLSL_EXPORT LayoutQualifier
791 LayoutQualifier(const QString *_name, const QString *_number)
792 : name(_name), number(_number), lineno(0) {}
794 public: // attributes
796 const QString *number;
800 class GLSL_EXPORT QualifiedTypeAST: public TypeAST
803 QualifiedTypeAST(int _qualifiers, TypeAST *_type, List<LayoutQualifier *> *_layout_list)
804 : TypeAST(Kind_QualifiedType), qualifiers(_qualifiers), type(_type)
805 , layout_list(finish(_layout_list)) {}
809 StorageMask = 0x000000FF,
810 NoStorage = 0x00000000,
812 Attribute = 0x00000002,
813 Varying = 0x00000003,
814 CentroidVarying = 0x00000004,
817 CentroidIn = 0x00000007,
818 CentroidOut = 0x00000008,
819 PatchIn = 0x00000009,
820 PatchOut = 0x0000000A,
821 SampleIn = 0x0000000B,
822 SampleOut = 0x0000000C,
823 Uniform = 0x0000000D,
824 InterpolationMask = 0x00000F00,
825 NoInterpolation = 0x00000000,
828 NoPerspective = 0x00000300,
829 Invariant = 0x00010000,
833 virtual QualifiedTypeAST *asQualifiedType() { return this; }
835 virtual void accept0(Visitor *visitor);
837 virtual Precision precision() const { return type->precision(); }
838 virtual bool setPrecision(Precision precision) { return type->setPrecision(precision); }
840 public: // attributes
843 List<LayoutQualifier *> *layout_list;
846 class GLSL_EXPORT DeclarationAST: public AST
849 DeclarationAST(Kind _kind) : AST(_kind) {}
852 virtual DeclarationAST *asDeclaration() { return this; }
855 class GLSL_EXPORT PrecisionDeclarationAST: public DeclarationAST
858 PrecisionDeclarationAST(TypeAST::Precision _precision, TypeAST *_type)
859 : DeclarationAST(Kind_PrecisionDeclaration)
860 , precision(_precision), type(_type) {}
862 virtual PrecisionDeclarationAST *asPrecisionDeclaration() { return this; }
864 virtual void accept0(Visitor *visitor);
866 public: // attributes
867 TypeAST::Precision precision;
871 class GLSL_EXPORT ParameterDeclarationAST: public DeclarationAST
880 ParameterDeclarationAST(TypeAST *_type, Qualifier _qualifier,
881 const QString *_name)
882 : DeclarationAST(Kind_ParameterDeclaration), type(_type)
883 , qualifier(_qualifier), name(_name) {}
885 virtual ParameterDeclarationAST *asParameterDeclaration() { return this; }
887 virtual void accept0(Visitor *visitor);
889 public: // attributes
895 class GLSL_EXPORT VariableDeclarationAST: public DeclarationAST
898 VariableDeclarationAST(TypeAST *_type, const QString *_name,
899 ExpressionAST *_initializer = 0)
900 : DeclarationAST(Kind_VariableDeclaration), type(_type)
901 , name(_name), initializer(_initializer) {}
903 virtual VariableDeclarationAST *asVariableDeclaration() { return this; }
905 virtual void accept0(Visitor *visitor);
907 static TypeAST *declarationType(List<DeclarationAST *> *decls);
909 public: // attributes
912 ExpressionAST *initializer;
915 class GLSL_EXPORT TypeDeclarationAST: public DeclarationAST
918 TypeDeclarationAST(TypeAST *_type)
919 : DeclarationAST(Kind_TypeDeclaration), type(_type) {}
921 virtual TypeDeclarationAST *asTypeDeclaration() { return this; }
923 virtual void accept0(Visitor *visitor);
925 public: // attributes
929 class GLSL_EXPORT TypeAndVariableDeclarationAST: public DeclarationAST
932 TypeAndVariableDeclarationAST(TypeDeclarationAST *_typeDecl,
933 VariableDeclarationAST *_varDecl)
934 : DeclarationAST(Kind_TypeAndVariableDeclaration)
935 , typeDecl(_typeDecl), varDecl(_varDecl) {}
937 virtual TypeAndVariableDeclarationAST *asTypeAndVariableDeclaration() { return this; }
939 virtual void accept0(Visitor *visitor);
941 public: // attributes
942 TypeDeclarationAST *typeDecl;
943 VariableDeclarationAST *varDecl;
946 class GLSL_EXPORT InvariantDeclarationAST: public DeclarationAST
949 InvariantDeclarationAST(const QString *_name)
950 : DeclarationAST(Kind_InvariantDeclaration), name(_name) {}
952 virtual InvariantDeclarationAST *asInvariantDeclaration() { return this; }
954 virtual void accept0(Visitor *visitor);
956 public: // attributes
960 class GLSL_EXPORT InitDeclarationAST: public DeclarationAST
963 InitDeclarationAST(List<DeclarationAST *> *_decls)
964 : DeclarationAST(Kind_InitDeclaration), decls(finish(_decls)) {}
966 virtual InitDeclarationAST *asInitDeclaration() { return this; }
968 virtual void accept0(Visitor *visitor);
970 public: // attributes
971 List<DeclarationAST *> *decls;
974 class GLSL_EXPORT FunctionDeclarationAST : public DeclarationAST
977 FunctionDeclarationAST(TypeAST *_returnType, const QString *_name)
978 : DeclarationAST(Kind_FunctionDeclaration), returnType(_returnType)
979 , name(_name), params(0), body(0) {}
981 virtual FunctionDeclarationAST *asFunctionDeclaration() { return this; }
983 virtual void accept0(Visitor *visitor);
985 void finishParams() { params = finish(params); }
987 bool isPrototype() const { return body == 0; }
989 public: // attributes
992 List<ParameterDeclarationAST *> *params;