Как показать конкретную подсказку в 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);
    }
}

Apposition:

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

3 ответов


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

образцом реализации такой проверки является дано на странице Roslyn github. Полная реализация была бы немного больше для ответа здесь на StackOverflow, так как это влечет за собой ряд шагов через и составляет полный учебник, но это полный учебник что-то похожее здесь. и может быть основой для вашей работы. (задайте дополнительные вопросы позже). Код стандартные правила, которые поставляются с продуктом, также можно найти в Roslyn GitHub.

этот фрагмент кода должен приблизить вас, но я его не тестировал. Создайте стандартную диагностику и исправление в соответствии с Roslyn SDK totorial и замените 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());
            }
        }
    }
}

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

расширения Visual studio, такие как Resharper и CodeRush предлагает SDK, который может делать вещи, похожие на FxCop, но они встраиваются в IDE, как это делает Рослин. Это может быть вариант для вас, чтобы принять этот подход.

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


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

выразительный комментарий

:)

/// <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, за исключением #warning msg#pragma), но они условны только по заранее определенным параметрам сборки (например,#IF DEBUG etc), и они идут прямо в список ошибок.

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

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

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


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

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