Browse Source

Annotate properties and events with the original method reference too

pull/260/head
jbevain 14 years ago
parent
commit
d55a61772a
  1. 26
      ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs

26
ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs

@ -958,30 +958,30 @@ namespace ICSharpCode.Decompiler.Ast
if (cecilMethodDef != null) { if (cecilMethodDef != null) {
if (cecilMethodDef.IsGetter && methodArgs.Count == 0) { if (cecilMethodDef.IsGetter && methodArgs.Count == 0) {
foreach (var prop in cecilMethodDef.DeclaringType.Properties) { foreach (var prop in cecilMethodDef.DeclaringType.Properties) {
if (prop.GetMethod == cecilMethodDef) if (prop.GetMethod == cecilMethodDef)
return target.Member(prop.Name).WithAnnotation(prop); return target.Member(prop.Name).WithAnnotation(prop).WithAnnotation(cecilMethod);
} }
} else if (cecilMethodDef.IsGetter) { // with parameters } else if (cecilMethodDef.IsGetter) { // with parameters
PropertyDefinition indexer = GetIndexer(cecilMethodDef); PropertyDefinition indexer = GetIndexer(cecilMethodDef);
if (indexer != null) if (indexer != null)
return target.Indexer(methodArgs).WithAnnotation(indexer); return target.Indexer(methodArgs).WithAnnotation(indexer).WithAnnotation(cecilMethod);
} else if (cecilMethodDef.IsSetter && methodArgs.Count == 1) { } else if (cecilMethodDef.IsSetter && methodArgs.Count == 1) {
foreach (var prop in cecilMethodDef.DeclaringType.Properties) { foreach (var prop in cecilMethodDef.DeclaringType.Properties) {
if (prop.SetMethod == cecilMethodDef) if (prop.SetMethod == cecilMethodDef)
return new Ast.AssignmentExpression(target.Member(prop.Name).WithAnnotation(prop), methodArgs[0]); return new Ast.AssignmentExpression(target.Member(prop.Name).WithAnnotation(prop).WithAnnotation(cecilMethod), methodArgs[0]);
} }
} else if (cecilMethodDef.IsSetter && methodArgs.Count > 1) { } else if (cecilMethodDef.IsSetter && methodArgs.Count > 1) {
PropertyDefinition indexer = GetIndexer(cecilMethodDef); PropertyDefinition indexer = GetIndexer(cecilMethodDef);
if (indexer != null) if (indexer != null)
return new AssignmentExpression( return new AssignmentExpression(
target.Indexer(methodArgs.GetRange(0, methodArgs.Count - 1)).WithAnnotation(indexer), target.Indexer(methodArgs.GetRange(0, methodArgs.Count - 1)).WithAnnotation(indexer).WithAnnotation(cecilMethod),
methodArgs[methodArgs.Count - 1] methodArgs[methodArgs.Count - 1]
); );
} else if (cecilMethodDef.IsAddOn && methodArgs.Count == 1) { } else if (cecilMethodDef.IsAddOn && methodArgs.Count == 1) {
foreach (var ev in cecilMethodDef.DeclaringType.Events) { foreach (var ev in cecilMethodDef.DeclaringType.Events) {
if (ev.AddMethod == cecilMethodDef) { if (ev.AddMethod == cecilMethodDef) {
return new Ast.AssignmentExpression { return new Ast.AssignmentExpression {
Left = target.Member(ev.Name).WithAnnotation(ev), Left = target.Member(ev.Name).WithAnnotation(ev).WithAnnotation(cecilMethod),
Operator = AssignmentOperatorType.Add, Operator = AssignmentOperatorType.Add,
Right = methodArgs[0] Right = methodArgs[0]
}; };
@ -990,16 +990,16 @@ namespace ICSharpCode.Decompiler.Ast
} else if (cecilMethodDef.IsRemoveOn && methodArgs.Count == 1) { } else if (cecilMethodDef.IsRemoveOn && methodArgs.Count == 1) {
foreach (var ev in cecilMethodDef.DeclaringType.Events) { foreach (var ev in cecilMethodDef.DeclaringType.Events) {
if (ev.RemoveMethod == cecilMethodDef) { if (ev.RemoveMethod == cecilMethodDef) {
return new Ast.AssignmentExpression { return new Ast.AssignmentExpression {
Left = target.Member(ev.Name).WithAnnotation(ev), Left = target.Member(ev.Name).WithAnnotation(ev).WithAnnotation(cecilMethod),
Operator = AssignmentOperatorType.Subtract, Operator = AssignmentOperatorType.Subtract,
Right = methodArgs[0] Right = methodArgs[0]
}; };
} }
} }
} else if (cecilMethodDef.Name == "Invoke" && cecilMethodDef.DeclaringType.BaseType != null && cecilMethodDef.DeclaringType.BaseType.FullName == "System.MulticastDelegate") { } else if (cecilMethodDef.Name == "Invoke" && cecilMethodDef.DeclaringType.BaseType != null && cecilMethodDef.DeclaringType.BaseType.FullName == "System.MulticastDelegate") {
AdjustArgumentsForMethodCall(cecilMethod, methodArgs); AdjustArgumentsForMethodCall(cecilMethod, methodArgs);
return target.Invoke(methodArgs); return target.Invoke(methodArgs).WithAnnotation(cecilMethod);
} }
} }
// Default invocation // Default invocation

Loading…
Cancel
Save