2015-06-16 3 views
9

В настоящее время я работаю над улучшением моего восприятия кодирования, поэтому я начал добавлять некоторые методы расширения к типам, которые я использую.Как показать конкретную подсказку в Visual Studio


Я выяснил, что я делаю то же действие довольно часто всегда с одинаковыми атрибутами.

Я хочу, чтобы показать эту подсказку, когда кто-то звонит ReplaceNewLine("|"):

полукокса вы хотите удалить это |. Используйте расширение RemoveNewLine() без каких-либо атрибутов.

Я попробовал его с атрибутом [Obsolete(...)], но это показывалось каждый раз, когда я вызывал функцию.

Мой вопрос: Как я могу показать конкретный намек, основанный на моем входе в Visual Studio?

Код:

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); 
    } 
} 

прикладывание:

  • Конечно намек может иметь Obsolete код (0618/CS0618), когда он показан, но это не важно для меня , Я просто хочу показать подсказку!
  • Я работаю с C# 6.0, .NET 4.6 и Visual Studio 2015 RC.
+0

Может ли плагин ReSharper быть решением? –

+0

@ Томас Нет, извините, но плагин ReSharper не будет подходящим решением для меня, поскольку я его не использую. Это должно быть сделано полностью с кодом в Visual Studio без добавления/установки каких-либо дополнительных программ. Но спасибо в любом случае ... – cramopy

+0

Вы пробовали использовать метод Wrapper около 2 частных методов, один из которых устарел, но только вызывается, если вход «|»? – Eris

ответ

3

В Visual Studio 2015 это возможно с помощью диагностики Roslyn (и дополнительного Fix). Новый редактор кода Visual Studio 2015 использует Roslyn под капотом, чтобы все это анализировало механизм Code Analaysis, Metrics и Refactoring, основанный на нем.

Образец реализации такой проверки - given on the Roslyn github page. Полная реализация будет немного важна для ответа здесь, на StackOverflow, поскольку это влечет за собой ряд шагов, которые нужно пройти, и представляет собой полный учебник, но это полный учебник something similar is given here. и может быть основой для вашей работы. (задавайте дополнительные вопросы позже). Код для standard rules that ship with the product can be found in the Roslyn GitHub as well.

Этот фрагмент кода должен быть довольно близким, но я его не тестировал. Создание стандартного диагностического & исправления в соответствии с totorial Рослин SDK и заменить Initialize и AnalyzeNode методы с (замените пространство имен собственных):

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()); 
      } 
     } 
    } 
} 

Если вы хотите сделать что-нибудь обратную совместимость с более старыми версиями Визуальное Studio вы можете выбрать собственное правило анализа кода. Этот example rule берет ввод на вызов Regex.Match и Regex.Replace и выдает предупреждение, когда он не компилируется. Было бы еще проще дать предупреждение, когда оно является постоянной строкой.

Расширения Visual Studio, такие как Resharper и CodeRush, предлагают SDK, который может делать что-то похожее на FxCop, но они встроены в среду IDE, например, Roslyn. Возможно, вам будет предложен этот подход.

Если вы хотите что-то в редакторе кода, который не использует никаких расширений или настроек, то добавлениев кодировку - это столько, сколько вы можете сделать. В худшем случае вы можете ввести Debug.Assert(input != "|"); в методе, чтобы разработчики получили раннее предупреждение (при разработке/отладке), что они неправильно используют ваш API.

+0

Если вы даже можете предоставить экзамен, ответ будет совершенным! – cramopy

+0

Я не король правил Рослина (пока), и предоставленный образец не может быть лучшим из доступных. он должен дать вам достаточно, чтобы начать работу и задать следующие вопросы. – jessehouwing

+0

спасибо за пример !! : D – cramopy

-3

Используйте одинарные кавычки

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

Вы полностью не поняли вопрос. – slugster

+0

Вы даже прочитали вопрос ?? – cramopy

1

Я не думаю, что это возможно, только за исключением

подчеркнутой комментарий

:)

/// <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) {...} 

Я не знаю, любой другой способ создать намек в чистой Visual Studio, wi го исключения, но #warning msg#pragma), но они обусловлены только заранее определенными параметрами сборки (например, #IF DEBUG и т. д.), и они идут прямо в список ошибок.

Btw & просто для удовольствия: вы можете решить ваш пример, добавив значение по умолчанию

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

Edit:jessehouwing ответа гораздо лучше, весь этот ответ был более или менее шутка о энергичных комментариев :)

+2

Будьте осторожны с «дефолтами», поскольку они довольно злые. Значение по умолчанию фактически компилируется в вызывающий двоичный файл, и если вы решили изменить значение по умолчанию позже, все сборки, вызывающие этот метод, должны быть перекомпилированы для использования нового значения. – jessehouwing

+0

О, вызывая двоичный код? Я не знал ... –

+0

Да, это способ компилятора, а не язык. это плохо** ;). – jessehouwing