Browse Source

Merge branch 'master' into bookmarks

pull/263/head
Ronny Klier 14 years ago
parent
commit
9a160befbd
  1. 8
      Debugger/ILSpy.Debugger/Commands/BreakpointCommand.cs
  2. 1
      Debugger/ILSpy.Debugger/Commands/DebuggerCommands.cs
  3. 5
      Debugger/ILSpy.Debugger/ILSpy.Debugger.csproj
  4. 10
      Debugger/ILSpy.Debugger/Services/Debugger/WindowsDebugger.cs
  5. 3
      ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs
  6. 57
      ICSharpCode.Decompiler/Ast/TextOutputFormatter.cs
  7. 23
      ICSharpCode.Decompiler/Ast/Transforms/DeclareVariables.cs
  8. 15
      ICSharpCode.Decompiler/Ast/Transforms/DelegateConstruction.cs
  9. 11
      ICSharpCode.Decompiler/Ast/Transforms/PatternStatementTransform.cs
  10. 4
      ICSharpCode.Decompiler/ILAst/ILAstBuilder.cs
  11. 2
      ICSharpCode.Decompiler/ITextOutput.cs
  12. 2
      ICSharpCode.Decompiler/PlainTextOutput.cs
  13. 23
      ILSpy.BamlDecompiler/CecilTypeResolver.cs
  14. 47
      ILSpy.SharpDevelop.LGPL/AvalonEdit/IconBarMargin.cs
  15. 4
      ILSpy.SharpDevelop.LGPL/AvalonEdit/TextMarkerService.cs
  16. 19
      ILSpy.SharpDevelop.LGPL/Bookmarks/BreakpointBookmark.cs
  17. 10
      ILSpy.SharpDevelop.LGPL/Bookmarks/CurrentLineBookmark.cs
  18. 5
      ILSpy.SharpDevelop.LGPL/DebugInformation.cs
  19. 6
      ILSpy.SharpDevelop.LGPL/ILSpy.SharpDevelop.LGPL.csproj
  20. 2
      ILSpy.SharpDevelop.LGPL/Models/ToolTipRequestEventArgs.cs
  21. 20
      ILSpy.SharpDevelop.LGPL/Services/DebuggerService.cs
  22. 0
      ILSpy.SharpDevelop.LGPL/Services/IDebugger.cs
  23. 11
      ILSpy.SharpDevelop.LGPL/Services/ParserService.cs
  24. 4
      ILSpy/AboutPage.cs
  25. 10
      ILSpy/App.xaml.cs
  26. 9
      ILSpy/TextView/AvalonEditTextOutput.cs
  27. 32
      ILSpy/TextView/DecompilerTextView.cs
  28. 3
      ILSpy/TextView/ReferenceElementGenerator.cs
  29. 8
      ILSpy/TreeNodes/EventTreeNode.cs
  30. 6
      ILSpy/TreeNodes/FieldTreeNode.cs
  31. 13
      ILSpy/TreeNodes/ILSpyTreeNode.cs
  32. 6
      ILSpy/TreeNodes/MethodTreeNode.cs
  33. 13
      ILSpy/TreeNodes/PropertyTreeNode.cs
  34. 2
      ILSpy/TreeNodes/TypeTreeNode.cs
  35. 41
      ILSpy/XmlDoc/XmlDocKeyProvider.cs
  36. 3
      ILSpy/XmlDoc/XmlDocLoader.cs
  37. 5
      SharpTreeView/SharpTreeNode.cs
  38. 4
      SharpTreeView/Themes/Generic.xaml

8
Debugger/ILSpy.Debugger/Commands/BreakpointCommand.cs

@ -36,14 +36,10 @@ namespace ICSharpCode.ILSpy.Debugger.Commands @@ -36,14 +36,10 @@ namespace ICSharpCode.ILSpy.Debugger.Commands
}
// no bookmark on the line: create a new breakpoint
MemberReference memberReference;
if (!DebugInformation.DecompiledMemberReferences.TryGetValue(storageEntry.Key, out memberReference)) {
continue;
}
DebuggerService.ToggleBreakpointAt(
memberReference,
instruction.MemberMapping.MemberReference,
line,
token,
instruction.ILInstructionOffset,
DebugInformation.Language);
break;

1
Debugger/ILSpy.Debugger/Commands/DebuggerCommands.cs

@ -307,6 +307,7 @@ namespace ICSharpCode.ILSpy.Debugger.Commands @@ -307,6 +307,7 @@ namespace ICSharpCode.ILSpy.Debugger.Commands
public override void Execute(object parameter)
{
if (CurrentDebugger.IsDebugging && !CurrentDebugger.IsProcessRunning) {
CurrentLineBookmark.Remove();
CurrentDebugger.Continue();
MainWindow.Instance.SetStatus("Running...", Brushes.Black);
}

5
Debugger/ILSpy.Debugger/ILSpy.Debugger.csproj

@ -87,8 +87,6 @@ @@ -87,8 +87,6 @@
<Compile Include="Models\TreeModel\TreeNode.cs" />
<Compile Include="Models\TreeModel\Utils.cs" />
<Compile Include="Services\Debugger\DebuggerHelper.cs" />
<Compile Include="Services\Debugger\DebuggerService.cs" />
<Compile Include="Services\Debugger\IDebugger.cs" />
<Compile Include="Services\Debugger\ListHelper.cs" />
<Compile Include="Services\Debugger\TypeResolverExtension.cs" />
<Compile Include="Services\Debugger\WindowsDebugger.cs" />
@ -96,13 +94,11 @@ @@ -96,13 +94,11 @@
<Compile Include="Services\ImageService\ImageService.cs" />
<Compile Include="Models\RunningProcess.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Services\ParserService\ParserService.cs" />
<Compile Include="ToolTips\DebuggerPopup.cs" />
<Compile Include="ToolTips\DebuggerTooltipControl.xaml.cs">
<DependentUpon>DebuggerTooltipControl.xaml</DependentUpon>
</Compile>
<Compile Include="ToolTips\LazyItemsControl.cs" />
<Compile Include="ToolTips\Models\ToolTipRequestEventArgs.cs" />
<Compile Include="ToolTips\TextEditorListener.cs" />
<Compile Include="ToolTips\VirtualizingIEnumerable.cs" />
<Compile Include="UI\AttachToProcessWindow.xaml.cs">
@ -131,7 +127,6 @@ @@ -131,7 +127,6 @@
<Folder Include="Models\TreeModel" />
<Folder Include="Commands" />
<Folder Include="ToolTips" />
<Folder Include="ToolTips\Models" />
</ItemGroup>
<ItemGroup>
<Page Include="ToolTips\DebuggerTooltipControl.xaml" />

10
Debugger/ILSpy.Debugger/Services/Debugger/WindowsDebugger.cs

@ -1,6 +1,7 @@ @@ -1,6 +1,7 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.ComponentModel.Composition;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
@ -27,6 +28,7 @@ using StackFrame = Debugger.StackFrame; @@ -27,6 +28,7 @@ using StackFrame = Debugger.StackFrame;
namespace ICSharpCode.ILSpy.Debugger.Services
{
[Export(typeof(IDebugger))]
public class WindowsDebugger : IDebugger
{
enum StopAttachedProcessDialogResult {
@ -283,7 +285,7 @@ namespace ICSharpCode.ILSpy.Debugger.Services @@ -283,7 +285,7 @@ namespace ICSharpCode.ILSpy.Debugger.Services
int key = frame.MethodInfo.MetadataToken;
// get the mapped instruction from the current line marker or the next one
if (!DebugInformation.CodeMappings.ContainsKey(key))
if (DebugInformation.CodeMappings == null || !DebugInformation.CodeMappings.ContainsKey(key))
return null;
return DebugInformation.CodeMappings[key].GetInstructionByTokenAndOffset(key, frame.IP, out isMatch);
@ -550,7 +552,7 @@ namespace ICSharpCode.ILSpy.Debugger.Services @@ -550,7 +552,7 @@ namespace ICSharpCode.ILSpy.Debugger.Services
debugger,
bookmark.MemberReference.DeclaringType.FullName,
bookmark.LineNumber,
bookmark.MemberReference.MetadataToken.ToInt32(),
bookmark.FunctionToken,
bookmark.ILRange.From,
bookmark.IsEnabled);
@ -796,12 +798,12 @@ namespace ICSharpCode.ILSpy.Debugger.Services @@ -796,12 +798,12 @@ namespace ICSharpCode.ILSpy.Debugger.Services
int line;
MemberReference memberReference;
if (null != DebugInformation.CodeMappings &&
if (DebugInformation.CodeMappings != null &&
DebugInformation.CodeMappings.ContainsKey(token) &&
DebugInformation.CodeMappings[token].GetInstructionByTokenAndOffset(token, ilOffset, out memberReference, out line)) {
DebugInformation.DebugStepInformation = null; // we do not need to step into/out
DebuggerService.RemoveCurrentLineMarker();
DebuggerService.JumpToCurrentLine(memberReference, line, 0, line, 0);
DebuggerService.JumpToCurrentLine(memberReference, line, 0, line, 0, ilOffset);
}
else {
StepIntoUnknownFrame(frame);

3
ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs

@ -128,6 +128,7 @@ namespace ICSharpCode.Decompiler.Ast @@ -128,6 +128,7 @@ namespace ICSharpCode.Decompiler.Ast
else
type = AstBuilder.ConvertType(v.Type);
var newVarDecl = new VariableDeclarationStatement(type, v.Name);
newVarDecl.Variables.Single().AddAnnotation(v);
astBlock.Statements.InsertBefore(insertionPoint, newVarDecl);
}
@ -210,7 +211,7 @@ namespace ICSharpCode.Decompiler.Ast @@ -210,7 +211,7 @@ namespace ICSharpCode.Decompiler.Ast
Type = AstBuilder.ConvertType(catchClause.ExceptionType),
VariableName = catchClause.ExceptionVariable == null ? null : catchClause.ExceptionVariable.Name,
Body = TransformBlock(catchClause)
});
}.WithAnnotation(catchClause.ExceptionVariable));
}
}
if (tryCatchNode.FinallyBlock != null)

