SQL Server Storage Engine

Using Visual Studio’s Code Model objects for code base understanding

A bit of a diversion from the normal SQL Server posts.  Recently I’ve found a very useful feature in Visual Studio that can help to analyze large amounts of source code – the Visual Studio Code Model objects

Depending on the language of the code base a different set of objects are available to you.  In this example I’ve used the VCCodeModel to walk through all the code elements of a C++ project.

 

 

using System;

using System.Collections.Generic;

using System.Text;

using EnvDTE;

using EnvDTE80;

using Microsoft.VisualStudio.VCCodeModel;

 

namespace CodeModel

{

    class CodeWalker

    {

        static public void WalkCodeElements()

        {

           

            //get a reference to the visual studio environment

            EnvDTE80.DTE2 dte2;

            dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.

            GetActiveObject("VisualStudio.DTE.8.0");

 

            //assume the first project in the solution is the interesting one

            Project project = dte2.Solution.Projects.Item(1);

           

 

            //get the code model for the VC project

            VCCodeModel vcCM = ((VCCodeModel)(project.CodeModel));

 

            VCCodeElement vce = null;

            if (vcCM != null)

            {

                for (int i = 1; i < vcCM.CodeElements.Count; i++)

                {

                    vce = ((VCCodeElement)

                        (vcCM.CodeElements.Item(i)));

                    printElementInformation(vce, "");

                   

                }

            }

        }

       

 

        static public void printElementInformation(VCCodeElement el, string level)

        {

            Console.WriteLine("{0}{1} ({2} references)", level, el.Name,  el.References.Count);

            //recursively print children

            foreach (VCCodeElement child in el.Children)

                printElementInformation(child, level + "\t");

 

        }

 

    }

}

 

Given this input:

class ClassA

{

public:

      int MyFunction()

      {

            return 1;

      }

}

 

class ClassB: public class ClassA

{

public:

            int MyOtherFunction()

            {

                  return 2;

            }

}

 

class ClassC: public class ClassB

{

      public:

            int YetAnotherFunction()

            {

                  return 3;

            }

}

 

 

int main(void)

{

      ClassB MyClass;

      MyClass.MyOtherFunction();

}

 

 

The example generates this output:

main

ClassC

        YetAnotherFunction

        ClassB

ClassB

        MyOtherFunction

        ClassA

ClassA

        MyFunction

 

The possibilities are exciting.  One could use this object model to graph dependencies, or generate documentation from only source code.

Cheers!

 

Published Friday, March 02, 2007 8:26 AM by JHalmans

Comments

No Comments
Anonymous comments are disabled

© 2009 Microsoft Corporation. All rights reserved. Terms of Use  |  Trademarks  |  Privacy Statement
Microsoft
Page view tracker