Skip to content

Commit ebff467

Browse files
Fall back on handling private or unknown cs symbols based on their syntax attributes
1 parent 9c19a67 commit ebff467

4 files changed

Lines changed: 23 additions & 18 deletions

File tree

CodeConverter/CSharp/ArgumentConverter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public async Task<CSharpSyntaxNode> ConvertSimpleArgumentAsync(VBSyntax.SimpleAr
3232
var baseSymbol = symbol?.OriginalDefinition.GetBaseSymbol();
3333
var possibleParameters = (CommonConversions.GetCsOriginalSymbolOrNull(baseSymbol) ?? symbol)?.GetParameters();
3434
if (possibleParameters.HasValue) {
35-
var refType = _semanticModel.GetRefConversionType(node, argList, possibleParameters.Value, out var argName, out var refKind);
35+
var refType = CommonConversions.GetRefConversionType(node, argList, possibleParameters.Value, out var argName, out var refKind);
3636
token = CommonConversions.GetRefToken(refKind);
3737
if (refType != SemanticModelExtensions.RefConversion.Inline) {
3838
convertedArgExpression = HoistByRefDeclaration(node, convertedArgExpression, refType, argName, refKind);

CodeConverter/CSharp/CommonConversions.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Linq.Expressions;
1+
using System.Collections.Immutable;
2+
using System.Linq.Expressions;
23
using System.Runtime.CompilerServices;
34
using ICSharpCode.CodeConverter.Util.FromRoslyn;
45
using Microsoft.CodeAnalysis.Classification;
@@ -669,6 +670,7 @@ public ISymbol GetCsOriginalSymbolOrNull(ISymbol symbol)
669670
symbol = symbol.OriginalDefinition;
670671
// Construct throws an exception if ConstructedFrom differs from it, so let's use ConstructedFrom directly
671672
var symbolToFind = symbol is IMethodSymbol m ? m.ConstructedFrom : symbol;
673+
// This no longer works for private members: https://github.com/dotnet/roslyn/issues/72369#issuecomment-1975066163
672674
var similarSymbol = SymbolFinder.FindSimilarSymbols(symbolToFind, _csCompilation).FirstOrDefault();
673675
return similarSymbol;
674676
}
@@ -747,6 +749,9 @@ public RefKind GetCsRefKind(IParameterSymbol vbParameter, Microsoft.CodeAnalysis
747749
return csParam.RefKind;
748750
}
749751

752+
var syntaxNodes = vbParameter?.DeclaringSyntaxReferences.Select(r => r.GetSyntax());
753+
optionalParameterSyntax ??= syntaxNodes?.OfType<VBSyntax.ParameterSyntax>().FirstOrDefault();
754+
750755
if (optionalParameterSyntax?.AttributeLists.Any(this.HasOutAttribute) == true) {
751756
return RefKind.Out;
752757
}
@@ -800,4 +805,19 @@ public async Task<CSharpSyntaxNode> WithRemovedRedundantConversionOrNullAsync(VB
800805
return writtenByUser ? null : this.TypeConversionAnalyzer.AddExplicitConversion(conversionArg, csharpArg,
801806
forceTargetType: forceTargetType, defaultToCast: true);
802807
}
808+
809+
public SemanticModelExtensions.RefConversion GetRefConversionType(VBSyntax.ArgumentSyntax node, VBSyntax.ArgumentListSyntax argList, ImmutableArray<IParameterSymbol> parameters, out string argName, out RefKind refKind)
810+
{
811+
var parameter = node.IsNamed && node is VBSyntax.SimpleArgumentSyntax sas
812+
? parameters.FirstOrDefault(p => p.Name.Equals(sas.NameColonEquals.Name.Identifier.Text, StringComparison.OrdinalIgnoreCase))
813+
: parameters.ElementAtOrDefault(argList.Arguments.IndexOf(node));
814+
if (parameter != null) {
815+
refKind = GetCsRefKind(parameter);
816+
argName = parameter.Name;
817+
} else {
818+
refKind = RefKind.None;
819+
argName = null;
820+
}
821+
return SemanticModel.NeedsVariableForArgument(node, refKind);
822+
}
803823
}

CodeConverter/CSharp/NameExpressionNodeVisitor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,7 @@ private bool RequiresLocalFunction(VBSyntax.InvocationExpressionSyntax invocatio
452452

453453
bool RequiresLocalFunction(RefConversion possibleInline, VBSyntax.InvocationExpressionSyntax invocation, IMethodSymbol invocationSymbol, VBSyntax.ArgumentSyntax a)
454454
{
455-
var refConversion = _semanticModel.GetRefConversionType(a, invocation.ArgumentList, invocationSymbol.Parameters, out string _, out _);
455+
var refConversion = CommonConversions.GetRefConversionType(a, invocation.ArgumentList, invocationSymbol.Parameters, out string _, out _);
456456
if (RefConversion.Inline == refConversion || possibleInline == refConversion) return false;
457457
if (!(a is VBSyntax.SimpleArgumentSyntax sas)) return false;
458458
var argExpression = sas.Expression.SkipIntoParens();

CodeConverter/CSharp/SemanticModelExtensions.cs

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -64,21 +64,6 @@ public static TSymbol GetSymbolInfoInDocument<TSymbol>(this SemanticModel semant
6464
return semanticModel.SyntaxTree == node.SyntaxTree ? semanticModel.GetSymbolInfo(node).ExtractBestMatch<TSymbol>() : null;
6565
}
6666

67-
public static RefConversion GetRefConversionType(this SemanticModel semanticModel, VBSyntax.ArgumentSyntax node, VBSyntax.ArgumentListSyntax argList, ImmutableArray<IParameterSymbol> parameters, out string argName, out RefKind refKind)
68-
{
69-
var parameter = node.IsNamed && node is VBSyntax.SimpleArgumentSyntax sas
70-
? parameters.FirstOrDefault(p => p.Name.Equals(sas.NameColonEquals.Name.Identifier.Text, StringComparison.OrdinalIgnoreCase))
71-
: parameters.ElementAtOrDefault(argList.Arguments.IndexOf(node));
72-
if (parameter != null) {
73-
refKind = parameter.RefKind;
74-
argName = parameter.Name;
75-
} else {
76-
refKind = RefKind.None;
77-
argName = null;
78-
}
79-
return semanticModel.NeedsVariableForArgument(node, refKind);
80-
}
81-
8267
public static RefConversion NeedsVariableForArgument(this SemanticModel semanticModel, VBasic.Syntax.ArgumentSyntax node, RefKind refKind)
8368
{
8469
if (refKind == RefKind.None) return RefConversion.Inline;

0 commit comments

Comments
 (0)