mit dem folgenden Stück Code als Beispiel sind:Feststellen, ob zwei SyntaxTokens denselben
public class Thing
{
public int Item { get; }
public Thing(int item)
{
Item = Item; // note incorrect assignment: rhs should be item, the passed-in arg, hence analyzer should warn
}
public Thing(Thing other)
{
Item = other.Item; // correct assignment, should NOT trigger analyzer
}
}
Ich bin ein Roslyn Analysator Schreiben dieser Fälle möglicher verwechselt Selbstzuweisung, relevante Abschnitte unten zu erkennen und melden :
public override void Initialize(AnalysisContext context)
{
context.RegisterSyntaxNodeAction(MistakenSelfAssignment, SyntaxKind.SimpleAssignmentExpression);
}
private static void MistakenSelfAssignment(SyntaxNodeAnalysisContext context)
{
var assignment = context.Node as AssignmentExpressionSyntax;
if (assignment == null)
{
return;
}
var leftToken = GetIdentifierToken(assignment.Left);
var rightToken = GetIdentifierToken(assignment.Right);
if (leftToken != null && leftToken.IsEquivalentTo(rightToken)) // this never works
{
var diagnostic = Diagnostic.Create(Rule, assignment.GetLocation());
context.ReportDiagnostic(diagnostic);
}
}
private static SyntaxToken GetIdentifierToken(ExpressionSyntax syntax)
{
var identifierName = syntax as IdentifierNameSyntax;
if (identifierName != null)
{
return identifierName.Identifier;
}
var identifierAccess = syntax as MemberAccessExpressionSyntax;
if (identifierAccess != null)
{
return identifierAccess.Name.Identifier;
}
return default(SyntaxToken);
}
aber ich kann, wenn die LHS und RHS der Zuordnung nicht herausfinden, wie sie bestimmen das gleiche Token sind - SyntaxToken.IsEquivalentTo
erscheint die Methode, die ich will, aber es gibt immer falsch, wie tun SyntaxToken.Equals
und ==
.
Was ist der richtige Weg zu bestimmen, ob ein Token sich auf sich selbst bezieht?
SyntaxFactory.AreEquivalent? – Marcus
@Marcus diese Art von Arbeiten, aber es gilt auch Dinge wie 'Item = other.Item' als gleichwertig, das ist nicht was ich will. Ich bin nur an Fällen interessiert, in denen einer Variablen oder Eigenschaft ein eigener Wert zugewiesen wird. –
Können Sie den gesamten zu analysierenden Code posten? Oder der Teil, bei dem der Vergleich fehlschlägt. Wenn ich mir die Implementierung anschaue, kann ich nicht erkennen, wie "IsEquivalentTo" möglicherweise genaue Ergebnisse liefert. – Marcus