using System;
using AnticipatingMinds.CodeInsight;
using AnticipatingMinds.Genesis.CodeDOM;
namespace AnticipatingMinds.Metrics{
public sealed class AccumulatedStatementsCount : CodeAggregateMetric
{
internal AccumulatedStatementsCount(CodeMetric aggregatedMetric):base(aggregatedMetric,MetricAggregationType.Sum)
{
}
public override string Id
{
get
{
return "AccumulatedStatementsCount";
}
}
public override string Name
{
get
{
return "Statements";
}
}
public override string Description
{
get
{
return "Accumulated Statements Count.";
}
}
public override string HelpUrl
{
get
{
return String.Empty;
}
}
}
/// <summary>
/// Summary description for StatementsCount.
/// </summary>
public class StatementsCount : TypeMemberDeclarationMetric
{
private class MetricData
{
public decimal StatementsCount = 0;
}
public override string Id
{
get
{
return "StatementsCount";
}
}
public override string Name
{
get
{
return "Statements";
}
}
public override string Description
{
get
{
return "Number of statements in the type memebr";
}
}
public override string HelpUrl
{
get
{
return string.Empty;
}
}
public override CodeAggregateMetric[] GetAggregateMetrics()
{
return new CodeAggregateMetric[1] { new AccumulatedStatementsCount(this) };
}
public override decimal GetValue(CodeTypeMemberDeclaration typeMemberDeclaration)
{
MetricData metricData = new MetricData();
CodeDomWalker.WalkCodeElement(typeMemberDeclaration,new CodeDomWalker.WalkerCallback(CalculateMetric),metricData);
return metricData.StatementsCount;
}
private CodeDomWalker.WalkerCallbackReturn CalculateMetric(CodeElement codeElement, CodeDomWalker.CallBackNotificationType notificationType, CodeDomWalkerContext walkerContext,object applicationData)
{
switch(notificationType)
{
case CodeDomWalker.CallBackNotificationType.OnElement:
{
if(codeElement is CodeStatement)
(applicationData as MetricData).StatementsCount++;
break;
}
}
return CodeDomWalker.WalkerCallbackReturn.Next;
}
}
}
|