Skip to content

Commit d34ab29

Browse files
committed
BUGFIX: REFL016 suggests using nameof(Foo.get_Bar). Fix #94.
1 parent b0f5cea commit d34ab29

File tree

2 files changed

+38
-8
lines changed

2 files changed

+38
-8
lines changed

ReflectionAnalyzers.Tests/REFL016UseNameofTests/ValidCode.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,25 @@ public class Generic<T>
126126
AnalyzerAssert.Valid(Analyzer, ExpectedDiagnostic, code);
127127
}
128128

129+
[Test]
130+
public void IEnumeratorGetCurrent()
131+
{
132+
var testCode = @"
133+
namespace RoslynSandbox
134+
{
135+
using System.Collections;
136+
137+
public class Foo
138+
{
139+
public void Meh(object value)
140+
{
141+
_ = typeof(IEnumerator).GetMethod(""get_Current"");
142+
}
143+
}
144+
}";
145+
AnalyzerAssert.Valid(Analyzer, testCode);
146+
}
147+
129148
[Test]
130149
public void WhenThrowingArgumentException()
131150
{

ReflectionAnalyzers/NodeAnalzers/NameofAnalyzer.cs

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -107,12 +107,12 @@ private static bool TryGetX(InvocationExpressionSyntax invocation, SyntaxNodeAna
107107
if (invocation.Expression is MemberAccessExpressionSyntax memberAccess &&
108108
!(memberAccess.Expression is InstanceExpressionSyntax))
109109
{
110-
return invocation.TryGetTarget(KnownSymbol.Type.GetEvent, context.SemanticModel, context.CancellationToken, out getX) ||
111-
invocation.TryGetTarget(KnownSymbol.Type.GetField, context.SemanticModel, context.CancellationToken, out getX) ||
112-
invocation.TryGetTarget(KnownSymbol.Type.GetMember, context.SemanticModel, context.CancellationToken, out getX) ||
113-
invocation.TryGetTarget(KnownSymbol.Type.GetMethod, context.SemanticModel, context.CancellationToken, out getX) ||
110+
return invocation.TryGetTarget(KnownSymbol.Type.GetEvent, context.SemanticModel, context.CancellationToken, out getX) ||
111+
invocation.TryGetTarget(KnownSymbol.Type.GetField, context.SemanticModel, context.CancellationToken, out getX) ||
112+
invocation.TryGetTarget(KnownSymbol.Type.GetMember, context.SemanticModel, context.CancellationToken, out getX) ||
113+
invocation.TryGetTarget(KnownSymbol.Type.GetMethod, context.SemanticModel, context.CancellationToken, out getX) ||
114114
invocation.TryGetTarget(KnownSymbol.Type.GetNestedType, context.SemanticModel, context.CancellationToken, out getX) ||
115-
invocation.TryGetTarget(KnownSymbol.Type.GetProperty, context.SemanticModel, context.CancellationToken, out getX);
115+
invocation.TryGetTarget(KnownSymbol.Type.GetProperty, context.SemanticModel, context.CancellationToken, out getX);
116116
}
117117

118118
getX = null;
@@ -126,9 +126,20 @@ private static bool TryGetTarget(InvocationExpressionSyntax invocation, IMethodS
126126
if (GetX.TryGetTargetType(invocation, context, out var targetType, out instance))
127127
{
128128
_ = GetX.TryGetMember(getX, targetType, name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance | BindingFlags.FlattenHierarchy, GetX.AnyTypes, context, out var targetSymbol);
129-
target = targetSymbol != null
130-
? new Optional<ISymbol>(targetSymbol)
131-
: default(Optional<ISymbol>);
129+
130+
if (targetSymbol is IMethodSymbol method)
131+
{
132+
target = method.AssociatedSymbol == null
133+
? new Optional<ISymbol>(targetSymbol)
134+
: default(Optional<ISymbol>);
135+
}
136+
else
137+
{
138+
target = targetSymbol != null
139+
? new Optional<ISymbol>(targetSymbol)
140+
: default(Optional<ISymbol>);
141+
}
142+
132143
return true;
133144
}
134145

0 commit comments

Comments
 (0)