W Visual Studio 2015 jest to możliwe przy użyciu Roslyn Diagnostic (i opcjonalnej poprawki). Nowy edytor kodu Visual Studio 2015 wykorzystuje Roslyn pod maską, aby zrobić wszystko, co parsuje, a teraz bazuje na nim silnik Code Analayis, Metrics and Refactoring.
Przykładowa implementacja takiej kontroli to given on the Roslyn github page. Pełna implementacja byłaby nieco odpowiednia dla odpowiedzi tutaj na StackOverflow, ponieważ pociąga za sobą kilka kroków do przejścia i stanowi kompletny samouczek, ale ten pełny samouczek z something similar is given here. i może być podstawą do twojej pracy. (zadaj dodatkowe pytania później). Kod dla standard rules that ship with the product can be found in the Roslyn GitHub as well.
Ten fragment kodu powinien Ci bardzo przybliżyć, ale nie przetestowałem go. Tworzenie standardowej diagnostyki & poprawkę według totorial Roslyn SDK i wymienić Initialize
i AnalyzeNode
metod z (Wymień nazw z własnym):
public override void Initialize(AnalysisContext context)
{
context.RegisterSyntaxNodeAction(AnalyzeSyntaxNode, SyntaxKind.InvocationExpression);
}
private void AnalyzeSyntaxNode(SyntaxNodeAnalysisContext context)
{
InvocationExpressionSyntax invocationExpression = context.Node as InvocationExpressionSyntax;
IMethodSymbol methodSymbol = context.SemanticModel.GetSymbolInfo(invocationExpression).Symbol as IMethodSymbol;
if (
methodSymbol != null
&& methodSymbol.Name == "ReplaceNewline"
&& methodSymbol.ContainingNamespace.Name == "MySampleFix"
&& methodSymbol.OriginalDefinition.Parameters.Length == 1)
{
if (invocationExpression.ArgumentList.Arguments.Count() == 1)
{
LiteralExpressionSyntax arg =
invocationExpression.ArgumentList.Arguments[0].Expression as LiteralExpressionSyntax;
if (arg != null && arg.Token.ValueText == "|")
{
Diagnostic.Create(Rule, invocationExpression.GetLocation());
}
}
}
}
Jeśli chcesz, aby coś, co jest wstecznie kompatybilny ze starszymi wersjami programu Visual Studio możesz wybrać niestandardową regułę analizy kodu. Ten example rule pobiera dane wejściowe do wywołania Regex.Match
i Regex.Replace
i wyświetla ostrzeżenie, gdy nie zostanie skompilowane. Byłoby jeszcze łatwiej dać ostrzeżenie, gdy jest to stały ciąg.
Rozszerzenia programów graficznych, takie jak Resharper i CodeRush, oferują pakiet SDK, który może działać podobnie do FxCop, ale osadza się w IDE, tak jak robi to Roslyn. Może to być opcja, aby przyjąć takie podejście.
Jeśli chcesz coś w edytorze kodu, który nie używa żadnego rozszerzenia lub dostosowywania, dodanie do kodeka <remark />
to tyle, ile możesz zrobić. W najgorszym przypadku można zastosować metodę Debug.Assert(input != "|");
, dzięki czemu programiści otrzymają wczesne ostrzeżenie (w czasie programowania/debugowania), że nieprawidłowo używają interfejsu API.
Czy wtyczka ReSharper może być rozwiązaniem? –
@Thomas Nie, przepraszam, ale wtyczka ReSharper nie będzie odpowiednim rozwiązaniem dla mnie, ponieważ go nie używam. Powinno to zostać wykonane całkowicie za pomocą kodu w Visual Studio bez dodawania/instalowania jakichkolwiek dodatkowych programów. Ale i tak dziękuję ... – cramopy
Czy próbowałeś użyć metody Wrappera wokół 2 prywatnych metod, jednej, która jest przestarzała, ale zostaje wywołana tylko, jeśli wejście to "|"? – Eris