Skip to content

Commit 785ee54

Browse files
Pull out some common metadata types
1 parent c7dcfd9 commit 785ee54

File tree

4 files changed

+36
-15
lines changed

4 files changed

+36
-15
lines changed

CodeConverter/CSharp/CommonConversions.cs

+4-3
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ namespace ICSharpCode.CodeConverter.CSharp;
2020

2121
internal class CommonConversions
2222
{
23-
public ITypeSymbol System_Linq_Expressions_Expression_T { get; }
2423
private static readonly Type ExtensionAttributeType = typeof(ExtensionAttribute);
2524
public Document Document { get; }
2625
public SemanticModel SemanticModel { get; }
@@ -49,9 +48,11 @@ public CommonConversions(Document document, SemanticModel semanticModel,
4948
_typeContext = typeContext;
5049
VisualBasicEqualityComparison = visualBasicEqualityComparison;
5150
WinformsConversions = new WinformsConversions(typeContext);
52-
System_Linq_Expressions_Expression_T = semanticModel.Compilation.GetTypeByMetadataName("System.Linq.Expressions.Expression`1");
51+
KnownTypes = new KnownNamedTypes(semanticModel);
5352
}
5453

54+
public KnownNamedTypes KnownTypes { get; }
55+
5556
public record VariablePair(CSSyntax.VariableDeclaratorSyntax CsVar, VBSyntax.ModifiedIdentifierSyntax VbVar);
5657
public record VariablesDeclaration(CSSyntax.VariableDeclarationSyntax Decl, ITypeSymbol Type, List<VariablePair> Variables);
5758

@@ -756,5 +757,5 @@ public bool IsLinqDelegateExpression(VisualBasicSyntaxNode node)
756757
return false;
757758
}
758759

759-
private bool IsLinqDelegateExpression(ITypeSymbol convertedType) => System_Linq_Expressions_Expression_T?.Equals(convertedType?.OriginalDefinition, SymbolEqualityComparer.Default) == true;
760+
private bool IsLinqDelegateExpression(ITypeSymbol convertedType) =>KnownTypes.System_Linq_Expressions_Expression_T?.Equals(convertedType?.OriginalDefinition, SymbolEqualityComparer.Default) == true;
760761
}

CodeConverter/CSharp/ExpressionNodeVisitor.cs

+7-7
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ internal class ExpressionNodeVisitor : VBasic.VisualBasicSyntaxVisitor<Task<CSha
3535
private readonly QueryConverter _queryConverter;
3636
private readonly Lazy<IReadOnlyDictionary<ITypeSymbol, string>> _convertMethodsLookupByReturnType;
3737
private readonly LambdaConverter _lambdaConverter;
38-
private readonly INamedTypeSymbol _vbBooleanTypeSymbol;
3938
private readonly VisualBasicNullableExpressionsConverter _visualBasicNullableTypesConverter;
4039
private readonly Dictionary<string, Stack<(SyntaxNode Scope, string TempName)>> _tempNameForAnonymousScope = new();
4140
private readonly HashSet<string> _generatedNames = new(StringComparer.OrdinalIgnoreCase);
@@ -58,7 +57,6 @@ public ExpressionNodeVisitor(SemanticModel semanticModel,
5857
// If this isn't needed, the assembly with Conversions may not be referenced, so this must be done lazily
5958
_convertMethodsLookupByReturnType =
6059
new Lazy<IReadOnlyDictionary<ITypeSymbol, string>>(() => CreateConvertMethodsLookupByReturnType(semanticModel));
61-
_vbBooleanTypeSymbol = _semanticModel.Compilation.GetTypeByMetadataName("System.Boolean");
6260
}
6361

