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); }
/// <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)); }