My organization has extremely tough and tough rules that our code must follow in order to receive certification and accreditation. Over the past decade, we have developed about a hundred VS macros that format code, generate comment blocks, apply style rules, etc.
Our macros are not like you record mouse movements; they all depend on EnvDT * VS automation objects. With dropping macros, VS 2012 we donβt understand whether we can even upgrade without having a major impact on the team.
I know that the Microsoft direction is the VS Addins route, and Iβm ready to explore this route, but itβs hard for me to find code samples or documentation on how the VS add-in can interact with active code in Visual Studio.
For example, here is a macro that we use all the time that our Try shell template template applies to all methods that can throw unhandled exceptions
''' <summary> ''' Wraps active method in Try* access wrappers. ''' </summary> Sub InsertSingleMethodTryWrappers() Dim textSelection As TextSelection Dim codeElement As CodeElement textSelection = DTE.ActiveWindow.Selection DTE.UndoContext.Open("Generate Try Wrappers") 'Allow for single Undo operation to rollback all changes Try codeElement = textSelection.ActivePoint.CodeElement(vsCMElement.vsCMElementFunction) If Not (codeElement Is Nothing) Then Dim textSelection2 As TextSelection Dim codeFunction As CodeFunction 'Dim codeFunction2 As CodeFunction2 Dim editPoint As EditPoint Dim codeParameter As CodeParameter Dim parameters As CodeElements Dim codeElement2 As CodeElement Dim isVirtual As Boolean = False Dim strVirtual As String = String.Empty Dim strTypeName As String = String.Empty '' Cast the codeElement to codeFunction object codeFunction = codeElement '' Move cursor to the start of the method textSelection.MoveToPoint(codeFunction.GetStartPoint(vsCMPart.vsCMPartHeader)) '' Should be able to use codeFunction.Kind.ToString to retrieve the function type '' vsCMFunctionVirtual if the method is virtual but there is a bug in the API '' that returns vsCMFunctionFunction even if the function is virtual (C# parsing bug?) '' '' vsCMFunction Type '' http://msdn.microsoft.com/en-us/library/envdte.vscmfunction(v=vs.80).aspx '' '' This frustrating bug means that we have to parse the header to determine if virtual textSelection.EndOfLine(True) If (textSelection.Text.IndexOf("virtual") > 0) Then isVirtual = True strVirtual = " virtual" End If textSelection.StartOfLine() '' Try not to screw up comments and attributes editPoint = GetNoneCommentOrAttribHeaderEditPoint(textSelection) If editPoint Is Nothing Then MsgBox("Could not find a line above the method that isn't a comment or attribute", _ MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "Error") Exit Sub End If '' Create an EditPoint to inject Try* methods 'editPoint = textSelection.TopPoint.CreateEditPoint() 'editPoint.LineUp() 'Move up 1 line editPoint.EndOfLine() 'Go to end of line above signature editPoint.Insert(Environment.NewLine) 'Insert blank line for cleanliness editPoint.Insert(Environment.NewLine) 'Insert blank line for cleanliness editPoint.LineUp() 'Move up 1 line parameters = codeFunction.Parameters Dim strAccess As String : strAccess = GetAccessModifierString(codeFunction.Access) 'Access Modifier Dim strName As String : strName = codeElement.Name 'Member Name Dim strType As String : strType = codeFunction.Type.AsString 'Type Name '' Get the un-qualified object name If (strType.IndexOf(".") > 0) Then Dim arrType() As String = strType.Split(".") strTypeName = arrType(arrType.Length - 1) Else strTypeName = strType End If ''' Create parameter type/name arrayList Dim arrParams As System.Collections.ArrayList arrParams = New System.Collections.ArrayList() For Each codeElement2 In parameters codeParameter = codeElement2 arrParams.Add(codeParameter.Type.AsString.Trim & " " & codeParameter.Name.Trim & ", ") Next Dim strParams As String Dim strParamNames As String '' Capture a string with parameter names and types and one just of names For Each strParam As String In arrParams strParams += strParam strParamNames += strParam.Split(" ")(1) Next '' Trim excess comma for members of type void If strType = "void" Then If Not String.IsNullOrEmpty(strParams) Then If strParams.TrimEnd.EndsWith(",") Then strParams = strParams.TrimEnd() strParams = strParams.Remove(strParams.Length - 1, 1) End If End If End If '' -- Try* swallow methods -- '' we don't care what the exception is, we just want to know success or failure Dim strTrySwallowSignature As String Dim strTrySwallowBody As String Dim strTryOutParams As String Dim strOutDef As String Dim strOutSig As String '' Members of type 'void' get no out parameters If Not strType = "void" Then strTryOutParams = "out " & strTypeName & " outObjType" strOutDef = "outObjType = null;" strOutSig = " out outObjType," End If strTrySwallowSignature = vbTab & vbTab & strAccess & strVirtual & " bool Try" & strName & "(" & strParams & strTryOutParams & ")" strTrySwallowBody = vbCrLf & vbTab & vbTab & "{" _ & vbCrLf & vbTab & vbTab & vbTab & "Exception exception;" _ & vbCrLf & vbTab & vbTab & vbTab & strOutDef _ & vbCrLf & vbTab & vbTab & vbTab & "return Try" & strName & "(" & strParamNames & strOutSig & " out exception);" _ & vbCrLf & vbTab & vbTab & "}" '' -- Try* re-throw methods -- '' We want to know success or failure as well as the exception if it failed Dim strTryReThrowSignature As String Dim strTryReThrowBody As String '' Members of type 'void' only get out exception parameter If Not strType = "void" Then strTryOutParams = "out " & strTypeName & " outObjType, out Exception exception" 'strOutDef = "outObjType = new " & strTypeName & "();" strOutDef = "outObjType = null;" Else strTryOutParams = "out Exception exception" End If strTryReThrowSignature = vbTab & vbTab & strAccess & strVirtual & " bool Try" & strName & "(" & strParams & strTryOutParams & ")" strTryReThrowBody = vbCrLf & vbTab & vbTab & "{" _ & vbCrLf & vbTab & vbTab & vbTab & "bool result = false;" _ & vbCrLf & vbTab & vbTab & vbTab & "exception = null;" _ & vbCrLf & vbTab & vbTab & vbTab & strOutDef _ & vbCrLf & vbTab & vbTab & vbTab & "try" _ & vbCrLf & vbTab & vbTab & vbTab & "{" _ & vbCrLf & vbTab & vbTab & vbTab & vbTab & "
Can someone direct me to how the VS 2012 add-in can manipulate an active / open code file (using EnvDTE * or any object model available in 2012)?
source share