module.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package module
  2. import (
  3. "fmt"
  4. "fw/cp/node"
  5. "fw/cp/object"
  6. "ypk/assert"
  7. )
  8. type Import struct {
  9. Name string
  10. Objects []object.Object
  11. }
  12. type Module struct {
  13. Name string
  14. Enter node.Node
  15. Objects map[node.Node][]object.Object
  16. Nodes []node.Node
  17. Types map[node.Node][]object.ComplexType
  18. Imports map[string]Import
  19. }
  20. type named interface {
  21. Name() string
  22. }
  23. func (m *Module) TypeByName(scope node.Node, name string) (ret object.ComplexType) {
  24. assert.For(name != "", 20)
  25. for _, typ := range m.Types[scope] {
  26. fmt.Print(typ)
  27. if v, ok := typ.(named); ok && v.Name() == name {
  28. ret = typ
  29. break //стыд какой
  30. }
  31. }
  32. return ret
  33. }
  34. func (m *Module) ImportOf(obj object.Object) string {
  35. contains := func(v []object.Object) bool {
  36. for _, o := range v {
  37. if o == obj {
  38. return true
  39. }
  40. }
  41. return false
  42. }
  43. for _, v := range m.Imports {
  44. if contains(v.Objects) {
  45. return v.Name
  46. }
  47. }
  48. return ""
  49. }
  50. func (m *Module) NodeByObject(obj object.Object) (ret []node.Node) {
  51. assert.For(obj != nil, 20)
  52. for i := 0; (i < len(m.Nodes)) && (ret == nil); i++ {
  53. node := m.Nodes[i]
  54. if node.Object() == obj {
  55. ret = append(ret, node)
  56. }
  57. }
  58. return ret
  59. }