一直用来函数注释的宏找不到了,找了一下午终于找到了文章原版,转到这里保存一下。
//
在定义函数时,一直以来都是手工加入函数注释,虽然每个函数的注释内容并不是太多,但总是会有很多重复性的工作,哎。这两天有点时间看看有什么方法了,昨天发现原来 Vistual Studio 2005里有个宏IDE工具可以实现我的目的(嘿嘿见笑,怎么早没发现),研究一下了...,晕死是Basic语言,还好要实现我的功能不需要学习Basic太多的东西,简单看一下基本的语法,开始动手试试吧。
使用方法:
在VS2005IDE的宏资源管理器中新建一个宏项目,然后编辑,添加下面的Basic代码保存,就可以使用了。
首先将文本光标移到 InitInstance 函数所在的行上,然后双击运行宏资源管理器中的MakeFunctionRemark,这时在代码窗口中就可以自动创建该函数的基本注释内容(函数名称和参数等),效果下图
有个情况是我没去解决的(解析麻烦点),返回值部分。哪位有兴趣自己改吧。我只是在这里将不是返回值说明的(CALLBACK)手工删除处理。还有就是函数的声明只能在一行完成,该版本不支持分行声明。
' Copyright(C) 2007,松鼠网络工作室 保留所有权利。( All rights reserved. )
'
' 文件名称:DescriptionModule
' 摘 要:
' FileDescription - 生成文件说明注释
' FunctionRemark - 生成函数说明注释
' MakeFunctionRemark - 根据函数声明生成注释
' 当前版本:1.0
' 作 者:松鼠
' 创建日期:2007年7月15日
'
Option Strict Off
Option Explicit Off
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics
Public Module DescriptionModule
' --------------------------------------------------
' 生成文件说明注释
' --------------------------------------------------
Sub FileDescription()
Dim gAuthor As String = " 松鼠 "
Dim gCompany As String = " 松鼠网络工作室 "
Dim outTextDoc As TextDocument
Dim outText As EditPoint
DTE.ActiveDocument.Selection.GotoLine( 1 )
outTextDoc = DTE.ActiveDocument.Object( " TextDocument " )
outText = outTextDoc.StartPoint.CreateEditPoint()
outText.Insert( " /* " + vbCrLf)
outText.Insert( " * Copyright(C) " + Date .Today.Year.ToString() + " , " + gCompany + " 保留所有权利。( All rights reserved. ) " + vbCrLf)
outText.Insert( " * " + vbCrLf)
outText.Insert( " * 文件名称: " + DTE.ActiveDocument.Name + vbCrLf)
outText.Insert( " * 摘 要: " + vbCrLf)
outText.Insert( " * 当前版本:1.0 " + vbCrLf)
outText.Insert( " * 作 者: " + gAuthor + vbCrLf)
outText.Insert( " * 创建日期: " + Date .Today.ToLongDateString() + vbCrLf)
outText.Insert( " */ " + vbCrLf)
DTE.ActiveDocument.Selection.GotoLine( 10 )
End Sub
' --------------------------------------------------
' 生成函数说明注释
' --------------------------------------------------
Sub FunctionRemark()
Dim preSpaceCount As Integer = 0 ' 注释前面的空格数, 缩进(单位:字符)
Dim outTextDoc As TextDocument
Dim outText As EditPoint
Dim iCurrentLineNumber As Integer
iCurrentLineNumber = DTE.ActiveDocument.Selection.CurrentLine ' .ToString()
outTextDoc = DTE.ActiveDocument.Object( " TextDocument " )
outText = outTextDoc.StartPoint.CreateEditPoint()
' 移动文本输入点到指定行上
outText.MoveToLineAndOffset(iCurrentLineNumber, 1 )
Dim strSpace As String = ""
Dim iSpaceIndex As Integer
For iSpaceIndex = 1 To preSpaceCount
strSpace = strSpace + " "
Next
outText.Insert(strSpace + " //----------------------------------------------------------- " + vbCrLf)
outText.Insert(strSpace + " // 函数名称: " + vbCrLf)
outText.Insert(strSpace + " // " + vbCrLf)
outText.Insert(strSpace + " // 参数: " + vbCrLf)
outText.Insert(strSpace + " // - " + vbCrLf)
outText.Insert(strSpace + " // 返回: " + vbCrLf)
outText.Insert(strSpace + " // " + vbCrLf)
outText.Insert(strSpace + " // 说明: " + vbCrLf)
outText.Insert(strSpace + " // " + vbCrLf)
outText.Insert(strSpace + " //----------------------------------------------------------- " + vbCrLf)
End Sub
' --------------------------------------------------
'
' 函数注释解析部分
'
' --------------------------------------------------
Public Structure ITEMDATA
Public itemType As Integer
Public itemText As String
End Structure
Public lItemList As New System.Collections.Generic.List(Of ITEMDATA)( 4 )
Private Function ParseFunctionDescription( ByVal funText As String ) As Boolean
Dim strItem As String
Dim idata As ITEMDATA
Dim strSplit As String () = funText.Split( " ( " )
If strSplit.Length = 1 Then
Return False
End If
' 解析函数名称部分
If strSplit.Length > 2 Then
strItem = strSplit(strSplit.Length - 2 ).Trim()
Else
strItem = strSplit( 0 ).Trim()
End If
Dim strHeadSplit As String () = strItem.Split( " " )
strItem = strHeadSplit(strHeadSplit.Length - 1 ).Trim()
idata.itemType = 1
idata.itemText = strItem.Trim()
lItemList.Add(idata)
' 解析参数部分
strItem = strSplit(strSplit.Length - 1 ).Trim()
If strItem.Substring( 0 , 1 ) <> " ) " Then
Dim iend As Integer = strItem.IndexOf( " ) " , 0 )
Dim strParams As String = strItem.Substring( 0 , iend).Trim()
Dim strParamSplit As String () = strParams.Split( " , " )
For Each strItem In strParamSplit
idata.itemType = 2
idata.itemText = strItem.Trim()
lItemList.Add(idata)
Next strItem
Else
idata.itemType = 2
idata.itemText = " 无参数 "
lItemList.Add(idata)
End If
' 解析返回值类型
Dim iIndex As Integer
For iIndex = 0 To strHeadSplit.Length - 2
idata.itemType = 3
idata.itemText = strHeadSplit(iIndex).Trim()
lItemList.Add(idata)
Next iIndex
Return True
End Function
' --------------------------------------------------
'
' 根据函数声明生成注释
'
' --------------------------------------------------
Sub MakeFunctionRemark()
Dim preSpaceCount As Integer = 0 ' 注释前面的空格数, 缩进(单位:字符)
Dim outTextDoc As TextDocument
Dim outText As EditPoint
Dim iCurrentLineNumber As Integer
Dim iLineLength As Integer
Dim strFunText As String
Dim iItemIndex As Integer
Dim idata As ITEMDATA
lItemList.Clear()
iCurrentLineNumber = DTE.ActiveDocument.Selection.CurrentLine.ToString()
outTextDoc = DTE.ActiveDocument.Object( " TextDocument " )
outText = outTextDoc.StartPoint.CreateEditPoint()
' 移动文本输入点到指定行上
outText.MoveToLineAndOffset(iCurrentLineNumber, 1 )
iLineLength = outText.LineLength
strFunText = outText.GetText(iLineLength)
iLineLength = strFunText.Trim().Length
' 但前行没有内容直接返回
If iLineLength = 0 Then
Return
End If
' 解析函数名称
Dim bResult As Boolean = ParseFunctionDescription(strFunText.Trim())
If bResult = False Then
lItemList.Clear()
Return
End If
Dim pcount As Integer = 0
Dim rcount As Integer = 0
Dim strSpace As String = ""
Dim iSpaceIndex As Integer
For iSpaceIndex = 1 To preSpaceCount
strSpace = strSpace + " "
Next
outText.Insert(strSpace + " //----------------------------------------------------------- " + vbCrLf)
For iItemIndex = 0 To lItemList.Count - 1
idata = lItemList.Item(iItemIndex)
Select Case idata.itemType
Case 1
outText.Insert(strSpace + " // 函数名称: " + vbCrLf)
outText.Insert(strSpace + " // " + idata.itemText + vbCrLf)
Case 2
If pcount = 0 Then
outText.Insert(strSpace + " // 参数: " + vbCrLf)
End If
pcount = pcount + 1
outText.Insert(strSpace + " // - " + idata.itemText + vbCrLf)
Case 3
If rcount = 0 Then
outText.Insert(strSpace + " // 返回: " + vbCrLf)
End If
rcount = rcount + 1
outText.Insert(strSpace + " // " + idata.itemText + vbCrLf)
Case 4
Case 5
End Select
Next
outText.Insert(strSpace + " // 说明: " + vbCrLf)
outText.Insert(strSpace + " // " + vbCrLf)
outText.Insert(strSpace + " //----------------------------------------------------------- " + vbCrLf)
lItemList.Clear() ' 清楚所有元素
End Sub
End Module
另外两个函数使用方法同上
FileDescription - 生成文件说明注释
FunctionRemark - 生成函数说明注释(空注释)
如果要修改注释前面缩进空格,可以修改Basic代码中的 preSpaceCount 变量值。
在VS2005(VC++)下测试通过, 没用过其他版本的开发工具(未验证),初次写Basic代码,有不对的地方还请见谅!
看了MSDN中对宏的介绍,功能确实很爽,有时间再研究研究了。。。。
TrackBack:http://www.cppblog.com/eday/archive/2007/07/15/28079.html