public void AddCast( ISyntaxFacts syntaxFacts, SemanticModel semanticModel, SyntaxEditor editor, TForEachStatementSyntax forEachStatement, CancellationToken cancellationToken) { var expression = syntaxFacts.GetExpressionOfForeachStatement(forEachStatement); var loopOperation = (IForEachLoopOperation)semanticModel.GetRequiredOperation(forEachStatement, cancellationToken); var variableDeclarator = (IVariableDeclaratorOperation)loopOperation.LoopControlVariable; var enumerableType = semanticModel.Compilation.GetBestTypeByMetadataName(typeof(Enumerable).FullName !); // These were already verified to be non-null in the analyzer. Contract.ThrowIfNull(variableDeclarator.Symbol.Type); Contract.ThrowIfNull(enumerableType); var elementType = GetForEachElementType(semanticModel, forEachStatement); var conversion = semanticModel.Compilation.ClassifyCommonConversion(elementType, variableDeclarator.Symbol.Type); var rewritten = GetRewrittenCollection(editor.Generator, expression, variableDeclarator.Symbol.Type, conversion); // Add an annotation for System.Linq.Enumerable so that we add a `using System.Linq;` if not present. rewritten = rewritten.WithAdditionalAnnotations( Simplifier.Annotation, Simplifier.AddImportsAnnotation, SymbolAnnotation.Create(enumerableType)); editor.ReplaceNode(expression, rewritten); }