This article describes the operation of a method-based static code analyzer for .NET that constructs in-memory method call networks of compiled assemblies. You will also see a concrete application of static code analysis to generate a website providing easy insights on a sample application.
- codeanalyzerandtodosample.zip
- CodeAnalyzer and Sample Solution.sln
- Generate.cmd
- Generator
- Output
- Blank.html
- co_CreateToDoItem(int,string,Nullable[DateTime])_ToDoItem.html
- co_DeleteToDoItem(int)_void.html
- co_FindUserByName(string)_User.html
- co_GetToDoItem(int)_ToDoItem.html
- co_GetUser(int)_User.html
- co_ListAllToDoItems()_IEnumerable[ToDoItem].html
- co_ListAllUsers()_IEnumerable[User].html
- co_ListDoneItemsForUser(int)_IEnumerable[ToDoItem].html
- co_ListToDoItemsForUser(int)_IEnumerable[ToDoItem].html
- co_ListUsersMatching(string)_IEnumerable[User].html
- co_MarkToDoItemDone(int)_void.html
- co_UpdateToDoItem(int,string,Nullable[DateTime])_void.html
- CodeModel.css
- CodeModel.js
- Content.html
- Index.html
- IndexTop.html
- so_CreateToDoItem(int,string,Nullable[DateTime])_ToDoItem.html
- so_DeleteToDoItem(int)_void.html
- so_FindUserByName(string)_User.html
- so_GetUser(int)_User.html
- so_ListAllUsers()_List[User].html
- so_ListDoneItemsForUser(int)_List[ToDoItem].html
- so_ListToDoItemsForUser(int)_List[ToDoItem].html
- so_ListUsersMatching(string)_List[User].html
- so_MarkToDoItemDone(int)_void.html
- so_UpdateToDoItem(int,string,Nullable[DateTime])_ToDoItem.html
- ui_CreateNewToDoItemClicked(object,System.Windows.RoutedEventArgs)_void.html
- ui_DeleteClicked(object,System.Windows.RoutedEventArgs)_void.html
- ui_InitializeComponent()_void.html
- ui_MarkDoneClicked(object,System.Windows.RoutedEventArgs)_void.html
- ui_RefreshToDoItems()_void.html
- ui_SaveClicked(object,System.Windows.RoutedEventArgs)_void.html
- ui_ToDoItemSelected(object,System.Windows.Controls.SelectionChangedEventArgs)_void.html
- ui_UserSelected(object,System.Windows.Controls.SelectionChangedEventArgs)_void.html
- ui_WindowLoaded(object,System.Windows.RoutedEventArgs)_void.html
- SampleApp
- LocalTestRun.testrunconfig
- ToDoApplication
- ToDoContract
- ToDoSample.vsmdi
- ToDoService
- ToDoUnitTests
- StaticCodeAnalyzer
- Arebis.CodeAnalysis.Static
- Arebis.Common
|
using System;
using System.Collections.Generic;
using System.Text;
namespace Arebis.Reflection
{
/// <summary>
/// Class providing default code language information.
/// </summary>
[Serializable]
public class DefaultLanguageInfo : ILanguageInfo
{
private Dictionary<string, string[]> namespaces = new Dictionary<string, string[]>();
/// <summary>
/// Registers a namespace.
/// </summary>
public void RegisterNamespace(string namespase)
{
this.namespaces[namespase] = new string[] { namespase };
}
/// <summary>
/// Registers a namespace with an alias.
/// </summary>
public void RegisterNamespace(string namespase, string alias)
{
this.namespaces[namespase] = new string[] { namespase, alias };
}
/// <summary>
/// Returns a friendlyname for the given type.
/// </summary>
public string GetFiendlyName(Type forType)
{
Type[] genericArgs = forType.GetGenericArguments();
if (forType.IsByRef)
{
return "ref " + this.GetFiendlyName(forType.GetElementType());
}
else if (forType.IsGenericType == false)
{
return this.GetFiendlyName(forType.ToString());
}
else
{
StringBuilder nameBuilder = new StringBuilder();
nameBuilder.Append(this.GetFiendlyName(StringUpTo(forType.GetGenericTypeDefinition().FullName, "`")));
nameBuilder.Append('<');
nameBuilder.Append(this.GetFiendlyName(genericArgs[0]));
for (int i = 1; i < genericArgs.Length; i++)
{
nameBuilder.Append(", ");
nameBuilder.Append(this.GetFiendlyName(genericArgs[i]));
}
nameBuilder.Append('>');
return nameBuilder.ToString();
}
}
/// <summary>
/// Returns a friendlyname for the given type.
/// </summary>
protected virtual string GetFiendlyName(string forTypeNamed)
{
int dotpos = forTypeNamed.LastIndexOf('.');
if (dotpos == -1) return forTypeNamed;
string ns = forTypeNamed.Substring(0, dotpos);
string tn = forTypeNamed.Substring(dotpos + 1);
string[] nsdef;
if (this.namespaces.TryGetValue(ns, out nsdef))
{
if (nsdef.Length > 1)
return nsdef[1] + "." + tn;
else
return tn;
}
else
return forTypeNamed;
}
private static string StringUpTo(string str, string upto)
{
int index = str.IndexOf(upto);
if (index == -1)
return str;
else
return str.Substring(0, index);
}
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.