Skip to content

Commit e3a62ba

Browse files
Use var except when casting
1 parent bc6ee61 commit e3a62ba

File tree

4 files changed

+28
-15
lines changed

4 files changed

+28
-15
lines changed

CodeConverter/CSharp/MethodBodyExecutableStatementVisitor.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -561,7 +561,9 @@ public override async Task<SyntaxList<StatementSyntax>> VisitForEachBlock(VBSynt
561561
type = declaration.Type;
562562
id = declaration.Variables.Single().Identifier;
563563
} else if (_semanticModel.GetSymbolInfo(stmt.ControlVariable).Symbol is ISymbol varSymbol) {
564-
type = CommonConversions.GetTypeSyntax(varSymbol.GetSymbolType(), varSymbol.GetSymbolType()?.SpecialType == SpecialType.System_Object);
564+
var variableType = varSymbol.GetSymbolType();
565+
var useVar = variableType?.SpecialType == SpecialType.System_Object || _semanticModel.GetTypeInfo(stmt.Expression).ConvertedType.IsEnumerableOfExactType(variableType);
566+
type = CommonConversions.GetTypeSyntax(varSymbol.GetSymbolType(), useVar);
565567
var v = (IdentifierNameSyntax)await stmt.ControlVariable.AcceptAsync(_expressionVisitor);
566568
if (_localsToInlineInLoop.Contains(varSymbol)) {
567569
id = v.Identifier;

CodeConverter/Util/ITypeSymbolExtensions.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.ComponentModel;
44
using System.Linq;
5+
using ICSharpCode.CodeConverter.Util.FromRoslyn;
56
using Microsoft.CodeAnalysis;
67

78
namespace ICSharpCode.CodeConverter.Util
@@ -48,6 +49,20 @@ public static bool IsArrayOf(this ITypeSymbol t, SpecialType specialType)
4849
{
4950
return t is IArrayTypeSymbol ats && ats.ElementType.SpecialType == specialType;
5051
}
52+
53+
public static bool IsEnumerableOfExactType(this ITypeSymbol symbol, ITypeSymbol typeArg)
54+
{
55+
return SymbolEquivalenceComparer.Instance.Equals(GetEnumerableElementTypeOrDefault(symbol), typeArg);
56+
}
57+
58+
private static ITypeSymbol GetEnumerableElementTypeOrDefault(ITypeSymbol symbol)
59+
{
60+
if (symbol is IArrayTypeSymbol ats) return ats.ElementType;
61+
if (symbol is INamedTypeSymbol nt) return nt.Yield().Concat(nt.AllInterfaces).OfType<INamedTypeSymbol>()
62+
.OnlyOrDefault(impl => impl.MetadataName == "IEnumerable`1")
63+
?.TypeArguments.OnlyOrDefault();
64+
return null;
65+
}
5166
}
5267
}
5368

Tests/CSharp/StatementTests/LoopStatementTests.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ internal partial class TestClass
174174
{
175175
private void TestMethod(int[] values)
176176
{
177-
foreach (int v in values)
177+
foreach (var v in values)
178178
{
179179
if (v == 2)
180180
continue;
@@ -205,7 +205,7 @@ internal partial class TestClass
205205
private void TestMethod(int[] values)
206206
{
207207
var val = default(int);
208-
foreach (int currentVal in values)
208+
foreach (var currentVal in values)
209209
{
210210
val = currentVal;
211211
if (val == 2)
@@ -235,7 +235,7 @@ internal partial class TestClass
235235
{
236236
private void TestMethod(int[] values)
237237
{
238-
foreach (int val in values)
238+
foreach (var val in values)
239239
{
240240
if (val == 2)
241241
continue;
@@ -269,12 +269,12 @@ internal partial class TestClass
269269
private void TestMethod(int[] values)
270270
{
271271
int keep1 = default, keep2;
272-
foreach (int inline1 in values)
272+
foreach (var inline1 in values)
273273
{
274-
foreach (int currentKeep1 in values)
274+
foreach (var currentKeep1 in values)
275275
{
276276
keep1 = currentKeep1;
277-
foreach (int inline2 in values)
277+
foreach (var inline2 in values)
278278
{
279279
if (inline2 == 2)
280280
continue;
@@ -397,7 +397,7 @@ internal partial class Program
397397
public static void Main(string[] args)
398398
{
399399
object zs = new[] { 1, 2, 3 };
400-
foreach (object z in (IEnumerable)zs)
400+
foreach (var z in (IEnumerable)zs)
401401
Console.WriteLine(z);
402402
}
403403
}");

Tests/TestData/MultiFileCharacterization/VBToCSResults/ConvertWholeSolution/VbNetStandardLib/My Project/MyNamespace.Static.2.Designer.cs

Lines changed: 3 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)