@@ -70,11 +70,15 @@ public static RefConversion NeedsVariableForArgument(this SemanticModel semantic
7070 if ( ! ( node is VBSyntax . SimpleArgumentSyntax sas ) || sas is { Expression : VBSyntax . ParenthesizedExpressionSyntax } ) return RefConversion . PreAssigment ;
7171 var expression = sas . Expression ;
7272
73- return GetRefConversion ( expression ) ;
73+ return semanticModel . GetRefConversionForExpression ( expression ) ;
7474
75- RefConversion GetRefConversion ( VBSyntax . ExpressionSyntax expression )
75+ }
76+
77+ public static RefConversion GetRefConversionForExpression ( this SemanticModel semanticModel , VBasic . Syntax . ExpressionSyntax expression )
78+ {
79+ RefConversion GetRefConversion ( VBSyntax . ExpressionSyntax expr )
7680 {
77- var symbolInfo = semanticModel . GetSymbolInfoInDocument < ISymbol > ( expression ) ;
81+ var symbolInfo = semanticModel . GetSymbolInfoInDocument < ISymbol > ( expr ) ;
7882 if ( symbolInfo is IPropertySymbol { ReturnsByRef : false , ReturnsByRefReadonly : false } propertySymbol ) {
7983 // a property in VB.NET code can be ReturnsByRef if it's defined in a C# assembly the VB.NET code references
8084 return propertySymbol . IsReadOnly ? RefConversion . PreAssigment : RefConversion . PreAndPostAssignment ;
@@ -87,10 +91,10 @@ RefConversion GetRefConversion(VBSyntax.ExpressionSyntax expression)
8791
8892 if ( DeclaredInUsing ( symbolInfo ) ) return RefConversion . PreAssigment ;
8993
90- if ( expression is VBasic . Syntax . IdentifierNameSyntax || expression is VBSyntax . MemberAccessExpressionSyntax ||
91- IsRefArrayAcces ( expression ) ) {
94+ if ( expr is VBasic . Syntax . IdentifierNameSyntax || expr is VBSyntax . MemberAccessExpressionSyntax ||
95+ IsRefArrayAcces ( expr ) ) {
9296
93- var typeInfo = semanticModel . GetTypeInfo ( expression ) ;
97+ var typeInfo = semanticModel . GetTypeInfo ( expr ) ;
9498 bool isTypeMismatch = typeInfo . Type == null || ! typeInfo . Type . Equals ( typeInfo . ConvertedType , SymbolEqualityComparer . IncludeNullability ) ;
9599
96100 if ( isTypeMismatch ) {
@@ -103,9 +107,9 @@ RefConversion GetRefConversion(VBSyntax.ExpressionSyntax expression)
103107 return RefConversion . PreAssigment ;
104108 }
105109
106- bool IsRefArrayAcces ( VBSyntax . ExpressionSyntax expression )
110+ bool IsRefArrayAcces ( VBSyntax . ExpressionSyntax expr )
107111 {
108- if ( ! ( expression is VBSyntax . InvocationExpressionSyntax ies ) ) return false ;
112+ if ( ! ( expr is VBSyntax . InvocationExpressionSyntax ies ) ) return false ;
109113 var op = semanticModel . GetOperation ( ies ) ;
110114 return ( op . IsArrayElementAccess ( ) || IsReturnsByRefPropertyElementAccess ( op ) )
111115 && GetRefConversion ( ies . Expression ) == RefConversion . Inline ;
@@ -117,6 +121,8 @@ static bool IsReturnsByRefPropertyElementAccess(IOperation op)
117121 && ( prop . ReturnsByRef || prop . ReturnsByRefReadonly ) ;
118122 }
119123 }
124+
125+ return GetRefConversion ( ( VBSyntax . ExpressionSyntax ) expression ) ;
120126 }
121127
122128 private static bool DeclaredInUsing ( ISymbol symbolInfo )
0 commit comments