在定義函數時,一直以來都是手工加入函數注釋,雖然每個函數的注釋內容并不是太多,但總是會有很多重復性的工作,哎。這兩天有點時間看看有什么方法了,昨天發現原來 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中對宏的介紹,功能確實很爽,有時間再研究研究了。。。。