VS Macro / Надстройка для преобразования конкатенации строк в стиль string.format - PullRequest
0 голосов
/ 28 июля 2010

У меня есть проект в разработке, где строковые операции, такие как "Привет" + переменная + ", добро пожаловать в проект", используются во многих местах (данный пример очень незначительный).

Одним из требований являетсяпреобразовать его в стиль string.format.

Это очень долгая и утомительная работа, где я не хотел бы нарушать ранее работающий код из-за возможной человеческой ошибки при преобразовании.

Iхотел бы, если какой-либо макрос или VS команда, которую я могу создать, чтобы справиться с этим.Так же, как мы помечаем блок кода и выполняем функцию извлечения в опциях Re-factor.

1 Ответ

2 голосов
/ 10 августа 2010

Я чувствовал, что код был немного длинным для публикации здесь, но я разместил ответ в своем блоге: http://www.brianschmitt.com/2010/08/converting-concatenated-string-into.html

- РЕДАКТИРОВАТЬ - За комментарий здесь уместен Макрос - не уверен, почему вы не можете получить доступ ...

Public Sub ConvertToStringFormat()
    DTE.UndoContext.Open("ConvertToStringFormat")
    Dim textSelection As TextSelection = DTE.ActiveDocument.Selection
    Dim output As String = "string.Format(""{0}"", {1})"
    Dim delimt As String = ", "
    Dim fmtdTostring As String = ".tostring("""

    Dim txtSelection As String() = System.Text.RegularExpressions.Regex.Split(textSelection.Text.Trim, "\+\s_[+\n\r\t]|&\s_[+\n\r\t]|\+|&")
    Dim hardStrings As String = String.Empty
    Dim valueStrings As String = String.Empty
    Dim counter As Int16 = 0

    For Each str As String In txtSelection
        Dim tmpString As String = str.Trim
        If tmpString.StartsWith("""") Then
            hardStrings &= tmpString.Substring(1, tmpString.Length - 2)
        Else
            Dim fmt As String = String.Empty
            Dim indxToString As Int32 = 0

            If tmpString.ToLower.Contains(fmtdTostring) Then
                indxToString = tmpString.ToLower.IndexOf(fmtdTostring)
                fmt = tmpString.Substring(indxToString + 11, tmpString.Length - tmpString.ToLower.IndexOf(""")", indxToString) - 1)
            End If

            If fmt <> String.Empty Then
                hardStrings &= "{" & counter.ToString & ":" & fmt & "}"
                valueStrings &= tmpString.Substring(0, indxToString) & delimt
            Else
                hardStrings &= "{" & counter.ToString & "}"
                valueStrings &= tmpString & delimt
            End If

            counter += 1
        End If
    Next

    If valueStrings <> String.Empty Then valueStrings = valueStrings.Substring(0, valueStrings.Length - delimt.Length)

    textSelection.Text = String.Format(output, hardStrings, valueStrings)
    DTE.UndoContext.Close()

End Sub
...