/source/core/ast/Scope.ooc

http://github.com/nddrylliog/oc · Unknown · 61 lines · 48 code · 13 blank · 0 comment · 0 complexity · 515c2f648c6f4ef0c129e3b60cba0ec1 MD5 · raw file

  1. import structs/[ArrayList, List]
  2. import middle/Resolver
  3. import Node, Statement, Var, Access
  4. Scope: class extends Node {
  5. body: List<Statement> { get set }
  6. init: func {
  7. body = ArrayList<Statement> new()
  8. }
  9. resolve: func (task: Task) {
  10. task queueList(body)
  11. }
  12. resolveAccess: func (acc: Access, task: Task, suggest: Func (Var)) {
  13. idx : Int = -1
  14. //"Looking for %s in %s" printfln(acc toString(), toString())
  15. if(task has("noindex")) {
  16. size := body size
  17. idx = size
  18. } else {
  19. previous := task
  20. task walkBackwardTasks(|t|
  21. if(t node == this) {
  22. idx = previous get("index", Int)
  23. return true
  24. }
  25. previous = t
  26. false
  27. )
  28. if(idx == -1) return // not found, don't resolve
  29. }
  30. // idx + 1 to allow recursion, of course :)
  31. for(i in 0..(idx + 1)) {
  32. node := body[i]
  33. match (node class) {
  34. case Var =>
  35. v := node as Var
  36. if(v name == acc name)
  37. suggest(v)
  38. }
  39. }
  40. }
  41. accessResolver?: func -> Bool { true }
  42. add: func (s: Statement) {
  43. body add(s)
  44. }
  45. toString: func -> String {
  46. "{}"
  47. }
  48. }