2015-06-16 12 views
9

Obecnie pracuję nad poprawą mojego odczucia kodowania, więc zacząłem dodawać niektóre metody rozszerzenia do typów, których używam.Jak wyświetlić konkretną wskazówkę w programie Visual Studio


zorientowali się, że robię to samo działanie dość często zawsze z tymi samymi atrybutami.

chcę pokazać tę wskazówkę, gdy ktoś dzwoni ReplaceNewLine("|"):

char chcesz usunąć to |. Użyj rozszerzenia RemoveNewLine() bez żadnych atrybutów.

Próbowałem go z atrybutem [Obsolete(...)], ale to pokazano przy każdym wywołaniu funkcji.

Moje pytanie brzmi: Jak mogę wyświetlić konkretną wskazówkę w oparciu o moje dane wejściowe w Visual Studio?

Kod:

public static class StringExtension 
{ 
    public static string ReplaceNewLine(this string s) 
    { 
     return s.Replace("|", Environment.NewLine); 
    } 

    // show hint if c is | 
    public static string ReplaceNewLine(this string s, string c) 
    { 
     return s.Replace(c, Environment.NewLine); 
    } 
} 

Apposition:

  • Oczywiście wskazówka może mieć kod Obsolete (0618/CS0618), gdy zostanie wykazane, ale nie jest to dla mnie ważne . Chcę tylko pokazać podpowiedź!
  • Pracuję z C# 6.0, .NET 4.6 i Visual Studio 2015 RC.
+0

Czy wtyczka ReSharper może być rozwiązaniem? –

+0

@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

+0

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

Odpowiedz

3

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.

+0

Jeśli możesz podać przykład, odpowiedź będzie idealna! – cramopy

+0

Nie jestem królem zasad Roslyn (jeszcze), a dostarczona próba może nie być najlepsza dostępna. powinno dać ci wystarczająco dużo, aby zacząć i zadawać kolejne pytania. – jessehouwing

+0

dzięki za przykład !! : D – cramopy

-3

apostrofów

return s.Replace('|', Environment.NewLine); 
+1

Całkowicie błędnie to pytanie. – slugster

+0

czy przeczytałeś nawet pytanie? – cramopy

1

nie sądzę, że jest to możliwe, tylko z wyjątkiem

dobitny komentarz

:)

/// <summary> 
/// Replace specific char with <see cref="Environment.NewLine"/> 
/// </summary> 
/// <param name="s">input</param> 
/// <param name="c">If the char is "|", use the extension method without any parameter instead (<see cref="StringExtension.ReplaceNewLine()" />).</param> 
/// <returns>something with maybe new lines.</returns> 
public static string ReplaceNewLine(this string s, string c) {...} 

nie wiem jakikolwiek inny sposób na wytworzenie podpowiedzi w czystym Visual Studio, wi th wyjątek od #warning msg (i #pragma), ale są one warunkowane tylko przez wstępnie zdefiniowane parametry kompilacji (takie jak #IF DEBUG itp.) i przechodzą od razu do listy błędów.

Btw & tylko dla zabawy: można rozwiązać przykład przez dodanie wartości domyślnej

public static class StringExtension 
{ 
    public static string ReplaceNewLine(this string s, string c = "|") 
    { 
     return s.Replace(c, Environment.NewLine); 
    } 
} 

Edit:jessehouwing odpowiedź jest znacznie lepsza, cała ta odpowiedź była mniej lub bardziej żartować energiczne komentarze :)

+2

Uważaj przy "domyślnych ustawieniach", ponieważ są one całkiem złe. Wartość domyślna jest faktycznie kompilowana do pliku binarnego wywołującego i jeśli później zdecydujesz się na zmianę domyślną, wszystkie zestawy wywołujące tę metodę muszą zostać ponownie skompilowane, aby użyć nowej wartości. – jessehouwing

+0

Oh, wywołanie binarne? Nie wiedziałem ... –

+0

Tak, w ten sposób jest to funkcja kompilatora, a nie funkcja językowa. to jest złe** ;). – jessehouwing

Powiązane problemy