Определить имя метода: надстройка Visual Studio 2008 - PullRequest
0 голосов
/ 11 октября 2011

Я хочу получить имя функции в надстройке, если курсор находится между открывающей и закрывающей фигурной скобкой функции в файле c #.

Есть идеи?

1 Ответ

3 голосов
/ 25 октября 2011

Получить CodeElement TextPoint текущего документа в EnvDTE.Вот некоторый макрос-код:

'Option Strict Off
'Option Explicit Off

Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics
Imports Microsoft.VisualBasic
Imports Microsoft.VisualBasic.ControlChars
Imports System.Windows.Forms
Imports Microsoft.VisualStudio.VCCodeModel
Imports Microsoft.VisualStudio.VCProjectEngine

Public Module Module1

Sub Macro2()
    Dim objTextDocument As EnvDTE.TextDocument
    Dim objCursorTextPoint As EnvDTE.TextPoint

    Try
        objTextDocument = CType(DTE.ActiveDocument.Object, EnvDTE.TextDocument)
        objCursorTextPoint = objTextDocument.Selection.ActivePoint()
        objTextDocument.Selection.LineUp()
        objTextDocument.Selection.SelectLine()
        If objTextDocument.Selection.Text.Contains("*/") Then
            objTextDocument.Selection.LineUp()
            objTextDocument.Selection.LineDown()
            objTextDocument.Selection.NewLine()
            objTextDocument.Selection.LineUp()
            objTextDocument.Selection.Insert("Released", vsInsertFlags.vsInsertFlagsInsertAtStart)
        End If



        MsgBox(objTextDocument.Selection.Text)
    Catch ex As System.Exception
        MsgBox(ex.Message)
    End Try
End Sub

Sub Macro1()
    Dim objCodeElement As EnvDTE.CodeElement
    Dim objCursorTextPoint As EnvDTE.TextPoint

    Try
        objCursorTextPoint = GetCursorTextPoint()

        If Not (objCursorTextPoint Is Nothing) Then
            For i As Integer = 0 To 39
                objCodeElement = objCursorTextPoint.CodeElement(i)
                If Not objCodeElement Is Nothing Then
                    MsgBox("wow, we have something: " & objCodeElement.FullName)
                End If
            Next i
            If objCodeElement Is Nothing Then
                MsgBox("Visual studio is a joke")
            End If
        End If
    Catch ex As System.Exception
        MsgBox(ex.Message)
    End Try
End Sub


Sub GetCodeElementAtCursor()

    Dim objCodeElement As EnvDTE.CodeElement
    Dim objCursorTextPoint As EnvDTE.TextPoint

    Try
        objCursorTextPoint = GetCursorTextPoint()

        If Not (objCursorTextPoint Is Nothing) Then
            ' Get the class at the cursor
            objCodeElement = GetCodeElementAtTextPoint(vsCMElement.vsCMElementFunction, _
               DTE.ActiveDocument.ProjectItem.FileCodeModel.CodeElements, objCursorTextPoint)
        End If

        If objCodeElement Is Nothing Then
            MessageBox.Show("No class found at the cursor!")
        Else
            MessageBox.Show("Class at the cursor: " & objCodeElement.FullName)

        End If

    Catch ex As System.Exception
        MessageBox.Show(ex.ToString)
    End Try

End Sub

Private Function GetCursorTextPoint() As EnvDTE.TextPoint

    Dim objTextDocument As EnvDTE.TextDocument
    Dim objCursorTextPoint As EnvDTE.TextPoint

    Try
        objTextDocument = CType(DTE.ActiveDocument.Object, EnvDTE.TextDocument)
        objCursorTextPoint = objTextDocument.Selection.ActivePoint()
    Catch ex As System.Exception
    End Try

    Return objCursorTextPoint

End Function

Private Function GetCodeElementAtTextPoint(ByVal eRequestedCodeElementKind As EnvDTE.vsCMElement, _
   ByVal colCodeElements As EnvDTE.CodeElements, ByVal objTextPoint As EnvDTE.TextPoint) _
   As EnvDTE.CodeElement

    Dim objCodeElement As EnvDTE.CodeElement
    Dim objResultCodeElement As EnvDTE.CodeElement
    Dim colCodeElementMembers As EnvDTE.CodeElements
    Dim objMemberCodeElement As EnvDTE.CodeElement

    If Not (colCodeElements Is Nothing) Then

        For Each objCodeElement In colCodeElements

            If objCodeElement.StartPoint.GreaterThan(objTextPoint) Then

                ' The code element starts beyond the point

            ElseIf objCodeElement.EndPoint.LessThan(objTextPoint) Then

                ' The code element ends before the point

            Else ' The code element contains the point

                If objCodeElement.Kind = eRequestedCodeElementKind Then
                    ' Found
                    objResultCodeElement = objCodeElement
                End If

                ' We enter in recursion, just in case there is an inner code element that also 
                ' satisfies the conditions, for example, if we are searching a namespace or a class
                colCodeElementMembers = GetCodeElementMembers(objCodeElement)

                objMemberCodeElement = GetCodeElementAtTextPoint(eRequestedCodeElementKind, _
                   colCodeElementMembers, objTextPoint)

                If Not (objMemberCodeElement Is Nothing) Then
                    ' A nested code element also satisfies the conditions
                    objResultCodeElement = objMemberCodeElement
                End If

                Exit For

            End If

        Next

    End If

    Return objResultCodeElement

End Function

Private Function GetCodeElementMembers(ByVal objCodeElement As CodeElement) As EnvDTE.CodeElements

    Dim colCodeElements As EnvDTE.CodeElements

    If TypeOf objCodeElement Is EnvDTE.CodeNamespace Then

        colCodeElements = CType(objCodeElement, EnvDTE.CodeNamespace).Members

    ElseIf TypeOf objCodeElement Is EnvDTE.CodeType Then

        colCodeElements = CType(objCodeElement, EnvDTE.CodeType).Members

    ElseIf TypeOf objCodeElement Is EnvDTE.CodeFunction Then

        colCodeElements = DirectCast(objCodeElement, EnvDTE.CodeFunction).Parameters

    End If

    Return colCodeElements

End Function


Sub PropertiesExample()
    ' Create and initialize a variable to represent the Documents 
    ' Options page.
    Dim envGenTab As EnvDTE.Properties = _
    DTE.Properties("Environment", "ProjectsAndSolution")
    Dim prop As EnvDTE.Property
    Dim msg As String

    ' Loop through each item in the Documents Options box.
    For Each prop In envGenTab
        msg += ("PROP NAME: " & prop.Name & "   VALUE: " & _
        prop.Value) & vbCr
    Next
    MsgBox(msg)
End Sub

End Module

Увы, кажется, что VCProjects не очень хорошо работают ...

...