Browse Source

Added a support for instructions.

Assembly stats are now hidden when no assembly is opened.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@6386 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Tomáš Linhart 16 years ago
parent
commit
11454252ad
  1. 10
      src/AddIns/Analysis/CodeQuality/CodeQualityAnalysis.csproj
  2. 13
      src/AddIns/Analysis/CodeQuality/Src/Instruction.cs
  3. 4
      src/AddIns/Analysis/CodeQuality/Src/MainWindow.xaml
  4. 2
      src/AddIns/Analysis/CodeQuality/Src/MainWindow.xaml.cs
  5. 6
      src/AddIns/Analysis/CodeQuality/Src/Method.cs
  6. 58
      src/AddIns/Analysis/CodeQuality/Src/MetricsReader.cs
  7. 7
      src/AddIns/Analysis/CodeQuality/Src/Module.cs

10
src/AddIns/Analysis/CodeQuality/CodeQualityAnalysis.csproj

@ -113,13 +113,13 @@ @@ -113,13 +113,13 @@
<Compile Include="Src\Controls\DependencyEdge.cs" />
<Compile Include="Src\Controls\DependencyGraph.cs" />
<Compile Include="Src\Controls\DependencyGraphLayout.cs" />
<Compile Include="Src\Controls\DependencyMatrixControl.cs" />
<Compile Include="Src\Controls\DependencyMatrix.cs" />
<Compile Include="Src\Controls\DependencyMatrixControl.cs">
<SubType>Component</SubType> </Compile> <Compile Include="Src\Controls\DependencyMatrix.cs" />
<Compile Include="Src\Controls\DependencyVertex.cs" />
<Compile Include="Src\Controls\DependencyIconVertexConverter.cs" />
<Compile Include="Src\Controls\Matrix.cs" />
<Compile Include="Src\Controls\MatrixControl.cs" />
<Compile Include="Src\Controls\TreeMatrixControl.xaml.cs">
<Compile Include="Src\Controls\MatrixControl.cs">
<SubType>Component</SubType> </Compile> <Compile Include="Src\Controls\TreeMatrixControl.xaml.cs">
<DependentUpon>TreeMatrixControl.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
@ -127,7 +127,7 @@ @@ -127,7 +127,7 @@
<Compile Include="Src\Event.cs" />
<Compile Include="Src\Field.cs" />
<Compile Include="Src\INode.cs" />
<Compile Include="Src\NodeIconService.cs" />
<Compile Include="Src\Instruction.cs" /> <Compile Include="Src\NodeIconService.cs" />
<Compile Include="Src\IDependency.cs" />
<Compile Include="Src\MetricsReader.cs" />
<Compile Include="Src\Method.cs" />

13
src/AddIns/Analysis/CodeQuality/Src/Instruction.cs

@ -0,0 +1,13 @@ @@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ICSharpCode.CodeQualityAnalysis
{
public class Instruction
{
public Method DeclaringMethod { get; set; }
public string Operand { get; set; }
}
}

4
src/AddIns/Analysis/CodeQuality/Src/MainWindow.xaml

@ -113,7 +113,7 @@ @@ -113,7 +113,7 @@
<ProgressBar IsIndeterminate="True" Width="95" Height="15" />
</StackPanel>
</StatusBarItem>
<StatusBarItem HorizontalAlignment="Right">
<StatusBarItem HorizontalAlignment="Right" x:Name="assemblyStats" Visibility="Hidden">
<StackPanel Orientation="Horizontal">
<StatusBarItem>
<StackPanel Orientation="Horizontal">
@ -142,7 +142,7 @@ @@ -142,7 +142,7 @@
<StatusBarItem>
<StackPanel Orientation="Horizontal">
<TextBlock Text="IL instructions: " />
<TextBlock Text="TBD" />
<TextBlock Text="{Binding Path=MetricsReader.MainModule.InstructionsCount}" />
</StackPanel>
</StatusBarItem>
</StackPanel>

2
src/AddIns/Analysis/CodeQuality/Src/MainWindow.xaml.cs

@ -72,12 +72,14 @@ namespace ICSharpCode.CodeQualityAnalysis @@ -72,12 +72,14 @@ namespace ICSharpCode.CodeQualityAnalysis
return;
progressBar.Visibility = Visibility.Visible;
assemblyStats.Visibility = Visibility.Hidden;
fileAssemblyLoading.Text = System.IO.Path.GetFileName(fileDialog.FileName);
var worker = new BackgroundWorker();
worker.DoWork += (source, args) => MetricsReader = new MetricsReader(fileDialog.FileName);
worker.RunWorkerCompleted += (source, args) => {
progressBar.Visibility = Visibility.Hidden;
assemblyStats.Visibility = Visibility.Visible;
FillMatrix();
};

