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