/// <summary> /// Initializes a new instance of the <see cref="EqualityComparerGenerator"/> class. /// </summary> /// <param name="copyrightNotice"> /// The copyright notice to display at the top of the file, or null if there is /// no copyright notice. /// </param> /// <param name="namespaceName"> /// The name of the namespace into which the classes generated by this object /// are to be placed. /// </param> internal EqualityComparerGenerator( string copyrightNotice, string namespaceName) { _copyrightNotice = copyrightNotice; _namespaceName = namespaceName; _localVariableNameGenerator = new LocalVariableNameGenerator(); }
/// <summary> /// Initializes a new instance of the <see cref="RewritingVisitorGenerator"/> class. /// </summary> /// <param name="copyrightNotice"> /// The copyright notice to display at the top of the file, or null if there is /// no copyright notice. /// </param> /// <param name="namespaceName"> /// The name of the namespace into which the classes generated by this object /// are to be placed. /// </param> internal RewritingVisitorGenerator( Dictionary <string, PropertyInfoDictionary> classInfoDictionary, string copyrightNotice, string namespaceName, string className, string schemaName, string kindEnumName, string nodeInterfaceName, IEnumerable <string> generatedClassNames) { _classInfoDictionary = classInfoDictionary; _copyrightNotice = copyrightNotice; _namespaceName = namespaceName; _className = className; _schemaName = schemaName; _kindEnumName = kindEnumName; _nodeInterfaceName = nodeInterfaceName; _generatedClassNames = generatedClassNames.OrderBy(gn => gn).ToList(); _localVariableNameGenerator = new LocalVariableNameGenerator(); }
private StatementSyntax[] GenerateArrayVisit( int arrayRank, int nestingLevel, ExpressionSyntax arrayValuedExpression) { ExpressionSyntax loopLimitExpression; if (nestingLevel == 0) { // node.Locations.Count loopLimitExpression = SyntaxFactory.MemberAccessExpression( SyntaxKind.SimpleMemberAccessExpression, arrayValuedExpression, SyntaxFactory.IdentifierName(CountPropertyName)); } else { // value_0.Count loopLimitExpression = SyntaxFactory.MemberAccessExpression( SyntaxKind.SimpleMemberAccessExpression, SyntaxFactory.IdentifierName( LocalVariableNameGenerator.GetCollectionElementVariableName(nestingLevel - 1)), SyntaxFactory.IdentifierName(CountPropertyName)); } var statements = new List <StatementSyntax>(); if (nestingLevel < arrayRank) { // We're not yet at the innermost level, so we need another for loop. string loopVariableName = LocalVariableNameGenerator.GetLoopIndexVariableName(nestingLevel); string outerLoopVariableName = LocalVariableNameGenerator.GetLoopIndexVariableName(nestingLevel - 1); string arrayElementVariableName = LocalVariableNameGenerator.GetCollectionElementVariableName(nestingLevel - 1); // For every level except the outermost, we need to get an array element and test whether // it's null. if (nestingLevel > 0) { // var value_0 = node.Locations[index_0]; statements.Add( SyntaxFactory.LocalDeclarationStatement( SyntaxFactory.VariableDeclaration( SyntaxHelper.Var(), SyntaxFactory.SingletonSeparatedList( SyntaxFactory.VariableDeclarator( SyntaxFactory.Identifier(arrayElementVariableName), default(BracketedArgumentListSyntax), SyntaxFactory.EqualsValueClause( SyntaxFactory.ElementAccessExpression( arrayValuedExpression, SyntaxFactory.BracketedArgumentList( SyntaxFactory.SingletonSeparatedList( SyntaxFactory.Argument( SyntaxFactory.IdentifierName(outerLoopVariableName))))))))))); } // for ForStatementSyntax forStatement = SyntaxFactory.ForStatement( // (index_0 = 0; SyntaxFactory.VariableDeclaration( SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.IntKeyword)), SyntaxFactory.SingletonSeparatedList( SyntaxFactory.VariableDeclarator(loopVariableName) .WithInitializer( SyntaxFactory.EqualsValueClause(SyntaxFactory.LiteralExpression( SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(0)))))), default(SeparatedSyntaxList <ExpressionSyntax>), // index_0 < value_0.Count; SyntaxFactory.BinaryExpression( SyntaxKind.LessThanExpression, SyntaxFactory.IdentifierName(loopVariableName), loopLimitExpression), // ++index_0) SyntaxFactory.SingletonSeparatedList <ExpressionSyntax>( SyntaxFactory.PrefixUnaryExpression( SyntaxKind.PreIncrementExpression, SyntaxFactory.IdentifierName(loopVariableName))), // { ... } SyntaxFactory.Block( GenerateArrayVisit(arrayRank, nestingLevel + 1, arrayValuedExpression))); if (nestingLevel > 0) { statements.Add( SyntaxFactory.IfStatement( SyntaxHelper.IsNotNull(arrayElementVariableName), SyntaxFactory.Block( forStatement))); } else { statements.Add(forStatement); } } else { string loopVariableName = LocalVariableNameGenerator.GetLoopIndexVariableName(nestingLevel - 1); // We're in the body of the innermost loop over array elements. This is // where we do the assignment. For arrays of rank 1, the assignment is // to an element of the property itself. For arrays of rank > 1, the // assignment is to an array element of a temporary variable representing // one of the elements of the property. ElementAccessExpressionSyntax elementAccessExpression; if (arrayRank == 1) { // node.Location[index_0] elementAccessExpression = SyntaxFactory.ElementAccessExpression( arrayValuedExpression, SyntaxFactory.BracketedArgumentList( SyntaxFactory.SingletonSeparatedList( SyntaxFactory.Argument( SyntaxFactory.IdentifierName(loopVariableName))))); } else { string arrayElementVariableName = LocalVariableNameGenerator.GetCollectionElementVariableName(nestingLevel - 2); // value_0[index_1] elementAccessExpression = SyntaxFactory.ElementAccessExpression( SyntaxFactory.IdentifierName(arrayElementVariableName), SyntaxFactory.BracketedArgumentList( SyntaxFactory.SingletonSeparatedList( SyntaxFactory.Argument( SyntaxFactory.IdentifierName(loopVariableName))))); } statements.Add( SyntaxFactory.ExpressionStatement( SyntaxFactory.AssignmentExpression( SyntaxKind.SimpleAssignmentExpression, elementAccessExpression, SyntaxFactory.InvocationExpression( SyntaxFactory.IdentifierName(VisitNullCheckedMethodName), SyntaxHelper.ArgumentList(elementAccessExpression))))); } return(statements.ToArray()); }