Beispiel #1
0
        private void CreateVisitListSyntaxStatements(MethodGenerationContext context)
        {
            string variableName = context.CreateVariableName(context.PropertyName);

            context.AddStatement(LocalDeclarationStatement(context.PropertyType, variableName, context.ParameterName, context.PropertyName));

            IPropertySymbol listPropertySymbol = FindListPropertySymbol(context.PropertySymbol);

            ITypeSymbol typeSymbol = ((INamedTypeSymbol)listPropertySymbol.Type).TypeArguments.Single();

            IMethodSymbol methodSymbol = FindVisitMethod(typeSymbol);

            string methodName = null;

            if (methodSymbol != null)
            {
                methodName = methodSymbol.Name;
            }
            else if (EliminateDefaultVisit)
            {
                methodName = GetMethodName(typeSymbol);
            }

            StatementSyntax statement;

            if (methodName != null)
            {
                string forEachVariableName = context.CreateVariableName(typeSymbol.Name.Remove(typeSymbol.Name.Length - 6));

                statement = ForEachVisitStatement(
                    typeSymbol.Name,
                    forEachVariableName,
                    SimpleMemberAccessExpression(
                        IdentifierName(variableName),
                        IdentifierName(listPropertySymbol.Name)),
                    VisitStatement(methodName, forEachVariableName),
                    checkShouldVisit: true);
            }
            else
            {
                methodName = (SymbolEqualityComparer.Default.Equals(listPropertySymbol.Type.OriginalDefinition, SyntaxListSymbol)) ? "VisitList" : "VisitSeparatedList";

                statement = VisitStatement(methodName, variableName, listPropertySymbol.Name);
            }

            context.AddStatement(IfNotEqualsToNullStatement(variableName, statement));
        }
Beispiel #2
0
        protected virtual void CreateTypeVisitStatements(MethodGenerationContext context)
        {
            ITypeSymbol propertyType  = context.PropertyType;
            string      propertyName  = context.PropertyName;
            string      parameterName = context.ParameterName;

            IMethodSymbol methodSymbol = FindVisitMethod(propertyType);

            if (methodSymbol == null)
            {
                if (EliminateDefaultVisit)
                {
                    context.AddStatement(IfNotShouldVisitReturnStatement());

                    string variableName = context.CreateVariableName(propertyName);

                    context.AddStatement(LocalDeclarationStatement(propertyType, variableName, parameterName, propertyName));

                    string methodName = GetMethodName(propertyType);

                    IfStatementSyntax ifStatement = IfNotEqualsToNullStatement(
                        variableName,
                        VisitStatement(methodName, variableName));

                    context.AddStatement(ifStatement);
                }
                else
                {
                    context.AddStatement(VisitStatement("Visit", parameterName, propertyName));
                }
            }
            else
            {
                string variableName = context.CreateVariableName(propertyName);

                context.AddStatement(IfNotShouldVisitReturnStatement());

                context.AddStatement(LocalDeclarationStatement(propertyType, variableName, parameterName, propertyName));

                context.AddStatement(IfNotEqualsToNullStatement(variableName, VisitStatement(methodSymbol.Name, variableName)));
            }
        }
Beispiel #3
0
        private static void CreateVisitAnonymousFunctionStatements(MethodGenerationContext context)
        {
            string variableName = context.CreateVariableName(context.PropertyName);

            context.AddStatement(LocalDeclarationStatement(context.PropertyType, variableName, context.ParameterName, context.PropertyName));

            IfStatementSyntax ifStatement = IfStatement(
                IsPatternExpression(
                    IdentifierName(variableName),
                    DeclarationPattern(IdentifierName("ExpressionSyntax"), SingleVariableDesignation(Identifier("expression")))),
                Block(VisitStatement("VisitExpression", "expression")),
                ElseClause(
                    IfStatement(
                        IsPatternExpression(
                            IdentifierName(variableName),
                            DeclarationPattern(IdentifierName("StatementSyntax"), SingleVariableDesignation(Identifier("statement")))),
                        Block(VisitStatement("VisitStatement", "statement")),
                        ElseClause(Block(VisitStatement("Visit", variableName))))));

            context.AddStatement(ifStatement);
        }
Beispiel #4
0
        protected virtual void CreateVisitListStatements(MethodGenerationContext context, bool isSeparatedList)
        {
            ITypeSymbol typeSymbol = ((INamedTypeSymbol)context.PropertyType).TypeArguments.Single();

            IMethodSymbol methodSymbol = FindVisitMethod(typeSymbol);

            string methodName = null;

            if (methodSymbol != null)
            {
                methodName = methodSymbol.Name;
            }
            else if (EliminateDefaultVisit)
            {
                methodName = GetMethodName(typeSymbol);
            }

            if (methodName != null)
            {
                string typeName = typeSymbol.Name;

                string variableName = context.CreateVariableName(typeName.Remove(typeName.Length - 6));

                ForEachStatementSyntax forEachStatement = ForEachVisitStatement(
                    typeName,
                    variableName,
                    SimpleMemberAccessExpression(IdentifierName(context.ParameterName), IdentifierName(context.PropertyName)),
                    VisitStatement(methodName, variableName),
                    checkShouldVisit: true);

                context.AddStatement(forEachStatement);
            }
            else
            {
                methodName = (isSeparatedList) ? "VisitSeparatedList" : "VisitList";

                context.AddStatement(VisitStatement(methodName, context.ParameterName, context.PropertyName));
            }
        }