PageRenderTime 47ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/Scripting/Parser/Construct/Expressions/Assignments.cs

http://github.com/polyethene/IronAHK
C# | 122 lines | 99 code | 23 blank | 0 comment | 37 complexity | 8ed9d57f7b969e5303d1742e4394dece MD5 | raw file
  1. using System.CodeDom;
  2. using System.Collections.Generic;
  3. namespace IronAHK.Scripting
  4. {
  5. partial class Parser
  6. {
  7. bool IsImplicitAssignment(List<object> parts, int i)
  8. {
  9. int x = i - 1, y = i + 1;
  10. if (!((parts[i] is string) && ((string)parts[i]).Length == 1 && ((string)parts[i])[0] == Equal))
  11. return false;
  12. if (x < 0 || !IsVarReference(parts[x]))
  13. return false;
  14. if (!(y < parts.Count && parts[y] is string && IsVariable((string)parts[y])))
  15. return false;
  16. int z = x - 1;
  17. if (z < 0)
  18. return true;
  19. if (IsVarAssignment(parts[z]))
  20. return true;
  21. if (!(parts[z] is Script.Operator) || (Script.Operator)parts[z] == Script.Operator.IdentityEquality)
  22. return false;
  23. return true;
  24. }
  25. void MergeAssignmentAt(List<object> parts, int i)
  26. {
  27. int x = i - 1, y = i + 1;
  28. bool right = y < parts.Count;
  29. if (parts[i] as CodeBinaryOperatorType? != CodeBinaryOperatorType.Assign)
  30. return;
  31. if (i > 0 && IsJsonObject(parts[x]))
  32. {
  33. MergeObjectAssignmentAt(parts, i);
  34. return;
  35. }
  36. else if (i > 0 && IsArrayExtension(parts[x]))
  37. {
  38. var extend = (CodeMethodInvokeExpression)parts[x];
  39. extend.Parameters.Add(right ? VarMixedExpr(parts[y]) : new CodePrimitiveExpression(null));
  40. if (right)
  41. parts.RemoveAt(y);
  42. parts.RemoveAt(i);
  43. return;
  44. }
  45. var assign = new CodeBinaryOperatorExpression { Operator = CodeBinaryOperatorType.Assign };
  46. parts[i] = assign;
  47. if (assign.Left != null)
  48. return;
  49. if (parts[x] is CodeBinaryOperatorExpression)
  50. {
  51. var binary = (CodeBinaryOperatorExpression)parts[x];
  52. assign.Left = (CodeArrayIndexerExpression)binary.Left;
  53. }
  54. else if (IsVarReference(parts[x]))
  55. assign.Left = (CodeArrayIndexerExpression)parts[x];
  56. else if (parts[x] is CodePropertyReferenceExpression)
  57. assign.Left = (CodePropertyReferenceExpression)parts[x];
  58. else
  59. assign.Left = VarId((CodeExpression)parts[x]);
  60. assign.Right = right ? VarMixedExpr(parts[y]) : new CodePrimitiveExpression(null);
  61. parts[x] = assign;
  62. if (right)
  63. parts.RemoveAt(y);
  64. parts.RemoveAt(i);
  65. }
  66. void MergeObjectAssignmentAt(List<object> parts, int i)
  67. {
  68. int x = i - 1, y = i + 1;
  69. var invoke = (CodeMethodInvokeExpression)parts[x];
  70. CodeExpression target = null;
  71. var step = new List<CodeExpression>();
  72. while (invoke.Parameters.Count == 2 && invoke.Method.MethodName == InternalMethods.Index.MethodName)
  73. {
  74. step.Add(invoke.Parameters[1]);
  75. if (invoke.Parameters[0] is CodeMethodInvokeExpression)
  76. invoke = (CodeMethodInvokeExpression)invoke.Parameters[0];
  77. else
  78. {
  79. target = invoke.Parameters[0];
  80. break;
  81. }
  82. }
  83. var set = (CodeMethodInvokeExpression)InternalMethods.SetObject;
  84. set.Parameters.Add(step[0]);
  85. step.RemoveAt(0);
  86. set.Parameters.Add(target);
  87. set.Parameters.Add(new CodeArrayCreateExpression(typeof(object), step.ToArray()));
  88. if (y < parts.Count)
  89. {
  90. set.Parameters.Add(VarMixedExpr(parts[y]));
  91. parts.RemoveAt(y);
  92. }
  93. else
  94. set.Parameters.Add(new CodePrimitiveExpression(null));
  95. parts.RemoveAt(i);
  96. parts[x] = set;
  97. }
  98. }
  99. }