Плагин Coderush не генерирует корректную попытку

Мы создали небольшой плагин для добавления блока xml-комментария и создания try-catch для функции. (мы просто добавляем это к каждой функции, которую пишем) Но с последним обновлением devexpress у меня возникла проблема со следующим кодом.

Private Sub cpAddComment_Apply(ByVal sender As System.Object, ByVal ea As DevExpress.CodeRush.Core.ApplyContentEventArgs) Handles cpAddXMLCommentAndTryCatch.Apply
    ' create elementbuilder and add current code to it
    Dim objMethod As New Method
    objMethod = objOldMethod.Clone()
    objElementBuilder.AddStatement(Nothing, objMethod)

    ' add try
    Dim objTry As DevExpress.CodeRush.StructuralParser.Try = objElementBuilder.AddTry(objMethod)
    Dim objCatch As DevExpress.CodeRush.StructuralParser.Catch = objElementBuilder.AddCatch(objMethod, "Exception", "ex")

    ' add exception
    Dim strErrorString As String = """Error in " + objMethod.Location + """, ex"
    Dim objThrow As New DevExpress.CodeRush.StructuralParser.Throw

    Dim objException As New DevExpress.CodeRush.StructuralParser.TypeReferenceExpression("Exception")
    Dim objExceptionString As New DevExpress.CodeRush.StructuralParser.PrimitiveExpression(strErrorString)
    Dim objNewException As New DevExpress.CodeRush.StructuralParser.ObjectCreationExpression(objException)
    objNewException.AddArgument(objExceptionString)
    objThrow.Expression = objNewException
    'objThrow.AddFooter(" ") 'This isnt working either
    objElementBuilder.AddThrow(objCatch, objThrow)


    ' substitute code
    Dim newCode As String = objElementBuilder.GenerateCode()
    ea.TextDocument.Replace(objOldMethod.Range, newCode, "Update Method", True)
end sub

Вместо создания правильного блока Try-catch он генерирует следующий неправильный код:

    Try
    Catch ex As Exception
    Throw New Exception("Error in test", ex)End Try

Как ни странно, следующий код, кажется, работает (это примерно тот же код, но затем для обработчиков событий, чтобы показать окно сообщения вместо исключения)

If not CodeRush.Language.ActiveExtension.DotNetLanguageType = DotNetLanguageType.CSharp Then
    Dim objExceptionString As New DevExpress.CodeRush.StructuralParser.PrimitiveExpression("Messagebox.Show(" + strErrorString + ")" + vbCrLf)
    objElementBuilder.AddStatement(objCatch, objExceptionString)
Else

Эта проблема существует в Vb.Net, но в C# квадратные скобки расположены правильно.

1 ответ

Решение

Я воспроизвел вашу проблему и зарегистрировал ее в Центре поддержки DevExpress. Вы можете отслеживать его статус здесь. После исправления вы можете запросить сборку, содержащую исправление, в группе поддержки по адресу support@devexpress.com. На данный момент, в качестве обходного пути, вы можете заменить эту строку кода:

objThrow.Expression = objNewException

в это:

objThrow.Expression = New SnippetExpression(CodeRush.Language.GenerateExpressionCode(objNewException) + vbCrLf)

Это сгенерирует блок try/catch в Visual Basic правильно.

Другие вопросы по тегам