57
ICSharpCode.Decompiler/Ast/TextOutputFormatter.cs

@ -43,11 +43,25 @@ namespace ICSharpCode.Decompiler.Ast @@ -43,11 +43,25 @@ namespace ICSharpCode.Decompiler.Ast
public void WriteIdentifier(string identifier)
{
MemberReference memberRef = GetCurrentMemberReference();
object memberRef = GetCurrentMemberReference();
if (memberRef != null)
if (memberRef != null) {
output.WriteReference(identifier, memberRef);
else
return;
}
var definition = GetCurrentLocalDefinition();
if (definition != null) {
output.WriteDefinition(identifier, definition);
return;
}
memberRef = GetCurrentLocalReference();
if (memberRef != null) {
output.WriteReference(identifier, memberRef, true);
return;
}
output.Write(identifier);
}
@ -61,6 +75,43 @@ namespace ICSharpCode.Decompiler.Ast @@ -61,6 +75,43 @@ namespace ICSharpCode.Decompiler.Ast
return memberRef;
}
object GetCurrentLocalReference()
{
AstNode node = nodeStack.Peek();
ILVariable variable = node.Annotation<ILVariable>();
if (variable != null) {
if (variable.OriginalParameter != null)
return variable.OriginalParameter;
//if (variable.OriginalVariable != null)
// return variable.OriginalVariable;
return variable;
}
return null;
}
object GetCurrentLocalDefinition()
{
AstNode node = nodeStack.Peek();
var parameterDef = node.Annotation<ParameterDefinition>();
if (parameterDef != null)
return parameterDef;
if (node is VariableInitializer || node is CatchClause || node is ForeachStatement) {
var variable = node.Annotation<ILVariable>();
if (variable != null) {
if (variable.OriginalParameter != null)
return variable.OriginalParameter;
//if (variable.OriginalVariable != null)
// return variable.OriginalVariable;
return variable;
} else {
}
}
return null;
}
public void WriteKeyword(string keyword)
{
output.Write(keyword);

23
ICSharpCode.Decompiler/Ast/Transforms/DeclareVariables.cs

@ -21,6 +21,7 @@ using System.Collections.Generic; @@ -21,6 +21,7 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using ICSharpCode.Decompiler.ILAst;
using ICSharpCode.NRefactory.CSharp;
using ICSharpCode.NRefactory.CSharp.Analysis;
@ -35,6 +36,7 @@ namespace ICSharpCode.Decompiler.Ast.Transforms @@ -35,6 +36,7 @@ namespace ICSharpCode.Decompiler.Ast.Transforms
{
public AstType Type;
public string Name;
public ILVariable ILVariable;
public AssignmentExpression ReplacedAssignment;
public Statement InsertionPoint;
@ -67,9 +69,10 @@ namespace ICSharpCode.Decompiler.Ast.Transforms @@ -67,9 +69,10 @@ namespace ICSharpCode.Decompiler.Ast.Transforms
if (v.ReplacedAssignment != null) {
// We clone the right expression so that it doesn't get removed from the old ExpressionStatement,
// which might be still in use by the definite assignment graph.
VariableInitializer initializer = new VariableInitializer(v.Name, v.ReplacedAssignment.Right.Detach()).CopyAnnotationsFrom(v.ReplacedAssignment).WithAnnotation(v.ILVariable);
VariableDeclarationStatement varDecl = new VariableDeclarationStatement {
Type = (AstType)v.Type.Clone(),
Variables = { new VariableInitializer(v.Name, v.ReplacedAssignment.Right.Detach()).CopyAnnotationsFrom(v.ReplacedAssignment) }
Variables = { initializer }
};
ExpressionStatement es = v.ReplacedAssignment.Parent as ExpressionStatement;
if (es != null) {
@ -100,9 +103,11 @@ namespace ICSharpCode.Decompiler.Ast.Transforms @@ -100,9 +103,11 @@ namespace ICSharpCode.Decompiler.Ast.Transforms
daa = new DefiniteAssignmentAnalysis(block, cancellationToken);
}
foreach (VariableDeclarationStatement varDecl in variables) {
string variableName = varDecl.Variables.Single().Name;
bool allowPassIntoLoops = varDecl.Variables.Single().Annotation<DelegateConstruction.CapturedVariableAnnotation>() == null;
DeclareVariableInBlock(daa, block, varDecl.Type, variableName, allowPassIntoLoops);
VariableInitializer initializer = varDecl.Variables.Single();
string variableName = initializer.Name;
ILVariable v = initializer.Annotation<ILVariable>();
bool allowPassIntoLoops = initializer.Annotation<DelegateConstruction.CapturedVariableAnnotation>() == null;
DeclareVariableInBlock(daa, block, varDecl.Type, variableName, v, allowPassIntoLoops);
}
}
}
@ -111,7 +116,7 @@ namespace ICSharpCode.Decompiler.Ast.Transforms @@ -111,7 +116,7 @@ namespace ICSharpCode.Decompiler.Ast.Transforms
}
}
void DeclareVariableInBlock(DefiniteAssignmentAnalysis daa, BlockStatement block, AstType type, string variableName, bool allowPassIntoLoops)
void DeclareVariableInBlock(DefiniteAssignmentAnalysis daa, BlockStatement block, AstType type, string variableName, ILVariable v, bool allowPassIntoLoops)
{
// declarationPoint: The point where the variable would be declared, if we decide to declare it in this block
Statement declarationPoint = null;
@ -139,10 +144,10 @@ namespace ICSharpCode.Decompiler.Ast.Transforms @@ -139,10 +144,10 @@ namespace ICSharpCode.Decompiler.Ast.Transforms
foreach (AstNode child in stmt.Children) {
BlockStatement subBlock = child as BlockStatement;
if (subBlock != null) {
DeclareVariableInBlock(daa, subBlock, type, variableName, allowPassIntoLoops);
DeclareVariableInBlock(daa, subBlock, type, variableName, v, allowPassIntoLoops);
} else if (HasNestedBlocks(child)) {
foreach (BlockStatement nestedSubBlock in child.Children.OfType<BlockStatement>()) {
DeclareVariableInBlock(daa, nestedSubBlock, type, variableName, allowPassIntoLoops);
DeclareVariableInBlock(daa, nestedSubBlock, type, variableName, v, allowPassIntoLoops);
}
}
}
@ -151,7 +156,7 @@ namespace ICSharpCode.Decompiler.Ast.Transforms @@ -151,7 +156,7 @@ namespace ICSharpCode.Decompiler.Ast.Transforms
// Try converting an assignment expression into a VariableDeclarationStatement
if (!TryConvertAssignmentExpressionIntoVariableDeclaration(declarationPoint, type, variableName)) {
// Declare the variable in front of declarationPoint
variablesToDeclare.Add(new VariableToDeclare { Type = type, Name = variableName, InsertionPoint = declarationPoint });
variablesToDeclare.Add(new VariableToDeclare { Type = type, Name = variableName, ILVariable = v, InsertionPoint = declarationPoint });
}
}
}
@ -172,7 +177,7 @@ namespace ICSharpCode.Decompiler.Ast.Transforms @@ -172,7 +177,7 @@ namespace ICSharpCode.Decompiler.Ast.Transforms
if (ae != null && ae.Operator == AssignmentOperatorType.Assign) {
IdentifierExpression ident = ae.Left as IdentifierExpression;
if (ident != null && ident.Identifier == variableName) {
variablesToDeclare.Add(new VariableToDeclare { Type = type, Name = variableName, ReplacedAssignment = ae });
variablesToDeclare.Add(new VariableToDeclare { Type = type, Name = variableName, ILVariable = ident.Annotation<ILVariable>(), ReplacedAssignment = ae });
return true;
}
}

