public override AstNode VisitStruct_specifier([NotNull] GLSL_ES300Parser.Struct_specifierContext context)
        {
            var result = new StructTypeSpecifier();

            if (context.Identifier() != null)
            {
                result.Identifier = new Identifier()
                {
                    Name = context.Identifier().Symbol.Text
                };
            }

            var list = context.struct_declarationlist();

            if (list != null)
            {
                foreach (var d in list.struct_declaration())
                {
                    var member    = new StructMemberDeclaration();
                    var qualifier = d.type_qualifier() != null ? (TypeQualifier)VisitType_qualifier(d.type_qualifier()) : new TypeQualifier();

                    var typeSpec = d.type_specifier();

                    if (typeSpec.precision_qualifier() != null)
                    {
                        qualifier.Precision = (PrecisionQualifier)Enum.Parse(typeof(PrecisionQualifier), typeSpec.precision_qualifier().GetText(), true);
                    }

                    var noPrecTypeSpec = typeSpec.type_specifier_noprec();
                    var typeSpecifier  = (TypeSpecifier)VisitType_specifier_nonarray(noPrecTypeSpec.type_specifier_nonarray());
                    typeSpecifier.Qualifier = qualifier;
                    member.Type             = typeSpecifier;

                    if (noPrecTypeSpec.LeftBracket() != null)
                    {
                        member.ArraySpecifier = new ArraySpecifier();

                        if (noPrecTypeSpec.constant_expression() != null)
                        {
                            member.ArraySpecifier.ArraySizeExpression = (Expression)this.Visit(noPrecTypeSpec.constant_expression());
                        }
                    }

                    var currentDeclaratorList = d.struct_declaratorlist();
                    while (currentDeclaratorList != null)
                    {
                        if (currentDeclaratorList.Identifier() != null)
                        {
                            member.Identifiers.Add(new Identifier()
                            {
                                Name = currentDeclaratorList.Identifier().Symbol.Text
                            });
                        }

                        currentDeclaratorList = currentDeclaratorList.struct_declaratorlist();
                    }

                    result.Members.Add(member);
                }
            }

            return(result);
        }
Beispiel #2
0
 /// <summary>
 /// Visit a parse tree produced by <see cref="GLSL_ES300Parser.struct_specifier"/>.
 /// <para>
 /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/>
 /// on <paramref name="context"/>.
 /// </para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 /// <return>The visitor result.</return>
 public virtual Result VisitStruct_specifier([NotNull] GLSL_ES300Parser.Struct_specifierContext context)
 {
     return(VisitChildren(context));
 }