道。道。道

安全特性不等于安全的特性

   :: 首页 :: 联系 :: 聚合  :: 管理

常用链接

搜索

  •  

最新评论

        在定义函数时,一直以来都是手工加入函数注释,虽然每个函数的注释内容并不是太多,但总是会有很多重复性的工作,哎。这两天有点时间看看有什么方法了,昨天发现原来 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 StringAs 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(01<> ")" 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中对宏的介绍,功能确实很爽,有时间再研究研究了。。。。


posted on 2007-07-15 22:47 独孤九剑 阅读(4272) 评论(0)  编辑 收藏 引用 所属分类: Visual C++ 8.0