Skip to content

Commit 47fcfc9

Browse files
committed
Fix method IsTypeObvious and add tests (RCS1010)
1 parent 175a623 commit 47fcfc9

2 files changed

Lines changed: 53 additions & 10 deletions

File tree

src/CSharp/CSharp/CSharpTypeAnalysis.cs

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -286,18 +286,29 @@ public static bool IsTypeObvious(ExpressionSyntax expression, ITypeSymbol typeSy
286286
}
287287
case SyntaxKind.InvocationExpression:
288288
{
289-
if (typeSymbol != null
290-
&& ((InvocationExpressionSyntax)expression).Expression.IsKind(SyntaxKind.SimpleMemberAccessExpression))
289+
if (typeSymbol != null)
291290
{
292-
ISymbol symbol = semanticModel.GetSymbol(expression, cancellationToken);
293-
294-
if (symbol?.IsStatic == true
295-
&& string.Equals(symbol.Name, "Parse", StringComparison.Ordinal)
296-
&& SymbolEqualityComparer.IncludeNullability.Equals(
297-
((IMethodSymbol)symbol).ReturnType,
298-
typeSymbol))
291+
var invocationExpression = (InvocationExpressionSyntax)expression;
292+
if (invocationExpression.Expression.IsKind(SyntaxKind.SimpleMemberAccessExpression))
299293
{
300-
return true;
294+
ISymbol symbol = semanticModel.GetSymbol(expression, cancellationToken);
295+
296+
if (symbol?.IsStatic == true
297+
&& string.Equals(symbol.Name, "Parse", StringComparison.Ordinal)
298+
&& SymbolEqualityComparer.IncludeNullability.Equals(
299+
((IMethodSymbol)symbol).ReturnType,
300+
typeSymbol))
301+
{
302+
var simpleMemberAccess = (MemberAccessExpressionSyntax)invocationExpression.Expression;
303+
304+
ISymbol symbol2 = semanticModel.GetSymbol(simpleMemberAccess.Expression, cancellationToken);
305+
306+
if (SymbolEqualityComparer.Default.Equals(symbol2, typeSymbol)
307+
&& semanticModel.GetAliasInfo(simpleMemberAccess.Expression, cancellationToken) == null)
308+
{
309+
return true;
310+
}
311+
}
301312
}
302313
}
303314

src/Tests/Analyzers.Tests/RCS1010UseVarInsteadOfExplicitTypeWhenTypeIsObviousTests.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,38 @@ void M()
213213
}
214214
}
215215
}
216+
");
217+
}
218+
219+
[Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.UseVarInsteadOfExplicitTypeWhenTypeIsObvious)]
220+
public async Task TestNoDiagnostic_ParseMethod()
221+
{
222+
await VerifyNoDiagnosticAsync(@"
223+
class C
224+
{
225+
void M()
226+
{
227+
string x = C.Parse("""");
228+
}
229+
230+
static string Parse(string value) => null;
231+
}
232+
");
233+
}
234+
235+
[Fact, Trait(Traits.Analyzer, DiagnosticIdentifiers.UseVarInsteadOfExplicitTypeWhenTypeIsObvious)]
236+
public async Task TestNoDiagnostic_ParseMethod2()
237+
{
238+
await VerifyNoDiagnosticAsync(@"
239+
using I = System.Int32;
240+
241+
class C
242+
{
243+
void M()
244+
{
245+
int x = I.Parse("""");
246+
}
247+
}
216248
");
217249
}
218250
}

0 commit comments

Comments
 (0)