15
ICSharpCode.Decompiler/Ast/Transforms/DelegateConstruction.cs

@ -386,7 +386,7 @@ namespace ICSharpCode.Decompiler.Ast.Transforms @@ -386,7 +386,7 @@ namespace ICSharpCode.Decompiler.Ast.Transforms
}
// Now create variables for all fields of the display class (except for those that we already handled as parameters)
List<Tuple<AstType, string>> variablesToDeclare = new List<Tuple<AstType, string>>();
List<Tuple<AstType, ILVariable>> variablesToDeclare = new List<Tuple<AstType, ILVariable>>();
foreach (FieldDefinition field in type.Fields) {
if (field.IsStatic)
continue; // skip static fields
@ -397,8 +397,14 @@ namespace ICSharpCode.Decompiler.Ast.Transforms @@ -397,8 +397,14 @@ namespace ICSharpCode.Decompiler.Ast.Transforms
capturedVariableName = capturedVariableName.Substring(10);
EnsureVariableNameIsAvailable(blockStatement, capturedVariableName);
currentlyUsedVariableNames.Add(capturedVariableName);
variablesToDeclare.Add(Tuple.Create(AstBuilder.ConvertType(field.FieldType, field), capturedVariableName));
dict[field] = new IdentifierExpression(capturedVariableName);
ILVariable ilVar = new ILVariable
{
IsGenerated = true,
Name = capturedVariableName,
Type = field.FieldType,
};
variablesToDeclare.Add(Tuple.Create(AstBuilder.ConvertType(field.FieldType, field), ilVar));
dict[field] = new IdentifierExpression(capturedVariableName).WithAnnotation(ilVar);
}
// Now figure out where the closure was accessed and use the simpler replacement expression there:
@ -414,8 +420,9 @@ namespace ICSharpCode.Decompiler.Ast.Transforms @@ -414,8 +420,9 @@ namespace ICSharpCode.Decompiler.Ast.Transforms
// Now insert the variable declarations (we can do this after the replacements only so that the scope detection works):
Statement insertionPoint = blockStatement.Statements.FirstOrDefault();
foreach (var tuple in variablesToDeclare) {
var newVarDecl = new VariableDeclarationStatement(tuple.Item1, tuple.Item2);
var newVarDecl = new VariableDeclarationStatement(tuple.Item1, tuple.Item2.Name);
newVarDecl.Variables.Single().AddAnnotation(new CapturedVariableAnnotation());
newVarDecl.Variables.Single().AddAnnotation(tuple.Item2);
blockStatement.Statements.InsertBefore(insertionPoint, newVarDecl);
}
}

11
ICSharpCode.Decompiler/Ast/Transforms/PatternStatementTransform.cs

@ -227,6 +227,7 @@ namespace ICSharpCode.Decompiler.Ast.Transforms @@ -227,6 +227,7 @@ namespace ICSharpCode.Decompiler.Ast.Transforms
Name = variableName,
Initializer = m1.Get<Expression>("initializer").Single().Detach()
}.CopyAnnotationsFrom(node.Expression)
.WithAnnotation(m1.Get<AstNode>("variable").Single().Annotation<ILVariable>())
}
}.CopyAnnotationsFrom(node);
} else {
@ -382,7 +383,7 @@ namespace ICSharpCode.Decompiler.Ast.Transforms @@ -382,7 +383,7 @@ namespace ICSharpCode.Decompiler.Ast.Transforms
VariableName = itemVar.Identifier,
InExpression = m.Get<Expression>("collection").Single().Detach(),
EmbeddedStatement = newBody
};
}.WithAnnotation(itemVarDecl.Variables.Single().Annotation<ILVariable>());
if (foreachStatement.InExpression is BaseReferenceExpression) {
foreachStatement.InExpression = new ThisReferenceExpression().CopyAnnotationsFrom(foreachStatement.InExpression);
}
@ -472,9 +473,11 @@ namespace ICSharpCode.Decompiler.Ast.Transforms @@ -472,9 +473,11 @@ namespace ICSharpCode.Decompiler.Ast.Transforms
if (declarationPoint != loop)
return null;
ForeachStatement foreachStatement = new ForeachStatement();
foreachStatement.VariableType = itemVarDecl.Type.Clone();
foreachStatement.VariableName = itemVar.Identifier;
ForeachStatement foreachStatement = new ForeachStatement
{
VariableType = itemVarDecl.Type.Clone(),
VariableName = itemVar.Identifier,
}.WithAnnotation(itemVarDecl.Variables.Single().Annotation<ILVariable>());
BlockStatement body = new BlockStatement();
foreachStatement.EmbeddedStatement = body;
((BlockStatement)node.Parent).Statements.InsertBefore(node, foreachStatement);

4
ICSharpCode.Decompiler/ILAst/ILAstBuilder.cs

