コード例 #1
0
 private static ExpressionSyntax GenerateCaseValueEqual(IDiscriminatedUnionCase @case, int caseValueIndex, SemanticModel semanticModel)
 {
     if (GeneratorHelpers.IsStructuralEquatableType(@case.CaseValues[caseValueIndex], semanticModel))
     {
         return(WrapEqualityWithNullGuard(@case.CaseValues[caseValueIndex], GenerateStructuralEquatableCaseValueEqual(@case.CaseValues[caseValueIndex])));
     }
     return(GenerateDefaultCaseValueEqual(@case.CaseValues[caseValueIndex]));
 }
コード例 #2
0
 private ReturnStatementSyntax GenerateReturnStatementForSingleCase(IDiscriminatedUnionCase @case, SemanticModel semanticModel)
 {
     if (@case.CaseValues.IsEmpty)
     {
         return(ReturnStatement(GeneratorHelpers.TrueExpression()));
     }
     return(ReturnStatement(GenerateCasesBinaryExpression(@case, GenerateCaseValueEqual(@case, 0, semanticModel), semanticModel, 1)));
 }
コード例 #3
0
 private static ParameterSyntax GetCaseMatchFunction(IDiscriminatedUnionCase @case, SyntaxToken generateParameterName)
 {
     return(Parameter(
                Identifier("match" + @case.Name.Text)
                )
            .WithType(
                GenericName(
                    Identifier("System.Func"),
                    TypeArgumentList(
                        SeparatedList(
                            @case.CaseValues.Select(vc => vc.Type).Concat(new[] { IdentifierName(generateParameterName) })
                            )
                        )
                    )
                ));
 }
コード例 #4
0
        private ExpressionSyntax GenerateCasesBinaryExpression(
            IDiscriminatedUnionCase @case,
            ExpressionSyntax binaryExpressionSyntax,
            SemanticModel semanticModel,
            int caseValueIndex = 0)
        {
            if (@case.CaseValues.Length <= caseValueIndex)
            {
                return(binaryExpressionSyntax);
            }

            var andExpression = BinaryExpression(
                SyntaxKind.LogicalAndExpression,
                binaryExpressionSyntax,
                GenerateCaseValueEqual(@case, caseValueIndex, semanticModel)
                );

            return(GenerateCasesBinaryExpression(@case, andExpression, semanticModel, caseValueIndex + 1));
        }
コード例 #5
0
 private ReturnStatementSyntax GenerateReturnStatement(IDiscriminatedUnionCase @case, SemanticModel semanticModel)
 {
     return(ReturnStatement(
                GenerateCasesBinaryExpression(
                    @case,
                    BinaryExpression(
                        SyntaxKind.EqualsExpression,
                        MemberAccessExpression(
                            SyntaxKind.SimpleMemberAccessExpression,
                            IdentifierName(Identifier("value")),
                            IdentifierName(Identifier(GeneratorHelpers.TagFieldName))
                            ),
                        LiteralExpression(
                            SyntaxKind.NumericLiteralExpression,
                            Literal(@case.CaseNumber)
                            )
                        ),
                    semanticModel
                    )
                ));
 }
コード例 #6
0
 public static ReturnStatementSyntax GenerateMatchReturnStatement(IDiscriminatedUnionCase currentCase)
 {
     return(ReturnStatement(
                InvocationExpression(
                    IdentifierName("match" + currentCase.Name)
                    )
                .WithArgumentList(
                    ArgumentList(
                        SeparatedList(
                            currentCase.CaseValues.Select(v =>
                                                          Argument(
                                                              MemberAccessExpression(
                                                                  SyntaxKind.SimpleMemberAccessExpression,
                                                                  ThisExpression(),
                                                                  IdentifierName(v.Name)
                                                                  )
                                                              )
                                                          )
                            )
                        )
                    )
                ));
 }