Example #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));
        }
Example #2
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);
        }
Example #3
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));
            }
        }
Example #4
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)));
            }
        }
Example #5
0
        protected virtual void CreateVisitStatements(MethodGenerationContext context)
        {
            string      parameterName = context.ParameterName;
            ITypeSymbol propertyType  = context.PropertyType;
            string      propertyName  = context.PropertyName;

            if (propertyType.OriginalDefinition.Equals(SyntaxListSymbol))
            {
                if (UseCustomVisitMethod)
                {
                    CreateVisitListStatements(context, isSeparatedList: false);
                }
                else
                {
                    context.AddStatement(VisitStatement("VisitList", parameterName, propertyName));
                }
            }
            else if (propertyType.OriginalDefinition.Equals(SeparatedSyntaxListSymbol))
            {
                if (UseCustomVisitMethod)
                {
                    CreateVisitListStatements(context, isSeparatedList: true);
                }
                else
                {
                    context.AddStatement(VisitStatement("VisitSeparatedList", parameterName, propertyName));
                }
            }
            else if (propertyType.Equals(SyntaxTokenListSymbol))
            {
                if (Depth >= SyntaxWalkerDepth.Token)
                {
                    context.AddStatement(VisitStatement("VisitTokenList", parameterName, propertyName));
                }
            }
            else if (propertyType.Equals(SyntaxTokenSymbol))
            {
                if (Depth >= SyntaxWalkerDepth.Token)
                {
                    context.AddStatement(VisitStatement("VisitToken", parameterName, propertyName));
                }
            }
            else if (propertyType.EqualsOrInheritsFrom(SyntaxNodeSymbol))
            {
                switch (propertyType.Name)
                {
                case "AccessorListSyntax":
                case "ArgumentListSyntax":
                case "ArrayTypeSyntax":
                case "ArrowExpressionClauseSyntax":
                case "AttributeArgumentListSyntax":
                case "AttributeTargetSpecifierSyntax":
                case "BaseListSyntax":
                case "BlockSyntax":
                case "BracketedArgumentListSyntax":
                case "BracketedParameterListSyntax":
                case "CatchDeclarationSyntax":
                case "CatchFilterClauseSyntax":
                case "ConstructorInitializerSyntax":
                case "CrefBracketedParameterListSyntax":
                case "CrefParameterListSyntax":
                case "CrefSyntax":
                case "ElseClauseSyntax":
                case "EqualsValueClauseSyntax":
                case "ExplicitInterfaceSpecifierSyntax":
                case "ExpressionSyntax":
                case "FinallyClauseSyntax":
                case "FromClauseSyntax":
                case "IdentifierNameSyntax":
                case "InitializerExpressionSyntax":
                case "InterpolationAlignmentClauseSyntax":
                case "InterpolationFormatClauseSyntax":
                case "JoinIntoClauseSyntax":
                case "MemberCrefSyntax":
                case "NameColonSyntax":
                case "NameEqualsSyntax":
                case "NameSyntax":
                case "ParameterListSyntax":
                case "ParameterSyntax":
                case "PatternSyntax":
                case "QueryBodySyntax":
                case "QueryContinuationSyntax":
                case "SelectOrGroupClauseSyntax":
                case "SimpleNameSyntax":
                case "StatementSyntax":
                case "TypeArgumentListSyntax":
                case "TypeParameterListSyntax":
                case "TypeSyntax":
                case "VariableDeclarationSyntax":
                case "VariableDesignationSyntax":
                case "WhenClauseSyntax":
                case "XmlElementEndTagSyntax":
                case "XmlElementStartTagSyntax":
                case "XmlNameSyntax":
                case "XmlPrefixSyntax":
                {
                    if (UseCustomVisitMethod)
                    {
                        CreateTypeVisitStatements(context);
                    }
                    else
                    {
                        context.AddStatement(VisitStatement("Visit", parameterName, propertyName));
                    }

                    break;
                }

                case "CSharpSyntaxNode":
                {
                    if (!UseCustomVisitMethod)
                    {
                        context.AddStatement(VisitStatement("Visit", parameterName, propertyName));
                        break;
                    }

                    if (EliminateDefaultVisit &&
                        propertyName == "Body" &&
                        context.ParameterType.InheritsFrom(Microsoft_CodeAnalysis_CSharp_Syntax_AnonymousFunctionExpressionSyntax))
                    {
                        CreateVisitAnonymousFunctionStatements(context);
                    }
                    else
                    {
                        CreateTypeVisitStatements(context);
                    }

                    break;
                }

                default:
                {
                    throw new InvalidOperationException($"Unrecognized property type '{propertyType.ToDisplayString()}'.");
                }
                }
            }
            else if (!propertyType.SpecialType.Is(SpecialType.System_Int32, SpecialType.System_Boolean))
            {
                throw new InvalidOperationException();
            }
        }