@ -632,6 +632,10 @@ namespace ICSharpCode.Decompiler.ILAst @@ -632,6 +632,10 @@ namespace ICSharpCode.Decompiler.ILAst
foreach (ParameterDefinition p in methodDef.Parameters) {
this.Parameters.Add(new ILVariable { Type = p.ParameterType, Name = p.Name, OriginalParameter = p });
}
if (this.Parameters.Count > 0 && (methodDef.IsSetter || methodDef.IsAddOn || methodDef.IsRemoveOn)) {
// last parameter must be 'value', so rename it
this.Parameters.Last().Name = "value";
}
foreach (ByteCode byteCode in body) {
ParameterDefinition p;
switch (byteCode.Code) {

2
ICSharpCode.Decompiler/ITextOutput.cs

@ -31,7 +31,7 @@ namespace ICSharpCode.Decompiler @@ -31,7 +31,7 @@ namespace ICSharpCode.Decompiler
void Write(string text);
void WriteLine();
void WriteDefinition(string text, object definition);
void WriteReference(string text, object reference);
void WriteReference(string text, object reference, bool isLocal = false);
void MarkFoldStart(string collapsedText = "...", bool defaultCollapsed = false);
void MarkFoldEnd();

2
ICSharpCode.Decompiler/PlainTextOutput.cs

@ -99,7 +99,7 @@ namespace ICSharpCode.Decompiler @@ -99,7 +99,7 @@ namespace ICSharpCode.Decompiler
Write(text);
}
public void WriteReference(string text, object reference)
public void WriteReference(string text, object reference, bool isLocal)
{
Write(text);
}

23
ILSpy.BamlDecompiler/CecilTypeResolver.cs

@ -48,16 +48,39 @@ namespace ILSpy.BamlDecompiler @@ -48,16 +48,39 @@ namespace ILSpy.BamlDecompiler
string assemblyName = name.Substring(comma + 1).Trim();
var type = thisAssembly.MainModule.GetType(fullName);
if (type == null) {
type = TryFindInExportedTypes(fullName, thisAssembly);
}
if (type == null) {
var otherAssembly = resolver.Resolve(assemblyName);
if (otherAssembly == null)
throw new Exception("could not resolve '" + assemblyName + "'!");
type = otherAssembly.MainModule.GetType(fullName.Replace('+', '/'));
if (type == null) {
type = TryFindInExportedTypes(fullName, otherAssembly);
}
}
if (type == null)
throw new Exception("could not resolve '" + name + "'!");
return new CecilType(type);
}
TypeDefinition TryFindInExportedTypes(string fullName, AssemblyDefinition asm)
{
foreach (var exportedType in asm.MainModule.ExportedTypes) {
if (exportedType.IsForwarder && exportedType.FullName == fullName) {
return exportedType.Resolve();
}
}
return null;
}
public IDependencyPropertyDescriptor GetDependencyPropertyDescriptor(string name, IType ownerType, IType targetType)
{
if (!(ownerType is CecilType))

47
ILSpy.SharpDevelop.LGPL/AvalonEdit/IconBarMargin.cs

@ -15,6 +15,7 @@ using ICSharpCode.Decompiler; @@ -15,6 +15,7 @@ using ICSharpCode.Decompiler;
using ICSharpCode.ILSpy.Bookmarks;
using ICSharpCode.ILSpy.Debugger;
using ICSharpCode.ILSpy.Debugger.Bookmarks;
using ICSharpCode.ILSpy.Debugger.Services;
using ICSharpCode.NRefactory.CSharp;
using Mono.Cecil;
@ -70,10 +71,15 @@ namespace ICSharpCode.ILSpy.AvalonEdit @@ -70,10 +71,15 @@ namespace ICSharpCode.ILSpy.AvalonEdit
// create a dictionary line number => first bookmark
Dictionary<int, IBookmark> bookmarkDict = new Dictionary<int, IBookmark>();
foreach (var bm in BookmarkManager.Bookmarks) {
if (bm is BreakpointBookmark) {
if (DebugInformation.CodeMappings == null || DebugInformation.CodeMappings.Count == 0 ||
!DebugInformation.CodeMappings.ContainsKey(((BreakpointBookmark)bm).FunctionToken))
continue;
} else {
if (DebugInformation.DecompiledMemberReferences == null || DebugInformation.DecompiledMemberReferences.Count == 0 ||
!DebugInformation.DecompiledMemberReferences.ContainsKey(bm.MemberReference.MetadataToken.ToInt32()))
!DebugInformation.DecompiledMemberReferences.ContainsKey(((MarkerBookmark)bm).MemberReference.MetadataToken.ToInt32()))
continue;
}
int line = bm.LineNumber;
IBookmark existingBookmark;
if (!bookmarkDict.TryGetValue(line, out existingBookmark) || bm.ZOrder > existingBookmark.ZOrder)
@ -281,6 +287,7 @@ namespace ICSharpCode.ILSpy.AvalonEdit @@ -281,6 +287,7 @@ namespace ICSharpCode.ILSpy.AvalonEdit
if (storage == null || storage.Count == 0)
return;
// TODO: handle other types of bookmarks
// remove existing bookmarks and create new ones
// update of existing bookmarks for new position does not update TextMarker
// this is only done in TextMarkerService handlers for BookmarkManager.Added/Removed
@ -290,25 +297,23 @@ namespace ICSharpCode.ILSpy.AvalonEdit @@ -290,25 +297,23 @@ namespace ICSharpCode.ILSpy.AvalonEdit
if (breakpoint == null)
continue;
var key = breakpoint.MemberReference.MetadataToken.ToInt32();
var key = breakpoint.FunctionToken;
if (!storage.ContainsKey(key))
{
continue;
}
var member = DebugInformation.DecompiledMemberReferences[key];
bool isMatch;
SourceCodeMapping map = storage[key].GetInstructionByTokenAndOffset(
member.MetadataToken.ToInt32(), breakpoint.ILRange.From, out isMatch);
SourceCodeMapping map = storage[key].GetInstructionByTokenAndOffset(key, breakpoint.ILRange.From, out isMatch);
if (map != null) {
BreakpointBookmark newBookmark = new BreakpointBookmark(
member, new AstLocation(map.SourceCodeLine, 0),
breakpoint.MemberReference, new AstLocation(map.SourceCodeLine, 0), breakpoint.FunctionToken,
map.ILInstructionOffset, BreakpointAction.Break, DebugInformation.Language);
newBookmark.IsEnabled = breakpoint.IsEnabled;
newBookmarks.Add(newBookmark);
BookmarkManager.RemoveMark(breakpoint);
}
}
@ -322,33 +327,25 @@ namespace ICSharpCode.ILSpy.AvalonEdit @@ -322,33 +327,25 @@ namespace ICSharpCode.ILSpy.AvalonEdit
if (CurrentLineBookmark.Instance == null)
return;
var oldMappings = DebugInformation.OldCodeMappings;
var newMappings = DebugInformation.CodeMappings;
if (oldMappings == null || newMappings == null)
var codeMappings = DebugInformation.CodeMappings;
if (codeMappings == null)
return;
// 1. Save it's data
int line = CurrentLineBookmark.Instance.LineNumber;
var markerType = CurrentLineBookmark.Instance.MemberReference;
int token = markerType.MetadataToken.ToInt32();
int offset = CurrentLineBookmark.Instance.ILOffset;
if (!oldMappings.ContainsKey(markerType.MetadataToken.ToInt32()) || !newMappings.ContainsKey(markerType.MetadataToken.ToInt32()))
return;
// 2. Remove it
CurrentLineBookmark.Remove();
// 3. map the marker line
int token;
var instruction = oldMappings[markerType.MetadataToken.ToInt32()].GetInstructionByLineNumber(line, out token);
if (instruction == null)
if (!codeMappings.ContainsKey(token))
return;
// 2. map the marker line
MemberReference memberReference;
int newline;
if (newMappings[markerType.MetadataToken.ToInt32()].GetInstructionByTokenAndOffset(token, instruction.ILInstructionOffset.From, out memberReference, out newline)) {
// 4. create breakpoint for new languages
CurrentLineBookmark.SetPosition(memberReference, newline, 0, newline, 0);
if (codeMappings[token].GetInstructionByTokenAndOffset(token, offset, out memberReference, out newline)) {
// 3. create breakpoint for new languages
DebuggerService.JumpToCurrentLine(memberReference, newline, 0, newline, 0, offset);
}
}
}

