/src/LinFu.AOP/MethodWeaverVisitor.cs

http://github.com/philiplaureano/LinFu · C# · 65 lines · 34 code · 7 blank · 24 comment · 1 complexity · 66d862484bc302b69b8969f6d7da12bc MD5 · raw file

  1. using LinFu.AOP.Cecil.Interfaces;
  2. using Mono.Cecil;
  3. namespace LinFu.AOP.Cecil
  4. {
  5. /// <summary>
  6. /// Represents a visitor class that can iterate over <see cref="MethodDefinition" />
  7. /// instances.
  8. /// </summary>
  9. public class MethodWeaverVisitor : BaseReflectionVisitor
  10. {
  11. private readonly IMethodWeaver _methodWeaver;
  12. /// <summary>
  13. /// Initializes a new instance of the MethodWeaverVisitor class.
  14. /// </summary>
  15. /// <param name="methodWeaver">The <see cref="IMethodWeaver" /> that will be used to modify a given type.</param>
  16. public MethodWeaverVisitor(IMethodWeaver methodWeaver)
  17. {
  18. _methodWeaver = methodWeaver;
  19. }
  20. /// <summary>
  21. /// Visits a <see cref="MethodDefinition" /> instance.
  22. /// </summary>
  23. /// <param name="ctor">The <see cref="MethodDefinition" /> instance that will be modified.</param>
  24. public override void VisitConstructor(MethodDefinition ctor)
  25. {
  26. VisitMethodDefinition(ctor);
  27. }
  28. /// <summary>
  29. /// Visits a <see cref="MethodDefinition" /> instance.
  30. /// </summary>
  31. /// <param name="method">The <see cref="MethodDefinition" /> instance that will be modified.</param>
  32. public override void VisitMethodDefinition(MethodDefinition method)
  33. {
  34. if (!_methodWeaver.ShouldWeave(method))
  35. return;
  36. _methodWeaver.Weave(method);
  37. base.VisitMethodDefinition(method);
  38. }
  39. /// <summary>
  40. /// Visits a <see cref="ModuleDefinition" /> instance.
  41. /// </summary>
  42. /// <param name="module">A <see cref="ModuleDefinition" /> object.</param>
  43. public override void VisitModuleDefinition(ModuleDefinition module)
  44. {
  45. _methodWeaver.ImportReferences(module);
  46. base.VisitModuleDefinition(module);
  47. }
  48. /// <summary>
  49. /// Visits a <see cref="TypeDefinition" /> instance.
  50. /// </summary>
  51. /// <param name="type">A <see cref="TypeDefinition" /> object.</param>
  52. public override void VisitTypeDefinition(TypeDefinition type)
  53. {
  54. _methodWeaver.AddAdditionalMembers(type);
  55. base.VisitTypeDefinition(type);
  56. }
  57. }
  58. }