assign.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package rules
  2. import (
  3. "fmt"
  4. "fw/cp/node"
  5. "fw/cp/statement"
  6. "fw/rt2/context"
  7. "fw/rt2/frame"
  8. "fw/rt2/nodeframe"
  9. "fw/rt2/scope"
  10. "reflect"
  11. )
  12. func assignSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  13. var fu nodeframe.FrameUtils
  14. a := fu.NodeOf(f)
  15. right := func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  16. switch a.Right().(type) {
  17. case node.ConstantNode:
  18. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  19. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  20. sc.Update(a.Left().Object(), func(interface{}) interface{} {
  21. return a.Right().(node.ConstantNode).Data()
  22. })
  23. return frame.End()
  24. }
  25. ret = frame.NOW
  26. case node.VariableNode:
  27. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  28. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  29. sc.Update(a.Left().Object(), func(interface{}) interface{} {
  30. return sc.Select(a.Right().Object())
  31. })
  32. return frame.End()
  33. }
  34. ret = frame.NOW
  35. case node.OperationNode, node.CallNode:
  36. fu.Push(fu.New(a.Right()), f)
  37. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  38. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  39. sc.Update(a.Left().Object(), func(interface{}) interface{} {
  40. return fu.DataOf(f)[a.Right()]
  41. })
  42. return frame.End()
  43. }
  44. ret = frame.LATER
  45. default:
  46. fmt.Println(reflect.TypeOf(a.Right()))
  47. panic("wrong right")
  48. }
  49. return seq, ret
  50. }
  51. switch a.(node.AssignNode).Statement() {
  52. case statement.ASSIGN:
  53. switch a.Left().(type) {
  54. case node.VariableNode, node.ParameterNode:
  55. seq, ret = right(f)
  56. default:
  57. fmt.Println(reflect.TypeOf(a.Left()))
  58. panic("wrong left")
  59. }
  60. default:
  61. panic("wrong statement")
  62. }
  63. return seq, ret
  64. }