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