123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- package module
- import (
- "fw/cp"
- "fw/cp/constant/enter"
- "fw/cp/node"
- "fw/cp/object"
- "reflect"
- "strconv"
- "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) ImportOfType(obj object.ComplexType) string {
- contains := func(v []object.ComplexType) bool {
- for _, o := range v {
- if o.Adr() == obj.Adr() {
- return true
- }
- }
- return false
- }
- for _, v := range m.Imports {
- if contains(v.Types) {
- 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() != nil {
- if node.Object().Adr(0, 0) == obj.Adr() {
- ret = append(ret, node)
- }
- }
- }
- return ret
- }
- func (m *Module) Init(inittd ...func(t object.ComplexType)) {
- typeName := func(id cp.ID) string {
- for _, s := range m.Objects {
- for _, o := range s {
- switch t := o.(type) {
- case object.TypeObject:
- if o.Complex().Adr() == id {
- return t.Name()
- }
- }
- }
- }
- for _, i := range m.Imports {
- for _, o := range i.Objects {
- switch t := o.(type) {
- case object.TypeObject:
- if o.Complex().Adr() == id {
- return ">" + i.Name + "." + t.Name()
- }
- }
- }
- }
- return strconv.Itoa(int(id))
- }
- //fmt.Println("init", m.Name)
- for k, s := range m.Types {
- q := ""
- switch e := k.(type) {
- case node.EnterNode:
- switch e.Enter() {
- case enter.MODULE:
- q = m.Name
- case enter.PROCEDURE:
- q = m.Name + "..." + e.Object().Name()
- }
- default:
- halt.As(100, reflect.TypeOf(e))
- }
- for _, t := range s {
- t.Qualident(q + "." + typeName(t.Adr()))
- }
- }
- for _, s := range m.Imports {
- q := s.Name
- for _, t := range s.Types {
- t.Qualident(q + "." + typeName(t.Adr()))
- }
- for _, o := range s.Objects {
- o.Imp(s.Name)
- }
- }
- if len(inittd) > 0 {
- for _, s := range m.Types {
- for _, t := range s {
- inittd[0](t)
- switch rec := t.(type) {
- case object.RecordType:
- for x := rec.Link(); x != nil; x = x.Link() {
- switch f := x.(type) {
- case object.FieldObject:
- f.TypeOf(rec)
- }
- }
- }
- }
- }
- }
- }
|