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.Linq;
using System.Text;
using Arebis.Reflection;
using System.Reflection;
namespace Arebis.CodeAnalysis.Static
{
[Serializable]
public class ModelType
{
private static MethodInfo[] EmptyMethodInfoSet = new MethodInfo[0];
private ModelAssembly assembly;
private Type runtimeType;
private ILanguageInfo languageInfo;
private IList<ModelMethod> methods;
private Dictionary<MethodBase, List<MethodInfo>> interfaceMapping;
public ModelType(ModelAssembly assembly, Type runtimeType, ILanguageInfo languageInfo)
{
this.assembly = assembly;
this.runtimeType = runtimeType;
this.languageInfo = languageInfo;
this.methods = new List<ModelMethod>();
this.assembly.Types.Add(this);
}
public ModelAssembly Assembly
{
get { return this.assembly; }
}
public Type RuntimeType
{
get { return this.runtimeType; }
}
public ILanguageInfo LanguageInfo
{
get { return this.languageInfo; }
}
public IList<ModelMethod> Methods
{
get { return this.methods; }
}
public IEnumerable<MethodInfo> GetImplementedInterfaceMethods(ModelMethod byMethod)
{
if ((this.interfaceMapping == null) && (byMethod.DeclaringType.IsInterface == false))
{
lock (this)
{
if (this.interfaceMapping == null)
{
this.interfaceMapping = new Dictionary<MethodBase, List<MethodInfo>>();
foreach (Type itype in this.runtimeType.GetInterfaces())
{
InterfaceMapping map = this.runtimeType.GetInterfaceMap(itype);
for (int i = 0; i < map.InterfaceMethods.Length; i++)
{
List<MethodInfo> list;
if (!this.interfaceMapping.TryGetValue(map.TargetMethods[i], out list))
list = this.interfaceMapping[map.TargetMethods[i]] = new List<MethodInfo>();
list.Add(map.InterfaceMethods[i]);
}
}
}
}
}
List<MethodInfo> result;
if (byMethod.DeclaringType.IsInterface)
return EmptyMethodInfoSet;
else if (this.interfaceMapping.TryGetValue(byMethod.MethodBase, out result))
return result;
else
return EmptyMethodInfoSet;
}
}
}
|
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.