Click here to Skip to main content
15,879,096 members
Articles / Programming Languages / C#

XDD-Tools for developer

Rate me:
Please Sign up or sign in to vote.
5.00/5 (9 votes)
24 Jun 2012CPOL2 min read 22.4K   449   14   3
XDD-Tools for developer , count source code line,copy project file, remove comment in source code.

Introduction

XDD (XDesigner.Development) is a tool for software developers written by yuan yong fu. It is open source. It can analyse VB, C++, C#, Delphi projects and count the number of source code lines, copy project files clearly; back up source files without wasting file and VSS information.

This is the project site: http://xdd.codeplex.com; (you can download the last version).

Autor's email:yyf9989@hotmail.com; blog site:http://www.cnblogs.com/xdesigner.

Image 1

Background

Millions of programmers work hard year after year, and write many source codes in C++, C#, VB or Delphi. Sometimes, they want know how many lines are there of that source code,Back file without any temp file which create by IDE. Of course, they cannot do it by hand, so they need a tool to do this.

Using the code

Today, source code files are not alone, many source code files construct a project, and the compiler handles the project and generates a program file.

For example, in VS.NET 2005, people create a C# project whose file name’s extension is csproj, and add many C# source files to the C# project.

XDD needs to analyze develop project file and get a list of source code file, also equip source code analyzer which can analyze source code like VB , C# or Pascal.

For example, a C# .NET2005 project file in XML format. There is a sample.

XML
<Project DefaultTargets="Build"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <AssemblyName>CellViewLib</AssemblyName>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System">
      <Name>System</Name>
    </Reference>
  </ItemGroup>
  <ItemGroup>
    <Content Include="App.ico" />
    <Compile Include="frmTestCellView.cs">
      <SubType>Form</SubType>
    </Compile>
    <EmbeddedResource Include="frmTestCellView.resx">
      <DependentUpon>frmTestCellView.cs</DependentUpon>
      <SubType>Designer</SubType>
    </EmbeddedResource>
  </ItemGroup>
</Project> 

To this XML document, I can execute XPath “Project/ItemGroup/Compile” and get a list of C# source file names. So I write the following C# code:

