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