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;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using Arebis.CodeAnalysis.Static;
using System.Security.Permissions;
public static class HelperExtension
{
public static IList<ModelMethod> Sorted(this IEnumerable<ModelMethod> methods)
{
List<ModelMethod> result = new List<ModelMethod>(methods);
result.Sort(new MethodComparer());
return result;
}
public static string DisplayString(this ModelMethod subject)
{
return subject.DeclaringType.Name + "." + subject.Name;
}
public static string ToFilename(this ModelMethod subject, string format)
{
string str = subject.Signature;
str = str.Replace("<", "[");
str = str.Replace(">", "]");
str = str.Replace("*", "_");
str = str.Replace("?", "_");
str = str.Replace(":", "_");
str = str.Replace(" ", "");
return String.Format(format, str);
}
public static string ToLink(this ModelMethod subject, string format)
{
return subject.ToLink(format, null);
}
public static string ToLink(this ModelMethod subject, string format, object options)
{
StringBuilder sb = new StringBuilder();
sb.Append("<a href=\"");
sb.Append(subject.ToFilename(format));
sb.Append("\"");
foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(options))
sb.AppendFormat(" {0}=\"{1}\"", prop.Name, prop.GetValue(options));
sb.Append(">");
sb.Append(subject.DisplayString());
sb.Append("</a>");
return sb.ToString();
}
public static string[] RequiredRoles(this ModelMethod subject)
{
List<string> roles = new List<string>();
foreach (var item in Attribute.GetCustomAttributes(subject.MethodBase, typeof(PrincipalPermissionAttribute)))
roles.Add(((PrincipalPermissionAttribute)item).Role);
return roles.ToArray();
}
public static bool IsFullyImplemented(this ModelMethod subject)
{
return (subject.GetAllCallsMethods().WhereTagsContains("missingimplementationexception").Count() == 0);
}
}
public class MethodComparer : System.Collections.Generic.IComparer<ModelMethod>
{
int IComparer<ModelMethod>.Compare(ModelMethod left, ModelMethod right)
{
string leftname = (left.Name.Contains(".") ? left.Signature : left.DeclaringType.ToString() + "." + left.Signature);
string rightname = (right.Name.Contains(".") ? right.Signature : right.DeclaringType.ToString() + "." + right.Signature);
return leftname.CompareTo(rightname);
}
}
|
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.