Browse Source

change metrics counting: now we are counting no longer the usages but the distinct references: string M(string s) { return s.ToLower; } has only one reference to System.String.

pull/18/head
Siegfried Pammer 14 years ago
parent
commit
db5dc2d348
  1. 34
      src/AddIns/Analysis/CodeQuality/Engine/AssemblyAnalyzer.cs
  2. 13
      src/AddIns/Analysis/CodeQuality/Engine/Dom/NodeBase.cs
  3. 8
      src/AddIns/Analysis/CodeQuality/Engine/ILAnalyzer.cs

34
src/AddIns/Analysis/CodeQuality/Engine/AssemblyAnalyzer.cs

@ -46,6 +46,31 @@ namespace ICSharpCode.CodeQuality.Engine @@ -46,6 +46,31 @@ namespace ICSharpCode.CodeQuality.Engine
fileNames.AddRange(files);
}
HashSet<NodeBase> outgoingEdges = new HashSet<NodeBase>();
public void AddEdge(NodeBase target)
{
// copies all ancestors of target into a hashset
// duplicates are removed
while (target != null) {
if (!outgoingEdges.Add(target))
break;
target = target.Parent;
}
}
void CreateEdges(NodeBase source)
{
// add edges to source
while (source != null) {
foreach (NodeBase n in outgoingEdges) {
source.AddRelationship(n);
}
source = source.Parent;
}
outgoingEdges.Clear();
}
public ReadOnlyCollection<AssemblyNode> Analyze()
{
IUnresolvedAssembly[] loadedAssemblies = LoadAssemblies().ToArray();
@ -134,6 +159,7 @@ namespace ICSharpCode.CodeQuality.Engine @@ -134,6 +159,7 @@ namespace ICSharpCode.CodeQuality.Engine
ReportProgress(++i / (double)count);
AddRelationshipsForTypes(element.Key.DirectBaseTypes, element.Value);
AddRelationshipsForAttributes(element.Key.Attributes, element.Value);
CreateEdges(element.Value);
}
foreach (var element in methodMappings) {
@ -151,6 +177,7 @@ namespace ICSharpCode.CodeQuality.Engine @@ -151,6 +177,7 @@ namespace ICSharpCode.CodeQuality.Engine
AddRelationshipsForType(node, param.Type);
AddRelationshipsForAttributes(param.Attributes, node);
}
CreateEdges(element.Value);
}
foreach (var element in fieldMappings) {
@ -159,6 +186,7 @@ namespace ICSharpCode.CodeQuality.Engine @@ -159,6 +186,7 @@ namespace ICSharpCode.CodeQuality.Engine
var field = element.Key;
AddRelationshipsForType(node, field.Type);
AddRelationshipsForAttributes(field.Attributes, node);
CreateEdges(element.Value);
}
foreach (var element in propertyMappings) {
@ -177,6 +205,7 @@ namespace ICSharpCode.CodeQuality.Engine @@ -177,6 +205,7 @@ namespace ICSharpCode.CodeQuality.Engine
}
AddRelationshipsForType(node, property.ReturnType);
AddRelationshipsForAttributes(property.Attributes, node);
CreateEdges(element.Value);
}
foreach (var element in eventMappings) {
@ -200,6 +229,7 @@ namespace ICSharpCode.CodeQuality.Engine @@ -200,6 +229,7 @@ namespace ICSharpCode.CodeQuality.Engine
}
AddRelationshipsForType(node, @event.ReturnType);
AddRelationshipsForAttributes(@event.Attributes, node);
CreateEdges(element.Value);
}
return new ReadOnlyCollection<AssemblyNode>(assemblyMappings.Values.ToList());
@ -232,7 +262,7 @@ namespace ICSharpCode.CodeQuality.Engine @@ -232,7 +262,7 @@ namespace ICSharpCode.CodeQuality.Engine
try {
foreach (var attr in attributes) {
if (attr.Constructor != null)
node.AddRelationship(methodMappings[attr.Constructor]);
AddEdge(methodMappings[attr.Constructor]);
}
} catch (NotSupportedException nse) {
// HACK : workaround for bug in NR5's attribute blob parser.
@ -260,7 +290,7 @@ namespace ICSharpCode.CodeQuality.Engine @@ -260,7 +290,7 @@ namespace ICSharpCode.CodeQuality.Engine
{
TypeNode typeNode;
if (context.typeMappings.TryGetValue(type, out typeNode))
node.AddRelationship(typeNode);
context.AddEdge(typeNode);
return base.VisitTypeDefinition(type);
}
}

13
src/AddIns/Analysis/CodeQuality/Engine/Dom/NodeBase.cs

@ -25,20 +25,9 @@ namespace ICSharpCode.CodeQuality.Engine.Dom @@ -25,20 +25,9 @@ namespace ICSharpCode.CodeQuality.Engine.Dom
}
}
public void AddRelationship(NodeBase reference)
{
foreach (NodeBase pa in AncestorsAndSelf) {
if (reference.AncestorsAndSelf.Contains(pa)) break;
foreach (NodeBase pb in reference.AncestorsAndSelf) {
if (AncestorsAndSelf.Contains(pb)) break;
pa.AddRelationshipInternal(pb);
}
}
}
protected Dictionary<NodeBase, int> relationships = new Dictionary<NodeBase, int>();
void AddRelationshipInternal(NodeBase reference)
public void AddRelationship(NodeBase reference)
{
if (!relationships.ContainsKey(reference))
relationships[reference] = 0;

8
src/AddIns/Analysis/CodeQuality/Engine/ILAnalyzer.cs

@ -49,20 +49,20 @@ namespace ICSharpCode.CodeQuality.Engine @@ -49,20 +49,20 @@ namespace ICSharpCode.CodeQuality.Engine
if (md != null && assemblies.Contains(md.DeclaringType.Module.Assembly) && mappings.cecilMappings.ContainsKey(md)) {
if (md.IsGetter || md.IsSetter) {
var propertyNode = mappings.propertyMappings[(IProperty)mappings.cecilMappings[md]];
analyzedNode.AddRelationship(propertyNode);
mappings.AddEdge(propertyNode);
} else if (md.IsAddOn || md.IsRemoveOn) {
var eventNode = mappings.eventMappings[(IEvent)mappings.cecilMappings[md]];
analyzedNode.AddRelationship(eventNode);
mappings.AddEdge(eventNode);
} else {
var methodNode = mappings.methodMappings[(IMethod)mappings.cecilMappings[md]];
analyzedNode.AddRelationship(methodNode);
mappings.AddEdge(methodNode);
}
}
} else if (operand is FieldReference) {
var fd = ((FieldReference)operand).Resolve();
if (fd != null && assemblies.Contains(fd.DeclaringType.Module.Assembly) && mappings.cecilMappings.ContainsKey(fd)) {
var fieldNode = mappings.fieldMappings[(IField)mappings.cecilMappings[fd]];
analyzedNode.AddRelationship(fieldNode);
mappings.AddEdge(fieldNode);
}
}
} catch (AssemblyResolutionException are) {

Loading…
Cancel
Save