public override void VisitStructTypeSpecifier(StructTypeSpecifier node, AstPrinterContext context)
        {
            context.Write("struct");
            if (node.Qualifier != null && node.Qualifier.HasAnyMembers())
            {
                context.Write(" ");
                this.Visit(node.Qualifier, context);
            }

            if (node.Identifier != null)
            {
                context.Write(" ");
                this.Visit(node.Identifier, context);
            }

            context.StartNewLine();
            context.Write("{");
            this.WithIndent(context, () =>
            {
                foreach (var n in node.Members)
                {
                    this.Visit(n, context);
                }
            });

            context.StartNewLine();
            context.Write("}");
        }
 public virtual void VisitStructTypeSpecifier(StructTypeSpecifier node, TContext context)
 {
     this.Visit(node.Qualifier, context);
     this.Visit(node.Identifier, context);
     foreach (var n in node.Members)
     {
         this.Visit(n, context);
     }
 }
        public override void VisitStructTypeSpecifier(StructTypeSpecifier node, CloningAstVisitorContext context)
        {
            var result = new StructTypeSpecifier()
            {
                Identifier = this.CloneNode(node.Identifier, context),
                Qualifier  = this.CloneNode(node.Qualifier, context)
            };

            this.CloneNodeCollection(node.Members, result.Members, context);
            context.Result = result;
        }
Esempio n. 4
0
        public override void VisitStructTypeSpecifier(StructTypeSpecifier node, SemanticModelBuilderContext context)
        {
            this.Visit(node.Qualifier, context);
            this.Visit(node.Identifier, context);
            this.SafeAddSymbol(node.Identifier, node.Identifier, context, SymbolKind.Type);

            context.EnterNewScope(node, true);
            foreach (var n in node.Members)
            {
                this.Visit(n, context);
            }

            context.ExitScope();
        }
        public void CanCompareStructTypeSpecifiers(string s1m1name, string s1m1type, string s2m1name, string s2m1type, bool expectedResult)
        {
            var specifier1 = new StructTypeSpecifier();
            var member1    = new StructMemberDeclaration();

            member1.Identifiers.Add(new Identifier()
            {
                Name = s1m1name
            });
            member1.Type = new TypeNameSpecifier()
            {
                Identifier = new Identifier()
                {
                    Name = s1m1type
                }
            };
            specifier1.Members.Add(member1);

            var specifier2 = new StructTypeSpecifier();
            var member2    = new StructMemberDeclaration();

            member2.Identifiers.Add(new Identifier()
            {
                Name = s2m1name
            });
            member2.Type = new TypeNameSpecifier()
            {
                Identifier = new Identifier()
                {
                    Name = s2m1type
                }
            };
            specifier2.Members.Add(member2);

            var result = AstHelper.TypeSpecifiersAreEquivalent(specifier1, specifier2);

            result.Should().Be(expectedResult);
        }
        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);
        }
Esempio n. 7
0
        private static bool StructTypeSpecifiersAreEquivalent(StructTypeSpecifier typeSpecifier1, StructTypeSpecifier typeSpecifier2, bool compareQualifier = false)
        {
            if (!IdentifiersAreEquivalent(typeSpecifier1.Identifier, typeSpecifier2.Identifier))
            {
                return(false);
            }

            if (typeSpecifier1.Members == null && typeSpecifier2.Members == null)
            {
                return(true);
            }

            if (typeSpecifier1.Members?.Count != typeSpecifier2.Members?.Count)
            {
                return(false);
            }

            if (compareQualifier && !TypeQualifiersAreEquivalent(typeSpecifier1.Qualifier, typeSpecifier2.Qualifier))
            {
                return(false);
            }

            for (var i = 0; i < typeSpecifier1.Members.Count; i++)
            {
                var member1 = typeSpecifier1.Members[i];
                var member2 = typeSpecifier2.Members[i];
                if (!ArraySpecifiersAreEquivalent(member1.ArraySpecifier, member2.ArraySpecifier))
                {
                    return(false);
                }

                if (!TypeSpecifiersAreEquivalent(member1.Type, member2.Type, compareQualifier))
                {
                    return(false);
                }

                if (member1.Identifiers.Count != member2.Identifiers.Count)
                {
                    return(false);
                }

                for (var id = 0; id < member1.Identifiers.Count; id++)
                {
                    var found = false;
                    for (var id2 = 0; id2 < member2.Identifiers.Count; id2++)
                    {
                        if (IdentifiersAreEquivalent(member1.Identifiers[id], member2.Identifiers[id2]))
                        {
                            found = true;
                            break;
                        }
                    }

                    if (!found)
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }