Visual studio macro - getting started | copy definition from .cpp to .h

Is it possible to make a macro that copies the definition of a function into a declaration (or maybe vice versa)? For instance,

Foo::Foo(int aParameter, int bParameter){
    //
}

int Foo::someMethod(char aCharacter) const {
    return 0;  
}

From the .cpp file will be:

class Foo {
    Foo(int aParameter, int bParameter);

    int someMethod(char aCharacter) const;
};

In the .cpp file.

also:

If there is anyone who knows good tutorials or documentation aimed at Visual Studio.Net (and possibly also addresses the above issue), I would probably agree with this as well as the answer

+1
source share
3 answers

So, I found Automation and Extensibility for Visual Studio that covers the things I'm trying to do, with a little help from the browser of objects and the macro recording function.

, .

0

, , 100% - . ++, , . ++ , VBA.

Visual Assist. - (uh-oh), .

+1

It is not beautiful or fast, but it really works. I used the recording macro function and looked at the object browser to receive calls, and then laid them together.
My visual basic knowledge is limited, so any feedback to the code will be very helpful . For example, when I try to find a string, class <name> {I get a significant slowdown. Any tips to speed this up?

Imports EnvDTE

Public Module Module1
    Function getFileName(ByRef str As String) As String
        If (str = "main.cpp") Then
            Return ""
        Else
            Dim pos As Integer
            pos = InStr(str, ".cpp")
            If (pos = 0) Then
                ' not a .cpp file.'
                Return ""
            Else
                Dim header As String
                header = Left(str, pos - 1)
                Return header
            End If
        End If
        Return ""
    End Function

    Function getParts(ByRef str As String, ByRef returnvalue As String, ByRef classname As String, ByRef identifier As String, ByRef arguments As String) As String
        ' common function looks like:'
        '   <return_value> <classname>::<identifier>([arguments])[{]'
        '                 ^divider    ^colonposition            ^parenthesisEnd'
        '                  ^classnamepos            ^parenthesisStart'
        ''
        ' exceptions: ctor and dtor'
        '   <classname>::[~]<classname>([arguments])[{]'

        Dim colonposition As Integer
        Dim classnameposition As Integer
        Dim divider As Integer
        Dim divider2 As Integer
        Dim parenthesisStart As Integer
        Dim parenthesisEnd As Integer

        colonposition = InStr(str, "::")
        parenthesisStart = InStr(str, "(")
        parenthesisEnd = InStr(str, ")")
        If (colonposition = 0 Or parenthesisStart = 0 Or parenthesisEnd = 0) Then
            Return "Not a function line" ' no colons or parenthesis found? maybe not a function line'
        End If

        divider = InStr(str, " ")

        ' do we have a ctor/dtor?'
        If (divider > colonposition Or divider = 0) Then

            Return "constructor or destructor"
        End If
        ' this might be a function'
        While True
            divider2 = InStr(divider + 1, str, " ")
            If (divider2 > colonposition) Then
                Exit While
            End If
            divider = divider2
        End While
        ' now we have the full return value in 0 -> divider-1'
        returnvalue = Left(str, divider - 1)
        ' and the classname as well'
        classname = Left(Right(str, str.Length - divider), colonposition - divider - 1)
        'indentifier is right after the :: and before the parenthesis'
        identifier = Left(Right(str, str.Length - colonposition - 1), parenthesisStart - colonposition - 2)
        ' and not to mention the arguments between the parenthesis'
        arguments = Left(Right(str, str.Length - parenthesisStart), parenthesisEnd - parenthesisStart - 1)


        Return "Success"
    End Function

    Sub getDefinition()
        Dim sourcefile As String
        Dim filename As String
        Dim header As String
        Dim returnvalue As String
        Dim classname As String
        Dim identifier As String
        Dim arguments As String

        Dim str As String
        Dim line As String
        Dim pos As Integer


        sourcefile = DTE.ActiveDocument.Name
        ' get the filename for the current file (without the extension)'
        filename = getFileName(sourcefile)
        If (filename.Length = 0) Then
            MsgBox("Im not in a .cpp file", , "GetDefinition")
            Return
        End If

        ' get the current line'
        DTE.ActiveDocument.Selection.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstColumn)
        DTE.ActiveDocument.Selection.EndOfLine(True)
        line = DTE.ActiveDocument.Selection.Text()
        ' now interpret the line'
        str = getParts(line, returnvalue, classname, identifier, arguments)
        If (Not str = "Success") Then
            MsgBox(str, , "GetDefinition")
            Exit Sub
        End If
        ' the str should be put into the header file as of:'
        ' class <classname>[:<base>][{]'
        ' [{]'
        '     <--- somewhere here'
        ' }'

        ' attach the header ending'
        header = filename + ".h"
        ' activate the header file'
        DTE.Windows.Item(header).Activate()
        DTE.ActiveDocument.Selection.StartOfDocument()


        While (True)
            DTE.ActiveDocument.Selection.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstColumn)
            DTE.ActiveDocument.Selection.EndOfLine(True)
            line = DTE.ActiveDocument.Selection.Text()
            pos = InStr(line, classname)
            If (Not pos = 0) Then
                Exit While
            End If
            DTE.ActiveDocument.Selection.LineDown(False, 1)
        End While
        ' found the class definition'
        While (True)
            pos = InStr(line, "{")
            If (Not pos = 0) Then
                Exit While
            End If
            DTE.ActiveDocument.Selection.LineDown(False, 1)
        End While
        DTE.ActiveDocument.Selection.EndOfLine(False)
        DTE.ActiveDocument.Selection.NewLine()

        DTE.ActiveDocument.Selection.Text = returnvalue & " " & identifier & "(" & arguments & ");"


    End Sub
End Module
0
source

All Articles