module.go 787 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. package module
  2. import (
  3. "fmt"
  4. "fw/cp/node"
  5. "fw/cp/object"
  6. "ypk/assert"
  7. )
  8. type Module struct {
  9. Enter node.Node
  10. Objects map[node.Node][]object.Object
  11. Nodes []node.Node
  12. Types map[node.Node][]object.ComplexType
  13. }
  14. type named interface {
  15. Name() string
  16. }
  17. func (m *Module) TypeByName(scope node.Node, name string) (ret object.ComplexType) {
  18. assert.For(name != "", 20)
  19. for _, typ := range m.Types[scope] {
  20. fmt.Print(typ)
  21. if v, ok := typ.(named); ok && v.Name() == name {
  22. ret = typ
  23. break //стыд какой
  24. }
  25. }
  26. return ret
  27. }
  28. func (m *Module) NodeByObject(obj object.Object) (ret node.Node) {
  29. assert.For(obj != nil, 20)
  30. for i := 0; (i < len(m.Nodes)) && (ret == nil); i++ {
  31. node := m.Nodes[i]
  32. if node.Object() == obj {
  33. ret = node
  34. }
  35. }
  36. return ret
  37. }