4
ILSpy.SharpDevelop.LGPL/AvalonEdit/TextMarkerService.cs

@ -123,7 +123,7 @@ namespace ICSharpCode.ILSpy.AvalonEdit @@ -123,7 +123,7 @@ namespace ICSharpCode.ILSpy.AvalonEdit
int lineStart = line.Offset;
int lineEnd = lineStart + line.Length;
foreach (TextMarker marker in markers.FindOverlappingSegments(lineStart, line.Length).Reverse()) {
if (!marker.IsVisible(marker.Bookmark))
if (marker.Bookmark != null && !marker.IsVisible(marker.Bookmark))
continue;
Brush foregroundBrush = null;
@ -166,7 +166,7 @@ namespace ICSharpCode.ILSpy.AvalonEdit @@ -166,7 +166,7 @@ namespace ICSharpCode.ILSpy.AvalonEdit
int viewStart = visualLines.First().FirstDocumentLine.Offset;
int viewEnd = visualLines.Last().LastDocumentLine.Offset + visualLines.Last().LastDocumentLine.Length;
foreach (TextMarker marker in markers.FindOverlappingSegments(viewStart, viewEnd - viewStart).Reverse()) {
if (!marker.IsVisible(marker.Bookmark))
if (marker.Bookmark != null && !marker.IsVisible(marker.Bookmark))
continue;
if (marker.BackgroundColor != null) {

19
ILSpy.SharpDevelop.LGPL/Bookmarks/BreakpointBookmark.cs

@ -40,7 +40,16 @@ namespace ICSharpCode.ILSpy.Debugger.Bookmarks @@ -40,7 +40,16 @@ namespace ICSharpCode.ILSpy.Debugger.Bookmarks
}
}
public ILRange ILRange { get; set; }
/// <summary>
/// Gets the function/method where the breakpoint is set.
/// <remarks>
/// In case of methods, it is the same as the MemberReference metadata token.<br/>
/// In case of properties and events, it's the GetMethod/SetMethod|AddMethod/RemoveMethod token.
/// </remarks>
/// </summary>
public int FunctionToken { get; private set; }
public ILRange ILRange { get; private set; }
public virtual bool IsHealthy {
get {
@ -74,9 +83,11 @@ namespace ICSharpCode.ILSpy.Debugger.Bookmarks @@ -74,9 +83,11 @@ namespace ICSharpCode.ILSpy.Debugger.Bookmarks
public string Tooltip { get; private set; }
public BreakpointBookmark(MemberReference member, AstLocation location, ILRange range, BreakpointAction action, DecompiledLanguages language) : base(member, location)
public BreakpointBookmark(MemberReference member, AstLocation location, int functionToken, ILRange range, BreakpointAction action, DecompiledLanguages language)
: base(member, location)
{
this.action = action;
this.FunctionToken = functionToken;
this.ILRange = range;
this.Tooltip = string.Format("Language:{0}, Line:{1}, IL range:{2}-{3}", language.ToString(), location.Line, range.From, range.To);
this.Language = language;
@ -95,8 +106,8 @@ namespace ICSharpCode.ILSpy.Debugger.Bookmarks @@ -95,8 +106,8 @@ namespace ICSharpCode.ILSpy.Debugger.Bookmarks
ITextMarker marker = markerService.Create(offset, length);
marker.BackgroundColor = Color.FromRgb(180, 38, 38);
marker.ForegroundColor = Colors.White;
marker.IsVisible = b => b is MarkerBookmark && DebugInformation.DecompiledMemberReferences != null &&
DebugInformation.DecompiledMemberReferences.ContainsKey(((MarkerBookmark)b).MemberReference.MetadataToken.ToInt32());
marker.IsVisible = b => b is BreakpointBookmark && DebugInformation.CodeMappings != null &&
DebugInformation.CodeMappings.ContainsKey(((BreakpointBookmark)b).FunctionToken);
marker.Bookmark = this;
this.Marker = marker;

10
ILSpy.SharpDevelop.LGPL/Bookmarks/CurrentLineBookmark.cs

@ -24,7 +24,7 @@ namespace ICSharpCode.ILSpy.Debugger.Bookmarks @@ -24,7 +24,7 @@ namespace ICSharpCode.ILSpy.Debugger.Bookmarks
static int endLine;
static int endColumn;
public static void SetPosition(MemberReference memberReference, int makerStartLine, int makerStartColumn, int makerEndLine, int makerEndColumn)
public static void SetPosition(MemberReference memberReference, int makerStartLine, int makerStartColumn, int makerEndLine, int makerEndColumn, int ilOffset)
{
Remove();
@ -33,7 +33,7 @@ namespace ICSharpCode.ILSpy.Debugger.Bookmarks @@ -33,7 +33,7 @@ namespace ICSharpCode.ILSpy.Debugger.Bookmarks
endLine = makerEndLine;
endColumn = makerEndColumn;
instance = new CurrentLineBookmark(memberReference, new AstLocation(startLine, startColumn));
instance = new CurrentLineBookmark(memberReference, new AstLocation(startLine, startColumn), ilOffset);
BookmarkManager.AddMark(instance);
}
@ -53,11 +53,13 @@ namespace ICSharpCode.ILSpy.Debugger.Bookmarks @@ -53,11 +53,13 @@ namespace ICSharpCode.ILSpy.Debugger.Bookmarks
get { return 100; }
}
private CurrentLineBookmark(MemberReference member, AstLocation location) : base(member, location)
private CurrentLineBookmark(MemberReference member, AstLocation location, int ilOffset) : base(member, location)
{
this.ILOffset = ilOffset;
}
public int ILOffset { get; private set; }
public override ImageSource Image {
get { return Images.CurrentLine; }
}

5
ILSpy.SharpDevelop.LGPL/DebugInformation.cs

@ -47,11 +47,6 @@ namespace ICSharpCode.ILSpy.Debugger @@ -47,11 +47,6 @@ namespace ICSharpCode.ILSpy.Debugger
/// </summary>
public static ConcurrentDictionary<int, IEnumerable<ILVariable>> LocalVariables { get; set; }
/// <summary>
/// Gets or sets the old code mappings.
/// </summary>
public static Dictionary<int, List<MemberMapping>> OldCodeMappings { get; set; }
/// <summary>
/// Gets or sets the MembeReference that was decompiled (a TypeDefinition, MethodDefinition, etc)
/// </summary>

6
ILSpy.SharpDevelop.LGPL/ILSpy.SharpDevelop.LGPL.csproj

@ -76,11 +76,17 @@ @@ -76,11 +76,17 @@
<Compile Include="Bookmarks\MarkerBookmark.cs" />
<Compile Include="DebugInformation.cs" />
<Compile Include="Images.cs" />
<Compile Include="Models\ToolTipRequestEventArgs.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Services\DebuggerService.cs" />
<Compile Include="Services\IDebugger.cs" />
<Compile Include="Services\ParserService.cs" />
</ItemGroup>
<ItemGroup>
<Folder Include="AvalonEdit" />
<Folder Include="Bookmarks" />
<Folder Include="Models" />
<Folder Include="Services" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\AvalonEdit\ICSharpCode.AvalonEdit\ICSharpCode.AvalonEdit.csproj">

2
Debugger/ILSpy.Debugger/ToolTips/Models/ToolTipRequestEventArgs.cs → ILSpy.SharpDevelop.LGPL/Models/ToolTipRequestEventArgs.cs

@ -7,7 +7,7 @@ using ICSharpCode.NRefactory.CSharp; @@ -7,7 +7,7 @@ using ICSharpCode.NRefactory.CSharp;
namespace ICSharpCode.ILSpy.Debugger.Tooltips
{
internal class ToolTipRequestEventArgs : EventArgs
public class ToolTipRequestEventArgs : EventArgs
{
/// <summary>
/// Gets whether the tool tip request was handled.

20
Debugger/ILSpy.Debugger/Services/Debugger/DebuggerService.cs → ILSpy.SharpDevelop.LGPL/Services/DebuggerService.cs

@ -27,7 +27,7 @@ namespace ICSharpCode.ILSpy.Debugger.Services @@ -27,7 +27,7 @@ namespace ICSharpCode.ILSpy.Debugger.Services
static IDebugger GetCompatibleDebugger()
{
return currentDebugger = new WindowsDebugger();
return currentDebugger;
}
/// <summary>
@ -39,6 +39,8 @@ namespace ICSharpCode.ILSpy.Debugger.Services @@ -39,6 +39,8 @@ namespace ICSharpCode.ILSpy.Debugger.Services
get {
if (currentDebugger == null) {
currentDebugger = GetCompatibleDebugger();
if (currentDebugger == null)
return null;
currentDebugger.DebugStarting += new EventHandler(OnDebugStarting);
currentDebugger.DebugStarted += new EventHandler(OnDebugStarted);
currentDebugger.DebugStopped += new EventHandler(OnDebugStopped);
@ -166,12 +168,12 @@ namespace ICSharpCode.ILSpy.Debugger.Services @@ -166,12 +168,12 @@ namespace ICSharpCode.ILSpy.Debugger.Services
}
}
public static void ToggleBreakpointAt(MemberReference member, int lineNumber, ILRange range, DecompiledLanguages language)
public static void ToggleBreakpointAt(MemberReference member, int lineNumber, int functionToken, ILRange range, DecompiledLanguages language)
{
BookmarkManager.ToggleBookmark(
member.FullName, lineNumber,
b => b.CanToggle && b is BreakpointBookmark,
location => new BreakpointBookmark(member, location, range, BreakpointAction.Break, language));
location => new BreakpointBookmark(member, location, functionToken, range, BreakpointAction.Break, language));
}
/* TODO: reimplement this stuff
@ -187,10 +189,9 @@ namespace ICSharpCode.ILSpy.Debugger.Services @@ -187,10 +189,9 @@ namespace ICSharpCode.ILSpy.Debugger.Services
CurrentLineBookmark.Remove();
}
public static void JumpToCurrentLine(MemberReference memberReference, int startLine, int startColumn, int endLine, int endColumn)
public static void JumpToCurrentLine(MemberReference memberReference, int startLine, int startColumn, int endLine, int endColumn, int ilOffset)
{
CurrentLineBookmark.SetPosition(memberReference, startLine, startColumn, endLine, endColumn);
MainWindow.Instance.TextView.UnfoldAndScroll(startLine);
CurrentLineBookmark.SetPosition(memberReference, startLine, startColumn, endLine, endColumn, ilOffset);
}
#region Tool tips
@ -200,7 +201,7 @@ namespace ICSharpCode.ILSpy.Debugger.Services @@ -200,7 +201,7 @@ namespace ICSharpCode.ILSpy.Debugger.Services
/// showing its current value (when in debugging mode) can be returned
/// through the ToolTipRequestEventArgs.SetTooltip() method.
/// </summary>
internal static void HandleToolTipRequest(ToolTipRequestEventArgs e)
public static void HandleToolTipRequest(ToolTipRequestEventArgs e)
{
if (!e.InDocument)
return;
@ -386,5 +387,10 @@ namespace ICSharpCode.ILSpy.Debugger.Services @@ -386,5 +387,10 @@ namespace ICSharpCode.ILSpy.Debugger.Services
// return text.ToString();
// }
#endregion
public static void SetDebugger(Lazy<IDebugger> debugger)
{
currentDebugger = debugger.Value;
}
}
}

0
Debugger/ILSpy.Debugger/Services/Debugger/IDebugger.cs → ILSpy.SharpDevelop.LGPL/Services/IDebugger.cs

11
Debugger/ILSpy.Debugger/Services/ParserService/ParserService.cs → ILSpy.SharpDevelop.LGPL/Services/ParserService.cs

@ -15,7 +15,7 @@ namespace ICSharpCode.ILSpy.Debugger.Services @@ -15,7 +15,7 @@ namespace ICSharpCode.ILSpy.Debugger.Services
static ParserService()
{
mySet.AddRange((new [] {
mySet.AddRange((new string [] {
".",
"{",
"}",
@ -41,7 +41,14 @@ namespace ICSharpCode.ILSpy.Debugger.Services @@ -41,7 +41,14 @@ namespace ICSharpCode.ILSpy.Debugger.Services
@"\t",
@"\r",
"|"
}).AsReadOnly());
}));
}
static void AddRange<T>(this ICollection<T> list, IEnumerable<T> items)
{
foreach (T item in items)
if (!list.Contains(item))
list.Add(item);
}
/// <summary>

4
ILSpy/AboutPage.cs

@ -183,7 +183,9 @@ namespace ICSharpCode.ILSpy @@ -183,7 +183,9 @@ namespace ICSharpCode.ILSpy
{
var tcs = new TaskCompletionSource<AvailableVersionInfo>();
WebClient wc = new WebClient();
wc.UseDefaultCredentials = true;
IWebProxy systemWebProxy = WebRequest.GetSystemWebProxy();
systemWebProxy.Credentials = CredentialCache.DefaultCredentials;
wc.Proxy = systemWebProxy;
wc.DownloadDataCompleted += delegate(object sender, DownloadDataCompletedEventArgs e) {
if (e.Error != null) {
tcs.SetException(e.Error);

10
ILSpy/App.xaml.cs

@ -17,16 +17,16 @@ @@ -17,16 +17,16 @@
// DEALINGS IN THE SOFTWARE.
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition.Hosting;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading;
using System.Windows;
using System.Windows.Documents;
using System.Windows.Navigation;
using System.Windows.Threading;
using ICSharpCode.ILSpy.Debugger.Services;
using ICSharpCode.ILSpy.TextView;
namespace ICSharpCode.ILSpy
@ -73,6 +73,12 @@ namespace ICSharpCode.ILSpy @@ -73,6 +73,12 @@ namespace ICSharpCode.ILSpy
EventManager.RegisterClassHandler(typeof(Window),
Hyperlink.RequestNavigateEvent,
new RequestNavigateEventHandler(Window_RequestNavigate));
try {
DebuggerService.SetDebugger(compositionContainer.GetExport<IDebugger>());
} catch {
// unable to find a IDebugger
}
}
string FullyQualifyPath(string argument)

9
ILSpy/TextView/AvalonEditTextOutput.cs

@ -36,6 +36,8 @@ namespace ICSharpCode.ILSpy.TextView @@ -36,6 +36,8 @@ namespace ICSharpCode.ILSpy.TextView
sealed class ReferenceSegment : TextSegment
{
public object Reference;
public bool IsLocal;
public bool IsLocalTarget;
}
/// <summary>
@ -204,17 +206,20 @@ namespace ICSharpCode.ILSpy.TextView @@ -204,17 +206,20 @@ namespace ICSharpCode.ILSpy.TextView
public void WriteDefinition(string text, object definition)
{
WriteIndent();
int start = this.TextLength;
b.Append(text);
int end = this.TextLength;
this.DefinitionLookup.AddDefinition(definition, this.TextLength);
references.Add(new ReferenceSegment { StartOffset = start, EndOffset = end, Reference = definition, IsLocal = true, IsLocalTarget = true });
}
public void WriteReference(string text, object reference)
public void WriteReference(string text, object reference, bool isLocal)
{
WriteIndent();
int start = this.TextLength;
b.Append(text);
int end = this.TextLength;
references.Add(new ReferenceSegment { StartOffset = start, EndOffset = end, Reference = reference });
references.Add(new ReferenceSegment { StartOffset = start, EndOffset = end, Reference = reference, IsLocal = isLocal });
}
public void MarkFoldStart(string collapsedText, bool defaultCollapsed)

32
ILSpy/TextView/DecompilerTextView.cs

@ -29,6 +29,7 @@ using System.Windows; @@ -29,6 +29,7 @@ using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Threading;
using System.Xml;
@ -45,6 +46,7 @@ using ICSharpCode.ILSpy.AvalonEdit; @@ -45,6 +46,7 @@ using ICSharpCode.ILSpy.AvalonEdit;
using ICSharpCode.ILSpy.Bookmarks;
using ICSharpCode.ILSpy.Debugger;
using ICSharpCode.ILSpy.Debugger.Bookmarks;
using ICSharpCode.ILSpy.Debugger.Services;
using ICSharpCode.ILSpy.Options;
using ICSharpCode.ILSpy.TreeNodes;
using ICSharpCode.ILSpy.XmlDoc;
@ -68,11 +70,13 @@ namespace ICSharpCode.ILSpy.TextView @@ -68,11 +70,13 @@ namespace ICSharpCode.ILSpy.TextView
ILSpyTreeNode[] decompiledNodes;
DefinitionLookup definitionLookup;
TextSegmentCollection<ReferenceSegment> references;
CancellationTokenSource currentCancellationTokenSource;
internal readonly IconBarManager manager;
readonly IconBarMargin iconMargin;
readonly TextMarkerService textMarkerService;
readonly List<ITextMarker> localReferenceMarks = new List<ITextMarker>();
[ImportMany(typeof(ITextEditorListener))]
IEnumerable<ITextEditorListener> textEditorListeners = null;
@ -316,6 +320,7 @@ namespace ICSharpCode.ILSpy.TextView @@ -316,6 +320,7 @@ namespace ICSharpCode.ILSpy.TextView
Debug.WriteLine("Showing {0} characters of output", textOutput.TextLength);
Stopwatch w = Stopwatch.StartNew();
ClearLocalReferenceMarks();
textEditor.ScrollToHome();
if (foldingManager != null) {
FoldingManager.Uninstall(foldingManager);
@ -324,6 +329,7 @@ namespace ICSharpCode.ILSpy.TextView @@ -324,6 +329,7 @@ namespace ICSharpCode.ILSpy.TextView
textEditor.Document = null; // clear old document while we're changing the highlighting
uiElementGenerator.UIElements = textOutput.UIElements;
referenceElementGenerator.References = textOutput.References;
references = textOutput.References;
definitionLookup = textOutput.DefinitionLookup;
textEditor.SyntaxHighlighting = highlighting;
@ -447,7 +453,7 @@ namespace ICSharpCode.ILSpy.TextView @@ -447,7 +453,7 @@ namespace ICSharpCode.ILSpy.TextView
iconMargin.SyncBookmarks();
if (isDecompilationOk) {
if (DebugInformation.DebugStepInformation != null) {
if (DebugInformation.DebugStepInformation != null && DebuggerService.CurrentDebugger != null) {
// repaint bookmarks
iconMargin.InvalidateVisual();
@ -462,7 +468,7 @@ namespace ICSharpCode.ILSpy.TextView @@ -462,7 +468,7 @@ namespace ICSharpCode.ILSpy.TextView
DebugInformation.CodeMappings[token].GetInstructionByTokenAndOffset(token, ilOffset, out member, out line);
// update marker
CurrentLineBookmark.SetPosition(member, line, 0, line, 0);
DebuggerService.JumpToCurrentLine(member, line, 0, line, 0, ilOffset);
var bm = CurrentLineBookmark.Instance;
DocumentLine docline = textEditor.Document.GetLineByNumber(line);
@ -524,7 +530,6 @@ namespace ICSharpCode.ILSpy.TextView @@ -524,7 +530,6 @@ namespace ICSharpCode.ILSpy.TextView
void DecompileNodes(DecompilationContext context, ITextOutput textOutput)
{
// reset data
DebugInformation.OldCodeMappings = DebugInformation.CodeMappings;
DebugInformation.CodeMappings = null;
DebugInformation.LocalVariables = null;
DebugInformation.DecompiledMemberReferences = null;
@ -608,6 +613,19 @@ namespace ICSharpCode.ILSpy.TextView @@ -608,6 +613,19 @@ namespace ICSharpCode.ILSpy.TextView
internal void JumpToReference(ReferenceSegment referenceSegment)
{
object reference = referenceSegment.Reference;
if (referenceSegment.IsLocal) {
ClearLocalReferenceMarks();
if (references != null) {
foreach (var r in references) {
if (r.Reference == reference) {
var mark = textMarkerService.Create(r.StartOffset, r.Length);
mark.BackgroundColor = r.IsLocalTarget ? Colors.LightSeaGreen : Colors.GreenYellow;
localReferenceMarks.Add(mark);
}
}
}
return;
}
if (definitionLookup != null) {
int pos = definitionLookup.GetDefinitionPosition(reference);
if (pos >= 0) {
@ -624,6 +642,14 @@ namespace ICSharpCode.ILSpy.TextView @@ -624,6 +642,14 @@ namespace ICSharpCode.ILSpy.TextView
MainWindow.Instance.JumpToReference(reference);
}
void ClearLocalReferenceMarks()
{
foreach (var mark in localReferenceMarks) {
textMarkerService.Remove(mark);
}
localReferenceMarks.Clear();
}
/// <summary>
/// Filters all ReferenceSegments that are no real links.
/// </summary>

3
ILSpy/TextView/ReferenceElementGenerator.cs

@ -102,7 +102,7 @@ namespace ICSharpCode.ILSpy.TextView @@ -102,7 +102,7 @@ namespace ICSharpCode.ILSpy.TextView
protected override void OnQueryCursor(QueryCursorEventArgs e)
{
e.Handled = true;
e.Cursor = Cursors.Hand;
e.Cursor = referenceSegment.IsLocal ? Cursors.Arrow : Cursors.Hand;
}
/// <inheritdoc/>
@ -110,6 +110,7 @@ namespace ICSharpCode.ILSpy.TextView @@ -110,6 +110,7 @@ namespace ICSharpCode.ILSpy.TextView
{
if (e.ChangedButton == MouseButton.Left && !e.Handled) {
parent.JumpToReference(referenceSegment);
if(!referenceSegment.IsLocal)
e.Handled = true;
}
}

8
ILSpy/TreeNodes/EventTreeNode.cs

@ -108,6 +108,14 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -108,6 +108,14 @@ namespace ICSharpCode.ILSpy.TreeNodes
language.DecompileEvent(ev, output, options);
}
public override bool IsPublicAPI {
get {
MethodDefinition accessor = ev.AddMethod ?? ev.RemoveMethod;
return accessor != null && (accessor.IsPublic || accessor.IsFamilyOrAssembly || accessor.IsFamily);
}
}
MemberReference IMemberTreeNode.Member
{
get { return ev; }

6
ILSpy/TreeNodes/FieldTreeNode.cs

@ -113,6 +113,12 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -113,6 +113,12 @@ namespace ICSharpCode.ILSpy.TreeNodes
language.DecompileField(field, output, options);
}
public override bool IsPublicAPI {
get {
return field.IsPublic || field.IsFamily || field.IsFamilyOrAssembly;
}
}
MemberReference IMemberTreeNode.Member
{
get { return field; }

13
ILSpy/TreeNodes/ILSpyTreeNode.cs

@ -166,5 +166,18 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -166,5 +166,18 @@ namespace ICSharpCode.ILSpy.TreeNodes
ApplyFilterToChild(node);
}
}
public virtual bool IsPublicAPI {
get { return true; }
}
public override System.Windows.Media.Brush Foreground {
get {
if (IsPublicAPI)
return base.Foreground;
else
return System.Windows.SystemColors.GrayTextBrush;
}
}
}
}

6
ILSpy/TreeNodes/MethodTreeNode.cs

@ -137,6 +137,12 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -137,6 +137,12 @@ namespace ICSharpCode.ILSpy.TreeNodes
return FilterResult.Hidden;
}
public override bool IsPublicAPI {
get {
return method.IsPublic || method.IsFamily || method.IsFamilyOrAssembly;
}
}
MemberReference IMemberTreeNode.Member
{
get { return method; }

13
ILSpy/TreeNodes/PropertyTreeNode.cs

@ -149,6 +149,19 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -149,6 +149,19 @@ namespace ICSharpCode.ILSpy.TreeNodes
language.DecompileProperty(property, output, options);
}
public override bool IsPublicAPI {
get {
switch (GetAttributesOfMostAccessibleMethod(property) & MethodAttributes.MemberAccessMask) {
case MethodAttributes.Public:
case MethodAttributes.Family:
case MethodAttributes.FamORAssem:
return true;
default:
return false;
}
}
}
MemberReference IMemberTreeNode.Member
{
get { return property; }

2
ILSpy/TreeNodes/TypeTreeNode.cs

@ -62,7 +62,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -62,7 +62,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
get { return HighlightSearchMatch(this.Language.FormatTypeName(type)); }
}
public bool IsPublicAPI {
public override bool IsPublicAPI {
get {
switch (type.Attributes & TypeAttributes.VisibilityMask) {
case TypeAttributes.Public:

41
ILSpy/XmlDoc/XmlDocKeyProvider.cs

@ -90,20 +90,7 @@ namespace ICSharpCode.ILSpy.XmlDoc @@ -90,20 +90,7 @@ namespace ICSharpCode.ILSpy.XmlDoc
}
if (type is GenericInstanceType) {
GenericInstanceType giType = (GenericInstanceType)type;
if (type.DeclaringType != null) {
AppendTypeName(b, type.DeclaringType);
b.Append('.');
} else if (!string.IsNullOrEmpty(type.Namespace)) {
b.Append(type.Namespace);
b.Append('.');
}
b.Append(NRefactory.TypeSystem.ReflectionHelper.SplitTypeParameterCountFromReflectionName(type.Name));
b.Append('{');
for (int i = 0; i < giType.GenericArguments.Count; i++) {
if (i > 0) b.Append(',');
AppendTypeName(b, giType.GenericArguments[i]);
}
b.Append('}');
AppendTypeNameWithArguments(b, giType.ElementType, giType.GenericArguments);
} else if (type is TypeSpecification) {
AppendTypeName(b, ((TypeSpecification)type).ElementType);
ArrayType arrayType = type as ArrayType;
@ -146,6 +133,32 @@ namespace ICSharpCode.ILSpy.XmlDoc @@ -146,6 +133,32 @@ namespace ICSharpCode.ILSpy.XmlDoc
}
}
}
static int AppendTypeNameWithArguments(StringBuilder b, TypeReference type, IList<TypeReference> genericArguments)
{
int outerTypeParameterCount = 0;
if (type.DeclaringType != null) {
TypeReference declType = type.DeclaringType;
outerTypeParameterCount = AppendTypeNameWithArguments(b, declType, genericArguments);
b.Append('.');
} else if (!string.IsNullOrEmpty(type.Namespace)) {
b.Append(type.Namespace);
b.Append('.');
}
int localTypeParameterCount = 0;
b.Append(NRefactory.TypeSystem.ReflectionHelper.SplitTypeParameterCountFromReflectionName(type.Name, out localTypeParameterCount));
if (localTypeParameterCount > 0) {
int totalTypeParameterCount = outerTypeParameterCount + localTypeParameterCount;
b.Append('{');
for (int i = outerTypeParameterCount; i < totalTypeParameterCount && i < genericArguments.Count; i++) {
if (i > outerTypeParameterCount) b.Append(',');
AppendTypeName(b, genericArguments[i]);
}
b.Append('}');
}
return outerTypeParameterCount + localTypeParameterCount;
}
#endregion
#region FindMemberByKey

3
ILSpy/XmlDoc/XmlDocLoader.cs

@ -99,6 +99,9 @@ namespace ICSharpCode.ILSpy.XmlDoc @@ -99,6 +99,9 @@ namespace ICSharpCode.ILSpy.XmlDoc
static string LookupLocalizedXmlDoc(string fileName)
{
if (string.IsNullOrEmpty(fileName))
return null;
string xmlFileName = Path.ChangeExtension(fileName, ".xml");
string currentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture.TwoLetterISOLanguageName;
string localizedXmlDocFile = GetLocalizedName(xmlFileName, currentCulture);

5
SharpTreeView/SharpTreeNode.cs

@ -12,6 +12,7 @@ using System.Collections.ObjectModel; @@ -12,6 +12,7 @@ using System.Collections.ObjectModel;
using System.Windows.Controls;
using System.Collections.Specialized;
using System.Windows.Input;
using System.Windows.Media;
namespace ICSharpCode.TreeView
{
@ -101,6 +102,10 @@ namespace ICSharpCode.TreeView @@ -101,6 +102,10 @@ namespace ICSharpCode.TreeView
get { return null; }
}
public virtual Brush Foreground {
get { return SystemColors.WindowTextBrush; }
}
public virtual object Icon
{
get { return null; }

4
SharpTreeView/Themes/Generic.xaml

@ -181,6 +181,7 @@ @@ -181,6 +181,7 @@
<Border Background="Transparent">
<Border Background="{TemplateBinding Background}">
<Default:SharpTreeNodeView Name="nodeView"
Foreground="{Binding Foreground}"
HorizontalAlignment="Left" />
</Border>
</Border>
@ -210,7 +211,8 @@ @@ -210,7 +211,8 @@
</MultiTrigger>-->
<Trigger Property="IsEnabled"
Value="False">
<Setter Property="Foreground"
<Setter TargetName="nodeView"
Property="Foreground"
Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
</Trigger>
</ControlTemplate.Triggers>

Loading…
Cancel
Save