C#
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.LoadXml(txt);
if (doc.DocumentElement.Name == "Project"
    && doc.DocumentElement.GetAttribute("xmlns") == 
    "<a href="http://schemas.microsoft.com/developer/msbuild/" + 
    "2003">http://schemas.microsoft.com/developer/msbuild/2003</a />")
{
    project.ProjectFileName = strFileName;
    project.RootPath = System.IO.Path.GetDirectoryName(strFileName);
    ProjectFile ProjFile = new ProjectFile();
    ProjFile.FileName = System.IO.Path.GetFileName(strFileName);
    ProjFile.FullFileName = strFileName;
    ProjFile.Style = FileStyle.None;
    project.Files.Add(ProjFile);
 
    System.Xml.XmlNamespaceManager ns = 
       new System.Xml.XmlNamespaceManager(doc.NameTable);
    ns.AddNamespace("a", "<a href="http://schemas.microsoft.com" + 
       "/developer/msbuild/2003">http://schemas.microsoft.com/" + 
       "developer/msbuild/2003</a />");
 
    System.Xml.XmlNode NameNode = doc.SelectSingleNode
  ("a:Project/a:PropertyGroup/a:AssemblyName", ns);
    if (NameNode != null)
    {
        project.Name = NameNode.InnerText;
    }
    foreach (System.Xml.XmlElement element in doc.SelectNodes
 ("a:Project/a:ItemGroup/*[name()='Compile' or name()='None' or 
 name()='EmbeddedResource' or name()='Content']", ns))
    {
        string file = element.GetAttribute("Include");
        ProjectFile NewFile = new ProjectFile();
        NewFile.FileName = project.FixFileName(file);
        if (System.IO.Path.IsPathRooted(file))
        {
            NewFile.FullFileName = file;
        }
        else
        {
            NewFile.FullFileName = System.IO.Path.Combine(project.RootPath, file);
        }
        if (element.Name == "Compile")
        {
            NewFile.Style = FileStyle.SourceCode;
        }
        else if (element.Name == "EmbeddedResource")
        {
            NewFile.Style = FileStyle.Resource;
        }
        else
        {
            NewFile.Style = FileStyle.None;
        }
        project.Files.Add(NewFile);
    }//foreach
}

Using this code, XDD can get a file list from C#2005 project file. In the same way, XDD can analyze VB.NET 2005, VB6.0, Delphi project file and get source code file list.

Next, XDD needs to analyze source code with some kind of syntax. For example, there are some C# source code as follows:

C#
// string define flag 
// 0:It is not define string
// 1:It is a singleline string
// 2:It is a multi-line string
int DefineString = 0;
// Comment flag
bool DefineComment = false ;
foreach( LineInfo info in myLines )
{
 info.CodeFlag = false;
 if( info.LineText.Length == 0 && DefineString == 2)
  info.BlankLine = false;
 for(int iCount = 0 ; iCount < info.LineText.Length ; iCount ++)
 {
  // Get current character
  char c = info.LineText[iCount] ;
  // Get next character
  char c2 = (char)0;
  if( iCount < info.LineText.Length - 1 )
   c2 = info.LineText[ iCount + 1 ];
  if(! char.IsWhiteSpace( c ))
   info.BlankLine = false;
  // Defining Comment
  if( DefineComment )
  {
   info.BlankLine = false;
   info.CommentFlag = true;
   // Finish when meet */
   if( c == '*' &&  c2 == '/' )
   {
    DefineComment = false;
    iCount ++ ;
   }
   continue ;
  }
  if( DefineString == 0 )
  {
   // Is not defining string
   if( c == '/' && c2 != 0 )
   {
    if( c2 == '/' )
    {
     // Single line comment when meet //
     info.CommentFlag = true;
     DefineComment = false;
     goto NextLine ;
    }
    if( c2 == '*' )
    {
     // Start multi-line comment when meet /*
     if( iCount > 0 )
      info.CodeFlag = true;
     info.CommentFlag = true;
     DefineComment = true;
     iCount ++ ;
     continue;
    }
   }
   if( c == '\"')
   {
    if( iCount < 0 && info.LineText[iCount-1] == 
             <a href="mailto:'@'">'@'</a />)
     // Start multi-line string when meet @"
     DefineString = 2 ;
    else
     // Start single line string when meet "
     DefineString = 1 ;
   }
  }
  else
  {
   info.BlankLine = false;
   // Defining string
   if( c == '\"'  )
   {
    // Finish string when meet "
    if( iCount < 0 && info.LineText[iCount-1] !='\\' )
     DefineString = 0 ;
   }
  }
  if( ! char.IsWhiteSpace( c ))
   info.CodeFlag = true;
 }//for(int iCount = 0 ; iCount < info.LineText.Length ; iCount ++)
NextLine:;
}//foreach( LineInfo info in myLines )  

LineInfo type is a class which contains information of a source code line. It is defined as follows:

C#
/// <summary>
/// source code line information
/// </summary>
public class LineInfo
{
    /// <summary>
    /// Whether a text line
    /// </summary>
    public string LineText = null;
    /// <summary>
    /// Whether is a comment line
    /// </summary>
    public bool CommentFlag = false;
    /// <summary>
    /// Whether is a blank line , without any content
    /// </summary>
    public bool BlankLine = true;
    /// <summary>
    /// Whether is a source code line
    /// </summary>
    public bool CodeFlag = false;
} 

By using the above code, XLineCounter can analyze C#.NET 2005 project files and C# source code, count the number of C# source code lines. In the same way, XLineCounter can count the number of source code lines of VB.NET, Delphi and C++.

Points of Interest

None.

History

2012-6-24: First release.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer duchang soft
China China
yuan yong fu of duchang soft , come from CHINA , 2008 Microsoft MVP,Use GDI+,XML/XSLT, site:http://www.cnblogs.com/xdesigner/

Comments and Discussions

 
QuestionYour Articles Pin
Warrick Procter17-Oct-13 22:35
Warrick Procter17-Oct-13 22:35 
Hello yuan yong fu
I have to compliment you on how your articles have developed over the years.
I have enjoyed this article and the previous one in particular.
Thank you, and keep up the good work.
I look forward to you giving me more interesting reading.
Regards, Warrick
Troft not lest ye be sponned on the nurg! (Milligan)

QuestionGreat ! Pin
Wrangly16-Oct-12 3:51
Wrangly16-Oct-12 3:51 
GeneralMy vote of 5 Pin
Member 179611724-Jun-12 6:51
Member 179611724-Jun-12 6:51 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.