6
src/AddIns/Analysis/CodeQuality/Src/Method.cs

@ -31,6 +31,11 @@ namespace ICSharpCode.CodeQualityAnalysis @@ -31,6 +31,11 @@ namespace ICSharpCode.CodeQualityAnalysis
/// </summary>
public ISet<Field> FieldUses { get; private set; }
/// <summary>
/// Instructions inside of the method
/// </summary>
public ISet<Instruction> Instructions { get; private set; }
/// <summary>
/// A name of method
/// </summary>
@ -113,6 +118,7 @@ namespace ICSharpCode.CodeQualityAnalysis @@ -113,6 +118,7 @@ namespace ICSharpCode.CodeQualityAnalysis
TypeUses = new HashSet<Type>();
MethodUses = new HashSet<Method>();
FieldUses = new HashSet<Field>();
Instructions = new HashSet<Instruction>();
GenericReturnTypes = new HashSet<Type>();
ReturnType = null;

58
src/AddIns/Analysis/CodeQuality/Src/MetricsReader.cs

@ -408,15 +408,21 @@ namespace ICSharpCode.CodeQualityAnalysis @@ -408,15 +408,21 @@ namespace ICSharpCode.CodeQualityAnalysis
/// <param name="methodDefinition">A method definition with instructions</param>
/// <param name="instructions">A collection of instructions</param>
public void ReadInstructions(Method method, MethodDefinition methodDefinition,
Collection<Instruction> instructions)
Collection<Mono.Cecil.Cil.Instruction> instructions)
{
foreach (Instruction instruction in instructions)
foreach (var instruction in instructions)
{
var instr = ReadInstruction(instruction);
method.Instructions.Add(new Instruction
{
DeclaringMethod = method,
// Operand = instruction.Operand.ToString() // for now operand as string should be enough
});
var operand = ReadOperand(instruction);
if (instr is MethodDefinition)
if (operand is MethodDefinition)
{
var md = instr as MethodDefinition;
var md = operand as MethodDefinition;
var type = (from n in method.Owner.Namespace.Module.Namespaces
from t in n.Types
where t.FullName == FormatTypeName(md.DeclaringType, true)
@ -432,9 +438,9 @@ namespace ICSharpCode.CodeQualityAnalysis @@ -432,9 +438,9 @@ namespace ICSharpCode.CodeQualityAnalysis
method.MethodUses.Add(findTargetMethod);
}
if (instr is FieldDefinition)
if (operand is FieldDefinition)
{
var fd = instr as FieldDefinition;
var fd = operand as FieldDefinition;
var field = (from f in method.Owner.Fields
where f.Name == fd.Name
select f).SingleOrDefault();
@ -445,6 +451,25 @@ namespace ICSharpCode.CodeQualityAnalysis @@ -445,6 +451,25 @@ namespace ICSharpCode.CodeQualityAnalysis
}
}
/// <summary>
/// Reads an instruction operand by recursive calling until non-instruction
/// operand is found
/// </summary>
/// <param name="instruction">An instruction with operand</param>
/// <returns>An instruction operand</returns>
public object ReadOperand(Mono.Cecil.Cil.Instruction instruction)
{
if (instruction.Operand == null)
return null;
var nextInstruction = instruction.Operand as Mono.Cecil.Cil.Instruction;
if (nextInstruction != null)
return ReadOperand(nextInstruction);
return instruction.Operand;
}
/// <summary>
/// Reads generic arguments from type and returns them as a set of types
/// </summary>
@ -473,25 +498,6 @@ namespace ICSharpCode.CodeQualityAnalysis @@ -473,25 +498,6 @@ namespace ICSharpCode.CodeQualityAnalysis
return types;
}
/// <summary>
/// Reads instruction operand by recursive calling until non-instruction
/// operand is found
/// </summary>
/// <param name="instruction">An instruction with operand</param>
/// <returns>An instruction operand</returns>
public object ReadInstruction(Instruction instruction)
{
if (instruction.Operand == null)
return null;
var nextInstruction = instruction.Operand as Instruction;
if (nextInstruction != null)
return ReadInstruction(nextInstruction);
return instruction.Operand;
}
/// <summary>
/// Formats method name by adding parameters to it. If there are not any parameters
/// only empty brackers will be added.

7
src/AddIns/Analysis/CodeQuality/Src/Module.cs

@ -95,6 +95,13 @@ namespace ICSharpCode.CodeQualityAnalysis @@ -95,6 +95,13 @@ namespace ICSharpCode.CodeQualityAnalysis
}
}
public int InstructionsCount
{
get {
return Namespaces.Sum(ns => ns.Types.Sum(type => type.Methods.Sum(method => method.Instructions.Count)));
}
}
public string GetInfo()
{
var builder = new StringBuilder();

Loading…
Cancel
Save