BreakPointCollection.cs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. using Esprima;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. namespace Jint.Runtime.Debugger
  5. {
  6. public class BreakPointCollection : ICollection<BreakPoint>
  7. {
  8. private readonly List<BreakPoint> _breakPoints = new List<BreakPoint>();
  9. public BreakPointCollection()
  10. {
  11. }
  12. public int Count => _breakPoints.Count;
  13. public bool IsReadOnly => false;
  14. public void Add(BreakPoint breakPoint)
  15. {
  16. _breakPoints.Add(breakPoint);
  17. }
  18. public bool Remove(BreakPoint breakPoint)
  19. {
  20. return _breakPoints.Remove(breakPoint);
  21. }
  22. public void Clear()
  23. {
  24. _breakPoints.Clear();
  25. }
  26. public bool Contains(BreakPoint item)
  27. {
  28. return _breakPoints.Contains(item);
  29. }
  30. public void CopyTo(BreakPoint[] array, int arrayIndex)
  31. {
  32. _breakPoints.CopyTo(array, arrayIndex);
  33. }
  34. public IEnumerator<BreakPoint> GetEnumerator()
  35. {
  36. return _breakPoints.GetEnumerator();
  37. }
  38. IEnumerator IEnumerable.GetEnumerator()
  39. {
  40. return _breakPoints.GetEnumerator();
  41. }
  42. internal BreakPoint FindMatch(Engine engine, Location location)
  43. {
  44. foreach (var breakPoint in _breakPoints)
  45. {
  46. if (breakPoint.Source != null)
  47. {
  48. if (breakPoint.Source != location.Source)
  49. {
  50. continue;
  51. }
  52. }
  53. bool afterStart = breakPoint.Line == location.Start.Line &&
  54. breakPoint.Column >= location.Start.Column;
  55. if (!afterStart)
  56. {
  57. continue;
  58. }
  59. bool beforeEnd = breakPoint.Line < location.End.Line
  60. || (breakPoint.Line == location.End.Line &&
  61. breakPoint.Column <= location.End.Column);
  62. if (!beforeEnd)
  63. {
  64. continue;
  65. }
  66. if (!string.IsNullOrEmpty(breakPoint.Condition))
  67. {
  68. var completionValue = engine.Evaluate(breakPoint.Condition);
  69. if (!completionValue.AsBoolean())
  70. {
  71. continue;
  72. }
  73. }
  74. return breakPoint;
  75. }
  76. return null;
  77. }
  78. }
  79. }