Visual studio macro - начало работы | скопировать определение из .cpp в .h - PullRequest
1 голос
/ 31 марта 2010

Можно ли создать макрос, который копирует определение функции в объявление (и, возможно, также наоборот)? Например

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

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

Из файла .cpp будет:

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

    int someMethod(char aCharacter) const;
};

В файле .cpp.

Также:

Если есть кто-то со знанием хороших учебных пособий или документации, нацеленных на Visual Studio .Net (и, возможно, также охватывающих вышеуказанную проблему), я бы, вероятно, принял это как ответ

Ответы [ 3 ]

1 голос
/ 31 марта 2010

Нет, это почти невозможно, чтобы получить 100% надежность. Вы должны написать синтаксический анализатор языка C ++, чтобы иметь возможность точно исключить имя класса из объявления и справиться со сложностями, такими как значения аргументов по умолчанию и отсутствующие имена аргументов. Написание синтаксического анализатора C ++ сложно на любом языке, но в особенности вам не хватает VBA.

Выезд Визуальная помощь . Их сайт сейчас недоступен (э-э-э), не могу дать вам точную ссылку.

0 голосов
/ 19 августа 2010

Итак, я обнаружил Автоматизация и расширяемость для Visual Studio , которая охватывает вещи, которые я пытаюсь сделать, с небольшой помощью из браузера объектов и функции записи макросов.

Думаю, я смогу решить это отсюда.

0 голосов
/ 08 августа 2010

Это не красиво и не быстро, но работает.
Использовал функцию записи макросов и просмотрел объектный браузер, чтобы получить вызовы, а затем исправил их.
Мои базовые визуальные знания ограничены, поэтому любая обратная связь с кодом будет очень полезна . Например, я получаю огромное замедление при попытке найти строку class <name> {. Любые советы, чтобы ускорить это?

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
...