public void OnVisitSyntaxNode(GeneratorSyntaxContext context) { if (!(context.Node is StructDeclarationSyntax dec) || dec.AttributeLists.Count <= 0) { return; } if (UnionDefinition.TryCreate(context, dec, out var def)) { this.Definitions.Add(def); } }
public static bool TryCreate(GeneratorSyntaxContext context, StructDeclarationSyntax dec, out UnionOperatorDefinition def) { if (!UnionDefinition.TryCreate(context, dec, out var unionDef)) { def = default; return(false); } var attributes = new List <AttributeSyntax>(); foreach (var attribList in dec.AttributeLists) { foreach (var attrib in attribList.Attributes) { var name = attrib.Name.ToString(); if (string.Equals(name, "UnionOperator") || string.Equals(name, "UnionOperatorAttribute")) { attributes.Add(attrib); break; } } } if (attributes.Count < 1) { def = default; return(false); } var operators = new List <Operator>(); var operatorSet = new HashSet <Op>(); var operatorList = new List <Op>(); foreach (var attribute in attributes) { var operandTypeHandling = OperandTypeHandling.Implicit; foreach (var arg in attribute.ArgumentList.Arguments) { if (!(arg.Expression is MemberAccessExpressionSyntax memberAccess)) { continue; } var memberName = memberAccess.Expression.ToString(); if (string.Equals(memberName, nameof(Op))) { if (Enum.TryParse <Op>(memberAccess.Name.ToString(), true, out var value) && !operatorSet.Contains(value)) { operatorSet.Add(value); operatorList.Add(value); } } else if (string.Equals(memberName, nameof(OperandTypeHandling))) { if (Enum.TryParse <OperandTypeHandling>(memberAccess.Name.ToString(), true, out var value)) { operandTypeHandling = value; } } } foreach (var op in operatorList) { operators.Add(new Operator(op, operandTypeHandling)); } operatorList.Clear(); } if (operators.Count < 1) { def = default; return(false); } def = new UnionOperatorDefinition { UnionDefinition = unionDef }; for (var i = 0; i < operators.Count; i++) { def.Operators.Add(operators[i]); } return(true); }