Skip to content

Commit 3c835c6

Browse files
Better implementation for inferring types
1 parent 2b83ea5 commit 3c835c6

2 files changed

Lines changed: 41 additions & 7 deletions

File tree

ICSharpCode.CodeConverter/CSharp/ExpressionNodeVisitor.cs

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Collections.Immutable;
34
using System.Linq;
45
using System.Linq.Expressions;
56
using System.Threading.Tasks;
@@ -975,14 +976,27 @@ public override async Task<CSharpSyntaxNode> VisitGenericName(VBasic.Syntax.Gene
975976
private async Task<SimpleNameSyntax> GenericNameAccountingForReducedParameters(VBSyntax.GenericNameSyntax node, ISymbol symbol)
976977
{
977978
SyntaxToken convertedIdentifier = ConvertIdentifier(node.Identifier);
978-
var typeArgumentListSyntax = (TypeArgumentListSyntax)await node.TypeArgumentList.AcceptAsync(TriviaConvertingVisitor);
979979
if (symbol.IsReducedTypeParameterMethod()) {
980-
var commentedText = "/* " + typeArgumentListSyntax.ToFullString() + " */";
981-
var trailingTrivia = SyntaxFactory.Comment(commentedText);
982-
return SyntaxFactory.IdentifierName(convertedIdentifier).WithTrailingTrivia(trailingTrivia);
980+
if (symbol is IMethodSymbol vbMethod && CommonConversions.GetCsOriginalSymbolOrNull(symbol) is IMethodSymbol csSymbolWithInferredTypeParametersSet) {
981+
var argSubstitutions = vbMethod.TypeParameters
982+
.Zip(vbMethod.TypeArguments, (parameter, arg) => (parameter, arg))
983+
.ToDictionary(x => x.parameter.Name, x => x.arg);
984+
var allTypeArgs = csSymbolWithInferredTypeParametersSet.GetTypeArguments()
985+
.Select(a => a.Kind == SymbolKind.TypeParameter && argSubstitutions.TryGetValue(a.Name, out var t) ? t : a).ToArray();
986+
return (SimpleNameSyntax)CommonConversions.CsSyntaxGenerator.GenericName(convertedIdentifier.Text, allTypeArgs);
987+
}
988+
var commentedText = "/* " + (await ConvertTypeArgumentList(node)).ToFullString() + " */";
989+
var error = SyntaxFactory.ParseLeadingTrivia($"#error Conversion error: Could not convert all type parameters, so they've been commented out. Inferred type may be different{Environment.NewLine}");
990+
var partialConversion = SyntaxFactory.Comment(commentedText);
991+
return SyntaxFactory.IdentifierName(convertedIdentifier).WithPrependedLeadingTrivia(error).WithTrailingTrivia(partialConversion);
983992
}
984993

985-
return SyntaxFactory.GenericName(convertedIdentifier, typeArgumentListSyntax);
994+
return SyntaxFactory.GenericName(convertedIdentifier, await ConvertTypeArgumentList(node));
995+
}
996+
997+
private async Task<TypeArgumentListSyntax> ConvertTypeArgumentList(VBSyntax.GenericNameSyntax node)
998+
{
999+
return (TypeArgumentListSyntax)await node.TypeArgumentList.AcceptAsync(TriviaConvertingVisitor);
9861000
}
9871001

9881002
public override async Task<CSharpSyntaxNode> VisitTypeArgumentList(VBasic.Syntax.TypeArgumentListSyntax node)

Tests/CSharp/ExpressionTests.cs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -880,7 +880,7 @@ public void Foo()
880880
}
881881

882882
[Fact]
883-
public async Task ReducedTypeParametersCommented()
883+
public async Task ReducedTypeParametersInferrable()
884884
{
885885
await TestConversionVisualBasicToCSharp(@"Imports System.Linq
886886
@@ -894,7 +894,27 @@ public partial class Class1
894894
{
895895
public void Foo()
896896
{
897-
var y = """".Split(',').Select/* <string> */(x => x);
897+
var y = """".Split(',').Select(x => x);
898+
}
899+
}");
900+
}
901+
902+
[Fact]
903+
public async Task ReducedTypeParametersNonInferrable()
904+
{
905+
await TestConversionVisualBasicToCSharp(@"Imports System.Linq
906+
907+
Public Class Class1
908+
Sub Foo()
909+
Dim y = """".Split("",""c).Select(Of Object)(Function(x) x)
910+
End Sub
911+
End Class", @"using System.Linq;
912+
913+
public partial class Class1
914+
{
915+
public void Foo()
916+
{
917+
var y = """".Split(',').Select<string, object>(x => x);
898918
}
899919
}");
900920
}

0 commit comments

Comments
 (0)