6462
private static IReadOnlyDictionary<ITypeSymbol, string> CreateConvertMethodsLookupByReturnType(
@@ -775,7 +773,7 @@ public override async Task<CSharpSyntaxNode> VisitBinaryConditionalExpression(VB
775773
public override async Task<CSharpSyntaxNode> VisitTernaryConditionalExpression(VBasic.Syntax.TernaryConditionalExpressionSyntax node)
776774
{
777775
var condition = await node.Condition.AcceptAsync<ExpressionSyntax>(TriviaConvertingExpressionVisitor);
778-
condition = CommonConversions.TypeConversionAnalyzer.AddExplicitConversion(node.Condition, condition, forceTargetType: _vbBooleanTypeSymbol);
776+
condition = CommonConversions.TypeConversionAnalyzer.AddExplicitConversion(node.Condition, condition, forceTargetType: CommonConversions.KnownTypes.Boolean);
779777

780778
var whenTrue = await node.WhenTrue.AcceptAsync<ExpressionSyntax>(TriviaConvertingExpressionVisitor);
781779
whenTrue = CommonConversions.TypeConversionAnalyzer.AddExplicitConversion(node.WhenTrue, whenTrue);
@@ -900,7 +898,7 @@ private async Task<CSharpSyntaxNode> ConvertBinaryExpressionAsync(VBasic.Syntax.
900898
omitConversion = lhsTypeInfo.Type.SpecialType == SpecialType.System_String ||
901899
rhsTypeInfo.Type.SpecialType == SpecialType.System_String;
902900
if (lhsTypeInfo.ConvertedType.SpecialType != SpecialType.System_String) {
903-
forceLhsTargetType = _semanticModel.Compilation.GetTypeByMetadataName("System.String");
901+
forceLhsTargetType = CommonConversions.KnownTypes.String;
904902
}
905903
}
906904
}
@@ -938,6 +936,8 @@ private async Task<CSharpSyntaxNode> ConvertBinaryExpressionAsync(VBasic.Syntax.
938936
return node.Parent.IsKind(VBasic.SyntaxKind.SimpleArgument) ? exp : exp.AddParens();
939937
}
940938

939+
940+
941941
private async Task<ExpressionSyntax> RewriteBinaryOperatorOrNullAsync(VBSyntax.BinaryExpressionSyntax node) =>
942942
await _operatorConverter.ConvertRewrittenBinaryOperatorOrNullAsync(node, TriviaConvertingExpressionVisitor.IsWithinQuery);
943943

@@ -1837,7 +1837,7 @@ private ArgumentSyntax CreateOptionalRefArg(IParameterSymbol p, RefKind refKind)
18371837

18381838
bool HasOptionalAttribute(IParameterSymbol p)
18391839
{
1840-
var optionalAttribute = _semanticModel.Compilation.GetTypeByMetadataName("System.Runtime.InteropServices.OptionalAttribute");
1840+
var optionalAttribute = CommonConversions.KnownTypes.OptionalAttribute;
18411841
if (optionalAttribute == null) {
18421842
return false;
18431843
}
@@ -1849,7 +1849,7 @@ bool TryGetDefaultParameterValueAttributeValue(IParameterSymbol p, out object de
18491849
{
18501850
defaultValue = null;
18511851

1852-
var defaultParameterValueAttribute = _semanticModel.Compilation.GetTypeByMetadataName("System.Runtime.InteropServices.DefaultParameterValueAttribute");
1852+
var defaultParameterValueAttribute = CommonConversions.KnownTypes.DefaultParameterValueAttribute;
18531853
if (defaultParameterValueAttribute == null) {
18541854
return false;
18551855
}
@@ -1941,7 +1941,7 @@ private ISymbol GetInvocationSymbol(SyntaxNode invocation)
19411941
(VBSyntax.InvocationExpressionSyntax e) => _semanticModel.GetSymbolInfo(e).ExtractBestMatch<ISymbol>(),
19421942
(VBSyntax.ObjectCreationExpressionSyntax e) => _semanticModel.GetSymbolInfo(e).ExtractBestMatch<ISymbol>(),
19431943
(VBSyntax.RaiseEventStatementSyntax e) => _semanticModel.GetSymbolInfo(e.Name).ExtractBestMatch<ISymbol>(),
1944-
(VBSyntax.MidExpressionSyntax _) => _semanticModel.Compilation.GetTypeByMetadataName("Microsoft.VisualBasic.CompilerServices.StringType")?.GetMembers("MidStmtStr").FirstOrDefault(),
1944+
(VBSyntax.MidExpressionSyntax _) => CommonConversions.KnownTypes.VbCompilerStringType?.GetMembers("MidStmtStr").FirstOrDefault(),
19451945
_ => throw new NotSupportedException());
19461946
return symbol;
19471947
}
+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
namespace ICSharpCode.CodeConverter.CSharp;
2+
3+
internal class KnownNamedTypes
4+
{
5+
public KnownNamedTypes(SemanticModel semanticModel)
6+
{
7+
Boolean = semanticModel.Compilation.GetTypeByMetadataName("System.Boolean");
8+
String = semanticModel.Compilation.GetTypeByMetadataName("System.String");
9+
DefaultParameterValueAttribute = semanticModel.Compilation.GetTypeByMetadataName("System.Runtime.InteropServices.DefaultParameterValueAttribute");
10+
OptionalAttribute = semanticModel.Compilation.GetTypeByMetadataName("System.Runtime.InteropServices.OptionalAttribute");
11+
System_Linq_Expressions_Expression_T = semanticModel.Compilation.GetTypeByMetadataName("System.Linq.Expressions.Expression`1");
12+
VbCompilerStringType = semanticModel.Compilation.GetTypeByMetadataName("Microsoft.VisualBasic.CompilerServices.StringType");
13+
}
14+
15+
public INamedTypeSymbol System_Linq_Expressions_Expression_T { get; set; }
16+
17+
public INamedTypeSymbol Boolean { get; }
18+
public INamedTypeSymbol String { get; }
19+
public INamedTypeSymbol DefaultParameterValueAttribute { get; }
20+
public INamedTypeSymbol OptionalAttribute { get; }
21+
public INamedTypeSymbol VbCompilerStringType { get; }
22+
}

CodeConverter/CSharp/MethodBodyExecutableStatementVisitor.cs

+3-5
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ internal class MethodBodyExecutableStatementVisitor : VBasic.VisualBasicSyntaxVi
2424
private readonly HashSet<string> _extraUsingDirectives;
2525
private readonly HandledEventsAnalysis _handledEventsAnalysis;
2626
private readonly HashSet<string> _generatedNames = new();
27-
private readonly INamedTypeSymbol _vbBooleanTypeSymbol;
2827
private readonly HashSet<ILocalSymbol> _localsToInlineInLoop;
2928
private readonly PerScopeState _perScopeState;
3029

@@ -65,7 +64,6 @@ private MethodBodyExecutableStatementVisitor(VisualBasicSyntaxNode methodNode, S
6564
_perScopeState = typeContext.PerScopeState;
6665
var byRefParameterVisitor = new PerScopeStateVisitorDecorator(this, _perScopeState, semanticModel, _generatedNames);
6766
CommentConvertingVisitor = new CommentConvertingMethodBodyVisitor(byRefParameterVisitor);
68-
_vbBooleanTypeSymbol = _semanticModel.Compilation.GetTypeByMetadataName("System.Boolean");
6967
_localsToInlineInLoop = localsToInlineInLoop;
7068
}
7169

@@ -520,7 +518,7 @@ await node.Name.AcceptAsync<NameSyntax>(_expressionVisitor),
520518
public override async Task<SyntaxList<StatementSyntax>> VisitSingleLineIfStatement(VBSyntax.SingleLineIfStatementSyntax node)
521519
{
522520
var condition = await node.Condition.AcceptAsync<ExpressionSyntax>(_expressionVisitor);
523-
condition = CommonConversions.TypeConversionAnalyzer.AddExplicitConversion(node.Condition, condition, forceTargetType: _vbBooleanTypeSymbol);
521+
condition = CommonConversions.TypeConversionAnalyzer.AddExplicitConversion(node.Condition, condition, forceTargetType: CommonConversions.KnownTypes.Boolean);
524522
var block = SyntaxFactory.Block(await ConvertStatementsAsync(node.Statements));
525523
ElseClauseSyntax elseClause = null;
526524

@@ -534,7 +532,7 @@ public override async Task<SyntaxList<StatementSyntax>> VisitSingleLineIfStateme
534532
public override async Task<SyntaxList<StatementSyntax>> VisitMultiLineIfBlock(VBSyntax.MultiLineIfBlockSyntax node)
535533
{
536534
var condition = await node.IfStatement.Condition.AcceptAsync<ExpressionSyntax>(_expressionVisitor);
537-
condition = CommonConversions.TypeConversionAnalyzer.AddExplicitConversion(node.IfStatement.Condition, condition, forceTargetType: _vbBooleanTypeSymbol);
535+
condition = CommonConversions.TypeConversionAnalyzer.AddExplicitConversion(node.IfStatement.Condition, condition, forceTargetType: CommonConversions.KnownTypes.Boolean);
538536
var block = SyntaxFactory.Block(await ConvertStatementsAsync(node.Statements));
539537

540538
var elseClause = await ConvertElseClauseAsync(node.ElseBlock);
@@ -553,7 +551,7 @@ public override async Task<SyntaxList<StatementSyntax>> VisitMultiLineIfBlock(VB
553551
{
554552
var elseBlock = SyntaxFactory.Block(await ConvertStatementsAsync(elseIf.Statements));
555553
var elseIfCondition = await elseIf.ElseIfStatement.Condition.AcceptAsync<ExpressionSyntax>(_expressionVisitor);
556-
elseIfCondition = CommonConversions.TypeConversionAnalyzer.AddExplicitConversion(elseIf.ElseIfStatement.Condition, elseIfCondition, forceTargetType: _vbBooleanTypeSymbol);
554+
elseIfCondition = CommonConversions.TypeConversionAnalyzer.AddExplicitConversion(elseIf.ElseIfStatement.Condition, elseIfCondition, forceTargetType: CommonConversions.KnownTypes.Boolean);
557555
return (elseIfCondition, elseBlock);
558556
}
559557

0 commit comments

Comments
 (0)