123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- package module
- import (
- "fmt"
- "fw/cp/node"
- "fw/cp/object"
- "reflect"
- "ypk/assert"
- "ypk/halt"
- )
- type Import struct {
- Name string
- Objects []object.Object
- Types []object.ComplexType
- }
- type Module struct {
- Name string
- Enter node.Node
- Objects map[node.Node][]object.Object
- Nodes []node.Node
- Types map[node.Node][]object.ComplexType
- Imports map[string]Import
- }
- type named interface {
- Name() string
- }
- func (m *Module) ObjectByName(scope node.Node, name string) (rl []object.Object) {
- assert.For(name != "", 20)
- find := func(v []object.Object) (ret []object.Object) {
- for _, o := range v {
- if o.Name() == name {
- ret = append(ret, o)
- }
- //fmt.Println(o.Name(), name, o.Name() == name)
- }
- return ret
- }
- if scope == nil {
- for _, v := range m.Objects {
- rl = append(rl, find(v)...)
- }
- } else {
- rl = find(m.Objects[scope])
- }
- return rl
- }
- func (m *Module) TypeByName(scope node.Node, name string) (ret object.ComplexType) {
- assert.For(name != "", 20)
- for _, typ := range m.Types[scope] {
- fmt.Print(typ)
- if v, ok := typ.(named); ok && v.Name() == name {
- ret = typ
- break //стыд какой
- }
- }
- return ret
- }
- func (m *Module) ImportOf(obj object.Object) string {
- contains := func(v []object.Object) bool {
- for _, o := range v {
- if o == obj {
- return true
- }
- }
- return false
- }
- for _, v := range m.Imports {
- if contains(v.Objects) {
- return v.Name
- }
- }
- return ""
- }
- func (m *Module) NodeByObject(obj object.Object) (ret []node.Node) {
- assert.For(obj != nil, 20)
- for i := 0; (i < len(m.Nodes)) && (ret == nil); i++ {
- node := m.Nodes[i]
- if node.Object() == obj {
- ret = append(ret, node)
- }
- }
- return ret
- }
- func (m *Module) Init() {
- for k, s := range m.Types {
- q := ""
- if m.Enter.Adr() == k.Adr() {
- q = m.Name
- } else {
- switch e := k.(type) {
- case node.EnterNode:
- fmt.Println(e.Adr(), e.Enter())
- default:
- halt.As(100, reflect.TypeOf(e))
- }
- }
- for _, t := range s {
- t.Qualident(q)
- }
- }
- for i, s := range m.Imports {
- for _, t := range s.Types {
- fmt.Println(i, t)
- }
- }
- }
|